chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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 (637) hide show
  1. chia/_tests/README.md +1 -1
  2. chia/_tests/blockchain/blockchain_test_utils.py +24 -26
  3. chia/_tests/blockchain/test_augmented_chain.py +6 -8
  4. chia/_tests/blockchain/test_blockchain.py +409 -307
  5. chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
  6. chia/_tests/blockchain/test_build_chains.py +11 -13
  7. chia/_tests/blockchain/test_get_block_generator.py +8 -8
  8. chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
  9. chia/_tests/build-init-files.py +3 -4
  10. chia/_tests/build-job-matrix.py +9 -9
  11. chia/_tests/check_sql_statements.py +2 -3
  12. chia/_tests/clvm/benchmark_costs.py +1 -1
  13. chia/_tests/clvm/coin_store.py +7 -5
  14. chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
  15. chia/_tests/clvm/test_condition_codes.py +2 -2
  16. chia/_tests/clvm/test_curry_and_treehash.py +2 -4
  17. chia/_tests/clvm/test_message_conditions.py +184 -0
  18. chia/_tests/clvm/test_puzzle_compression.py +1 -2
  19. chia/_tests/clvm/test_puzzle_drivers.py +3 -3
  20. chia/_tests/clvm/test_puzzles.py +13 -18
  21. chia/_tests/clvm/test_singletons.py +17 -17
  22. chia/_tests/clvm/test_spend_sim.py +7 -7
  23. chia/_tests/cmds/cmd_test_utils.py +42 -45
  24. chia/_tests/cmds/conftest.py +2 -2
  25. chia/_tests/cmds/test_click_types.py +21 -16
  26. chia/_tests/cmds/test_cmd_framework.py +255 -35
  27. chia/_tests/cmds/test_cmds_util.py +2 -2
  28. chia/_tests/cmds/test_daemon.py +3 -3
  29. chia/_tests/cmds/test_dev_gh.py +131 -0
  30. chia/_tests/cmds/test_farm_cmd.py +1 -2
  31. chia/_tests/cmds/test_show.py +6 -6
  32. chia/_tests/cmds/test_tx_config_args.py +2 -1
  33. chia/_tests/cmds/wallet/test_dao.py +23 -23
  34. chia/_tests/cmds/wallet/test_did.py +29 -29
  35. chia/_tests/cmds/wallet/test_nft.py +24 -23
  36. chia/_tests/cmds/wallet/test_notifications.py +8 -8
  37. chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
  38. chia/_tests/cmds/wallet/test_vcs.py +97 -73
  39. chia/_tests/cmds/wallet/test_wallet.py +74 -75
  40. chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
  41. chia/_tests/conftest.py +153 -38
  42. chia/_tests/connection_utils.py +7 -6
  43. chia/_tests/core/cmds/test_beta.py +3 -3
  44. chia/_tests/core/cmds/test_keys.py +6 -6
  45. chia/_tests/core/cmds/test_wallet.py +3 -3
  46. chia/_tests/core/consensus/test_block_creation.py +3 -5
  47. chia/_tests/core/custom_types/test_coin.py +1 -3
  48. chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
  49. chia/_tests/core/daemon/test_daemon.py +58 -58
  50. chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
  51. chia/_tests/core/data_layer/conftest.py +4 -3
  52. chia/_tests/core/data_layer/test_data_cli.py +1 -2
  53. chia/_tests/core/data_layer/test_data_layer.py +5 -5
  54. chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
  55. chia/_tests/core/data_layer/test_data_rpc.py +75 -93
  56. chia/_tests/core/data_layer/test_data_store.py +38 -37
  57. chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
  58. chia/_tests/core/data_layer/util.py +11 -10
  59. chia/_tests/core/farmer/test_farmer_api.py +6 -4
  60. chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
  61. chia/_tests/core/full_node/ram_db.py +2 -2
  62. chia/_tests/core/full_node/stores/test_block_store.py +113 -11
  63. chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
  64. chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
  65. chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
  66. chia/_tests/core/full_node/test_address_manager.py +2 -2
  67. chia/_tests/core/full_node/test_block_height_map.py +1 -1
  68. chia/_tests/core/full_node/test_conditions.py +10 -12
  69. chia/_tests/core/full_node/test_full_node.py +2077 -1822
  70. chia/_tests/core/full_node/test_generator_tools.py +4 -4
  71. chia/_tests/core/full_node/test_hint_management.py +2 -2
  72. chia/_tests/core/full_node/test_performance.py +2 -5
  73. chia/_tests/core/full_node/test_subscriptions.py +4 -4
  74. chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
  75. chia/_tests/core/make_block_generator.py +5 -7
  76. chia/_tests/core/mempool/test_mempool.py +205 -208
  77. chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
  78. chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
  79. chia/_tests/core/mempool/test_mempool_manager.py +109 -80
  80. chia/_tests/core/mempool/test_mempool_performance.py +3 -4
  81. chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
  82. chia/_tests/core/server/flood.py +6 -4
  83. chia/_tests/core/server/serve.py +10 -7
  84. chia/_tests/core/server/test_api_protocol.py +21 -0
  85. chia/_tests/core/server/test_capabilities.py +3 -5
  86. chia/_tests/core/server/test_dos.py +15 -16
  87. chia/_tests/core/server/test_loop.py +14 -10
  88. chia/_tests/core/server/test_node_discovery.py +1 -2
  89. chia/_tests/core/server/test_rate_limits.py +156 -44
  90. chia/_tests/core/server/test_server.py +8 -7
  91. chia/_tests/core/services/test_services.py +59 -37
  92. chia/_tests/core/ssl/test_ssl.py +5 -3
  93. chia/_tests/core/test_cost_calculation.py +5 -6
  94. chia/_tests/core/test_crawler.py +2 -2
  95. chia/_tests/core/test_db_conversion.py +5 -4
  96. chia/_tests/core/test_db_validation.py +6 -5
  97. chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
  98. chia/_tests/core/test_filter.py +3 -5
  99. chia/_tests/core/test_full_node_rpc.py +64 -90
  100. chia/_tests/core/test_merkle_set.py +10 -10
  101. chia/_tests/core/test_program.py +2 -4
  102. chia/_tests/core/test_rpc_util.py +1 -2
  103. chia/_tests/core/test_seeder.py +124 -12
  104. chia/_tests/core/util/test_block_cache.py +5 -5
  105. chia/_tests/core/util/test_cached_bls.py +3 -3
  106. chia/_tests/core/util/test_config.py +13 -13
  107. chia/_tests/core/util/test_files.py +2 -2
  108. chia/_tests/core/util/test_jsonify.py +9 -9
  109. chia/_tests/core/util/test_keychain.py +13 -5
  110. chia/_tests/core/util/test_keyring_wrapper.py +6 -5
  111. chia/_tests/core/util/test_log_exceptions.py +3 -3
  112. chia/_tests/core/util/test_streamable.py +38 -38
  113. chia/_tests/db/test_db_wrapper.py +13 -12
  114. chia/_tests/environments/common.py +2 -2
  115. chia/_tests/environments/full_node.py +2 -2
  116. chia/_tests/environments/wallet.py +109 -48
  117. chia/_tests/farmer_harvester/test_farmer.py +35 -35
  118. chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
  119. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  120. chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
  121. chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
  122. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
  123. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
  124. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
  125. chia/_tests/generator/test_compression.py +13 -30
  126. chia/_tests/generator/test_generator_types.py +3 -3
  127. chia/_tests/generator/test_rom.py +7 -9
  128. chia/_tests/plot_sync/test_delta.py +2 -3
  129. chia/_tests/plot_sync/test_plot_sync.py +25 -24
  130. chia/_tests/plot_sync/test_receiver.py +9 -9
  131. chia/_tests/plot_sync/test_sender.py +1 -1
  132. chia/_tests/plot_sync/test_sync_simulated.py +27 -26
  133. chia/_tests/plot_sync/util.py +2 -1
  134. chia/_tests/plotting/test_plot_manager.py +54 -11
  135. chia/_tests/plotting/util.py +2 -3
  136. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  137. chia/_tests/pools/test_pool_cmdline.py +993 -15
  138. chia/_tests/pools/test_pool_config.py +3 -5
  139. chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
  140. chia/_tests/pools/test_pool_rpc.py +203 -90
  141. chia/_tests/pools/test_pool_wallet.py +12 -8
  142. chia/_tests/pools/test_wallet_pool_store.py +3 -3
  143. chia/_tests/process_junit.py +16 -17
  144. chia/_tests/rpc/test_rpc_client.py +59 -2
  145. chia/_tests/rpc/test_rpc_server.py +183 -0
  146. chia/_tests/simulation/test_simulation.py +5 -5
  147. chia/_tests/simulation/test_simulator.py +8 -10
  148. chia/_tests/simulation/test_start_simulator.py +5 -4
  149. chia/_tests/timelord/test_new_peak.py +19 -19
  150. chia/_tests/tools/test_run_block.py +1 -2
  151. chia/_tests/tools/test_virtual_project.py +591 -0
  152. chia/_tests/util/benchmark_cost.py +9 -9
  153. chia/_tests/util/benchmarks.py +1 -2
  154. chia/_tests/util/blockchain.py +12 -11
  155. chia/_tests/util/blockchain_mock.py +15 -15
  156. chia/_tests/util/build_network_protocol_files.py +12 -12
  157. chia/_tests/util/db_connection.py +3 -2
  158. chia/_tests/util/full_sync.py +14 -6
  159. chia/_tests/util/gen_ssl_certs.py +4 -5
  160. chia/_tests/util/generator_tools_testing.py +5 -7
  161. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  162. chia/_tests/util/key_tool.py +2 -3
  163. chia/_tests/util/misc.py +59 -106
  164. chia/_tests/util/network_protocol_data.py +7 -9
  165. chia/_tests/util/protocol_messages_json.py +112 -111
  166. chia/_tests/util/rpc.py +3 -0
  167. chia/_tests/util/run_block.py +16 -16
  168. chia/_tests/util/setup_nodes.py +25 -23
  169. chia/{clvm → _tests/util}/spend_sim.py +59 -55
  170. chia/_tests/util/split_managers.py +12 -9
  171. chia/_tests/util/temp_file.py +1 -1
  172. chia/_tests/util/test_action_scope.py +2 -1
  173. chia/_tests/util/test_async_pool.py +8 -8
  174. chia/_tests/util/test_build_job_matrix.py +2 -3
  175. chia/_tests/util/test_condition_tools.py +4 -6
  176. chia/_tests/util/test_config.py +5 -5
  177. chia/_tests/util/test_dump_keyring.py +1 -1
  178. chia/_tests/util/test_full_block_utils.py +19 -11
  179. chia/_tests/util/test_limited_semaphore.py +4 -3
  180. chia/_tests/util/test_logging_filter.py +2 -3
  181. chia/_tests/util/test_misc.py +29 -28
  182. chia/_tests/util/test_network.py +32 -31
  183. chia/_tests/util/test_network_protocol_files.py +2 -3
  184. chia/_tests/util/test_network_protocol_json.py +1 -0
  185. chia/_tests/util/test_network_protocol_test.py +18 -19
  186. chia/_tests/util/test_paginator.py +3 -4
  187. chia/_tests/util/test_pprint.py +1 -1
  188. chia/_tests/util/test_priority_mutex.py +18 -17
  189. chia/_tests/util/test_recursive_replace.py +2 -2
  190. chia/_tests/util/test_testnet_overrides.py +3 -3
  191. chia/_tests/util/test_timing.py +1 -1
  192. chia/_tests/util/test_trusted_peer.py +2 -2
  193. chia/_tests/util/time_out_assert.py +43 -6
  194. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
  195. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
  196. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
  197. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
  198. chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
  199. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
  200. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
  201. chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
  202. chia/_tests/wallet/conftest.py +135 -74
  203. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
  204. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
  205. chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
  206. chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
  207. chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
  208. chia/_tests/wallet/did_wallet/test_did.py +1277 -474
  209. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
  210. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
  211. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
  212. chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
  213. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
  214. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
  215. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
  216. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
  217. chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
  218. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
  219. chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
  220. chia/_tests/wallet/test_address_type.py +20 -20
  221. chia/_tests/wallet/test_clvm_streamable.py +5 -5
  222. chia/_tests/wallet/test_coin_management.py +354 -0
  223. chia/_tests/wallet/test_coin_selection.py +34 -35
  224. chia/_tests/wallet/test_conditions.py +28 -16
  225. chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
  226. chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
  227. chia/_tests/wallet/test_nft_store.py +1 -2
  228. chia/_tests/wallet/test_notifications.py +2 -2
  229. chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
  230. chia/_tests/wallet/test_puzzle_store.py +2 -3
  231. chia/_tests/wallet/test_sign_coin_spends.py +3 -3
  232. chia/_tests/wallet/test_signer_protocol.py +33 -34
  233. chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
  234. chia/_tests/wallet/test_taproot.py +1 -1
  235. chia/_tests/wallet/test_transaction_store.py +23 -19
  236. chia/_tests/wallet/test_util.py +36 -32
  237. chia/_tests/wallet/test_wallet.py +37 -37
  238. chia/_tests/wallet/test_wallet_action_scope.py +8 -8
  239. chia/_tests/wallet/test_wallet_blockchain.py +4 -6
  240. chia/_tests/wallet/test_wallet_coin_store.py +34 -34
  241. chia/_tests/wallet/test_wallet_node.py +69 -72
  242. chia/_tests/wallet/test_wallet_retry.py +3 -3
  243. chia/_tests/wallet/test_wallet_state_manager.py +12 -5
  244. chia/_tests/wallet/test_wallet_trade_store.py +2 -2
  245. chia/_tests/wallet/test_wallet_utils.py +5 -4
  246. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
  247. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
  248. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
  249. chia/_tests/wallet/wallet_block_tools.py +27 -27
  250. chia/_tests/weight_proof/test_weight_proof.py +30 -30
  251. chia/apis.py +19 -0
  252. chia/cmds/beta.py +8 -7
  253. chia/cmds/beta_funcs.py +15 -11
  254. chia/cmds/check_wallet_db.py +29 -27
  255. chia/cmds/chia.py +17 -9
  256. chia/cmds/cmd_classes.py +87 -79
  257. chia/cmds/cmd_helpers.py +242 -0
  258. chia/cmds/cmds_util.py +56 -66
  259. chia/cmds/coin_funcs.py +168 -153
  260. chia/cmds/coins.py +156 -194
  261. chia/cmds/configure.py +4 -3
  262. chia/cmds/dao.py +89 -33
  263. chia/cmds/dao_funcs.py +55 -33
  264. chia/cmds/data.py +7 -6
  265. chia/cmds/data_funcs.py +26 -21
  266. chia/cmds/db.py +4 -3
  267. chia/cmds/db_backup_func.py +2 -2
  268. chia/cmds/db_upgrade_func.py +3 -3
  269. chia/cmds/db_validate_func.py +2 -2
  270. chia/cmds/dev.py +2 -0
  271. chia/cmds/farm.py +18 -5
  272. chia/cmds/farm_funcs.py +17 -24
  273. chia/cmds/gh.py +275 -0
  274. chia/cmds/init.py +4 -11
  275. chia/cmds/init_funcs.py +9 -9
  276. chia/cmds/installers.py +5 -3
  277. chia/cmds/keys.py +56 -39
  278. chia/cmds/keys_funcs.py +30 -31
  279. chia/cmds/netspace.py +6 -3
  280. chia/cmds/netspace_funcs.py +3 -2
  281. chia/cmds/param_types.py +16 -6
  282. chia/cmds/passphrase.py +8 -7
  283. chia/cmds/passphrase_funcs.py +7 -61
  284. chia/cmds/peer.py +2 -1
  285. chia/cmds/peer_funcs.py +5 -5
  286. chia/cmds/plotnft.py +207 -153
  287. chia/cmds/plotnft_funcs.py +205 -174
  288. chia/cmds/plots.py +14 -6
  289. chia/cmds/plotters.py +2 -1
  290. chia/cmds/rpc.py +48 -28
  291. chia/cmds/show.py +2 -1
  292. chia/cmds/show_funcs.py +7 -6
  293. chia/cmds/signer.py +50 -58
  294. chia/cmds/sim.py +22 -14
  295. chia/cmds/sim_funcs.py +11 -11
  296. chia/cmds/start.py +3 -3
  297. chia/cmds/start_funcs.py +9 -12
  298. chia/cmds/stop.py +4 -3
  299. chia/cmds/units.py +1 -3
  300. chia/cmds/wallet.py +252 -96
  301. chia/cmds/wallet_funcs.py +217 -143
  302. chia/consensus/block_body_validation.py +133 -86
  303. chia/consensus/block_creation.py +42 -21
  304. chia/consensus/block_header_validation.py +32 -37
  305. chia/consensus/block_record.py +1 -2
  306. chia/consensus/blockchain.py +167 -180
  307. chia/consensus/blockchain_interface.py +10 -10
  308. chia/consensus/constants.py +2 -2
  309. chia/consensus/default_constants.py +3 -4
  310. chia/consensus/difficulty_adjustment.py +5 -5
  311. chia/consensus/find_fork_point.py +5 -5
  312. chia/consensus/full_block_to_block_record.py +4 -4
  313. chia/consensus/get_block_challenge.py +2 -2
  314. chia/consensus/get_block_generator.py +4 -3
  315. chia/consensus/multiprocess_validation.py +207 -304
  316. chia/consensus/vdf_info_computation.py +3 -3
  317. chia/daemon/client.py +46 -27
  318. chia/daemon/keychain_proxy.py +10 -9
  319. chia/daemon/keychain_server.py +18 -18
  320. chia/daemon/server.py +103 -113
  321. chia/daemon/windows_signal.py +2 -2
  322. chia/data_layer/data_layer.py +64 -76
  323. chia/data_layer/data_layer_api.py +8 -0
  324. chia/data_layer/data_layer_errors.py +3 -3
  325. chia/data_layer/data_layer_server.py +2 -2
  326. chia/data_layer/data_layer_util.py +71 -71
  327. chia/data_layer/data_layer_wallet.py +63 -67
  328. chia/data_layer/data_store.py +72 -72
  329. chia/data_layer/dl_wallet_store.py +10 -10
  330. chia/data_layer/download_data.py +5 -5
  331. chia/data_layer/s3_plugin_service.py +9 -9
  332. chia/data_layer/util/benchmark.py +0 -1
  333. chia/data_layer/util/plugin.py +2 -3
  334. chia/farmer/farmer.py +46 -43
  335. chia/farmer/farmer_api.py +27 -21
  336. chia/full_node/block_height_map.py +6 -6
  337. chia/full_node/block_store.py +41 -35
  338. chia/full_node/coin_store.py +42 -41
  339. chia/full_node/fee_estimate.py +2 -2
  340. chia/full_node/fee_estimation.py +1 -2
  341. chia/full_node/fee_history.py +5 -6
  342. chia/full_node/fee_tracker.py +24 -24
  343. chia/full_node/full_node.py +574 -300
  344. chia/full_node/full_node_api.py +181 -130
  345. chia/full_node/full_node_store.py +43 -43
  346. chia/full_node/hint_management.py +4 -4
  347. chia/full_node/hint_store.py +9 -10
  348. chia/full_node/mempool.py +25 -19
  349. chia/full_node/mempool_check_conditions.py +11 -42
  350. chia/full_node/mempool_manager.py +48 -53
  351. chia/full_node/pending_tx_cache.py +9 -9
  352. chia/full_node/subscriptions.py +23 -24
  353. chia/full_node/sync_store.py +8 -7
  354. chia/full_node/tx_processing_queue.py +3 -3
  355. chia/full_node/util/__init__.py +0 -0
  356. chia/full_node/weight_proof.py +79 -78
  357. chia/harvester/harvester.py +9 -8
  358. chia/harvester/harvester_api.py +19 -13
  359. chia/introducer/introducer.py +7 -5
  360. chia/introducer/introducer_api.py +9 -3
  361. chia/legacy/keyring.py +6 -5
  362. chia/plot_sync/delta.py +8 -8
  363. chia/plot_sync/receiver.py +12 -11
  364. chia/plot_sync/sender.py +15 -12
  365. chia/plotters/bladebit.py +12 -12
  366. chia/plotters/chiapos.py +2 -2
  367. chia/plotters/madmax.py +8 -8
  368. chia/plotters/plotters.py +6 -6
  369. chia/plotters/plotters_util.py +6 -4
  370. chia/plotting/cache.py +8 -7
  371. chia/plotting/check_plots.py +8 -8
  372. chia/plotting/create_plots.py +6 -6
  373. chia/plotting/manager.py +22 -22
  374. chia/plotting/util.py +31 -19
  375. chia/pools/pool_config.py +7 -7
  376. chia/pools/pool_puzzles.py +16 -16
  377. chia/pools/pool_wallet.py +64 -57
  378. chia/pools/pool_wallet_info.py +3 -3
  379. chia/protocols/full_node_protocol.py +3 -3
  380. chia/protocols/harvester_protocol.py +12 -12
  381. chia/protocols/introducer_protocol.py +1 -2
  382. chia/protocols/protocol_message_types.py +4 -4
  383. chia/protocols/protocol_state_machine.py +2 -2
  384. chia/protocols/protocol_timing.py +1 -0
  385. chia/protocols/shared_protocol.py +3 -3
  386. chia/protocols/timelord_protocol.py +2 -2
  387. chia/protocols/wallet_protocol.py +33 -33
  388. chia/rpc/crawler_rpc_api.py +12 -7
  389. chia/rpc/data_layer_rpc_api.py +49 -44
  390. chia/rpc/data_layer_rpc_client.py +41 -41
  391. chia/rpc/data_layer_rpc_util.py +7 -11
  392. chia/rpc/farmer_rpc_api.py +32 -27
  393. chia/rpc/farmer_rpc_client.py +14 -14
  394. chia/rpc/full_node_rpc_api.py +53 -48
  395. chia/rpc/full_node_rpc_client.py +30 -30
  396. chia/rpc/harvester_rpc_api.py +16 -11
  397. chia/rpc/harvester_rpc_client.py +6 -6
  398. chia/rpc/rpc_client.py +34 -14
  399. chia/rpc/rpc_server.py +117 -43
  400. chia/rpc/timelord_rpc_api.py +9 -4
  401. chia/rpc/util.py +11 -211
  402. chia/rpc/wallet_request_types.py +276 -60
  403. chia/rpc/wallet_rpc_api.py +563 -399
  404. chia/rpc/wallet_rpc_client.py +220 -250
  405. chia/seeder/crawl_store.py +6 -8
  406. chia/seeder/crawler.py +23 -36
  407. chia/seeder/crawler_api.py +28 -22
  408. chia/seeder/dns_server.py +99 -50
  409. chia/seeder/start_crawler.py +13 -9
  410. chia/server/address_manager.py +19 -19
  411. chia/server/address_manager_store.py +17 -17
  412. chia/server/api_protocol.py +106 -1
  413. chia/server/capabilities.py +3 -3
  414. chia/server/chia_policy.py +17 -16
  415. chia/server/introducer_peers.py +3 -3
  416. chia/server/node_discovery.py +34 -38
  417. chia/server/rate_limit_numbers.py +26 -16
  418. chia/server/rate_limits.py +67 -27
  419. chia/server/server.py +52 -31
  420. chia/server/signal_handlers.py +6 -3
  421. chia/server/ssl_context.py +5 -5
  422. chia/server/start_data_layer.py +37 -23
  423. chia/server/start_farmer.py +28 -16
  424. chia/server/start_full_node.py +29 -23
  425. chia/server/start_harvester.py +28 -15
  426. chia/server/start_introducer.py +27 -15
  427. chia/server/start_service.py +17 -29
  428. chia/server/start_timelord.py +25 -18
  429. chia/server/start_wallet.py +22 -18
  430. chia/server/upnp.py +4 -3
  431. chia/server/ws_connection.py +68 -54
  432. chia/simulator/add_blocks_in_batches.py +54 -0
  433. chia/simulator/block_tools.py +65 -64
  434. chia/simulator/full_node_simulator.py +66 -74
  435. chia/simulator/setup_services.py +10 -9
  436. chia/simulator/simulator_full_node_rpc_api.py +12 -14
  437. chia/simulator/simulator_full_node_rpc_client.py +3 -5
  438. chia/simulator/simulator_test_tools.py +8 -7
  439. chia/simulator/socket.py +1 -4
  440. chia/simulator/ssl_certs.py +5 -5
  441. chia/simulator/ssl_certs_1.py +2 -4
  442. chia/simulator/ssl_certs_10.py +2 -4
  443. chia/simulator/ssl_certs_2.py +2 -4
  444. chia/simulator/ssl_certs_3.py +2 -4
  445. chia/simulator/ssl_certs_4.py +2 -4
  446. chia/simulator/ssl_certs_5.py +2 -4
  447. chia/simulator/ssl_certs_6.py +2 -4
  448. chia/simulator/ssl_certs_7.py +2 -4
  449. chia/simulator/ssl_certs_8.py +2 -4
  450. chia/simulator/ssl_certs_9.py +2 -4
  451. chia/simulator/start_simulator.py +14 -6
  452. chia/simulator/wallet_tools.py +21 -20
  453. chia/ssl/create_ssl.py +11 -11
  454. chia/timelord/iters_from_block.py +2 -2
  455. chia/timelord/timelord.py +57 -33
  456. chia/timelord/timelord_api.py +12 -6
  457. chia/timelord/timelord_launcher.py +10 -8
  458. chia/timelord/timelord_state.py +5 -5
  459. chia/types/block_protocol.py +2 -2
  460. chia/types/blockchain_format/coin.py +3 -3
  461. chia/types/blockchain_format/program.py +17 -18
  462. chia/types/blockchain_format/tree_hash.py +9 -9
  463. chia/types/coin_spend.py +8 -8
  464. chia/types/condition_with_args.py +1 -2
  465. chia/types/eligible_coin_spends.py +16 -15
  466. chia/types/generator_types.py +1 -2
  467. chia/types/internal_mempool_item.py +1 -2
  468. chia/types/mempool_item.py +7 -7
  469. chia/types/mempool_submission_status.py +2 -2
  470. chia/types/peer_info.py +1 -1
  471. chia/types/spend_bundle.py +1 -2
  472. chia/types/transaction_queue_entry.py +2 -2
  473. chia/types/unfinished_header_block.py +2 -2
  474. chia/types/validation_state.py +14 -0
  475. chia/types/weight_proof.py +5 -6
  476. chia/util/action_scope.py +8 -8
  477. chia/util/async_pool.py +6 -4
  478. chia/util/augmented_chain.py +13 -9
  479. chia/util/batches.py +5 -2
  480. chia/util/bech32m.py +14 -11
  481. chia/util/beta_metrics.py +5 -4
  482. chia/util/block_cache.py +5 -5
  483. chia/util/byte_types.py +2 -0
  484. chia/util/check_fork_next_block.py +3 -2
  485. chia/util/chia_logging.py +41 -21
  486. chia/util/collection.py +3 -3
  487. chia/util/condition_tools.py +18 -18
  488. chia/util/config.py +26 -25
  489. chia/util/cpu.py +2 -0
  490. chia/util/db_synchronous.py +2 -0
  491. chia/util/db_version.py +2 -0
  492. chia/util/db_wrapper.py +13 -10
  493. chia/util/default_root.py +17 -0
  494. chia/util/dump_keyring.py +6 -6
  495. chia/util/errors.py +5 -3
  496. chia/util/file_keyring.py +22 -33
  497. chia/util/files.py +2 -0
  498. chia/util/full_block_utils.py +31 -7
  499. chia/util/generator_tools.py +18 -8
  500. chia/util/hash.py +3 -1
  501. chia/util/initial-config.yaml +19 -0
  502. chia/util/inline_executor.py +2 -0
  503. chia/util/ip_address.py +39 -0
  504. chia/util/json_util.py +0 -4
  505. chia/util/keychain.py +27 -24
  506. chia/util/keyring_wrapper.py +65 -4
  507. chia/util/limited_semaphore.py +3 -1
  508. chia/util/lock.py +4 -2
  509. chia/util/log_exceptions.py +5 -2
  510. chia/util/logging.py +3 -1
  511. chia/util/lru_cache.py +2 -0
  512. chia/util/math.py +4 -4
  513. chia/util/network.py +15 -73
  514. chia/util/paginator.py +3 -1
  515. chia/util/path.py +2 -0
  516. chia/util/permissions.py +3 -2
  517. chia/util/prev_transaction_block.py +1 -3
  518. chia/util/priority_mutex.py +6 -3
  519. chia/util/profiler.py +7 -4
  520. chia/util/recursive_replace.py +2 -0
  521. chia/util/safe_cancel_task.py +2 -0
  522. chia/util/service_groups.py +2 -2
  523. chia/util/setproctitle.py +2 -0
  524. chia/util/significant_bits.py +2 -0
  525. chia/util/ssl_check.py +11 -11
  526. chia/util/streamable.py +44 -56
  527. chia/util/task_referencer.py +59 -0
  528. chia/util/task_timing.py +22 -18
  529. chia/util/timing.py +4 -1
  530. chia/util/vdf_prover.py +2 -3
  531. chia/util/virtual_project_analysis.py +540 -0
  532. chia/util/ws_message.py +6 -6
  533. chia/wallet/cat_wallet/cat_info.py +3 -3
  534. chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
  535. chia/wallet/cat_wallet/cat_utils.py +5 -4
  536. chia/wallet/cat_wallet/cat_wallet.py +56 -70
  537. chia/wallet/cat_wallet/dao_cat_info.py +3 -3
  538. chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
  539. chia/wallet/cat_wallet/lineage_store.py +2 -2
  540. chia/wallet/coin_selection.py +15 -15
  541. chia/wallet/conditions.py +257 -71
  542. chia/wallet/dao_wallet/dao_info.py +4 -4
  543. chia/wallet/dao_wallet/dao_utils.py +43 -42
  544. chia/wallet/dao_wallet/dao_wallet.py +66 -68
  545. chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
  546. chia/wallet/derive_keys.py +11 -11
  547. chia/wallet/did_wallet/did_info.py +3 -3
  548. chia/wallet/did_wallet/did_wallet.py +56 -47
  549. chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
  550. chia/wallet/lineage_proof.py +4 -4
  551. chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
  552. chia/wallet/nft_wallet/nft_info.py +4 -4
  553. chia/wallet/nft_wallet/nft_puzzles.py +16 -16
  554. chia/wallet/nft_wallet/nft_wallet.py +90 -89
  555. chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
  556. chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
  557. chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
  558. chia/wallet/nft_wallet/uncurry_nft.py +2 -2
  559. chia/wallet/notification_manager.py +5 -5
  560. chia/wallet/notification_store.py +6 -6
  561. chia/wallet/outer_puzzles.py +2 -2
  562. chia/wallet/payment.py +4 -5
  563. chia/wallet/puzzle_drivers.py +4 -4
  564. chia/wallet/puzzles/clawback/drivers.py +5 -5
  565. chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
  566. chia/wallet/puzzles/load_clvm.py +2 -3
  567. chia/wallet/puzzles/p2_conditions.py +1 -2
  568. chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
  569. chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
  570. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
  571. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
  572. chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
  573. chia/wallet/puzzles/puzzle_utils.py +7 -7
  574. chia/wallet/puzzles/singleton_top_layer.py +6 -5
  575. chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
  576. chia/wallet/puzzles/tails.py +34 -30
  577. chia/wallet/signer_protocol.py +7 -8
  578. chia/wallet/singleton.py +4 -4
  579. chia/wallet/trade_manager.py +155 -141
  580. chia/wallet/trade_record.py +5 -5
  581. chia/wallet/trading/offer.py +100 -101
  582. chia/wallet/trading/trade_store.py +14 -14
  583. chia/wallet/transaction_record.py +31 -16
  584. chia/wallet/util/address_type.py +4 -4
  585. chia/wallet/util/blind_signer_tl.py +8 -12
  586. chia/wallet/util/clvm_streamable.py +15 -15
  587. chia/wallet/util/compute_hints.py +5 -5
  588. chia/wallet/util/compute_memos.py +4 -6
  589. chia/wallet/util/curry_and_treehash.py +3 -2
  590. chia/wallet/util/debug_spend_bundle.py +6 -8
  591. chia/wallet/util/merkle_tree.py +10 -10
  592. chia/wallet/util/merkle_utils.py +10 -10
  593. chia/wallet/util/new_peak_queue.py +3 -3
  594. chia/wallet/util/peer_request_cache.py +8 -8
  595. chia/{util → wallet/util}/pprint.py +2 -3
  596. chia/wallet/util/puzzle_compression.py +3 -4
  597. chia/wallet/util/puzzle_decorator.py +10 -10
  598. chia/wallet/util/query_filter.py +9 -10
  599. chia/wallet/util/tx_config.py +12 -12
  600. chia/wallet/util/wallet_sync_utils.py +24 -21
  601. chia/wallet/util/wallet_types.py +9 -2
  602. chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
  603. chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
  604. chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
  605. chia/wallet/vc_wallet/vc_drivers.py +16 -16
  606. chia/wallet/vc_wallet/vc_store.py +9 -9
  607. chia/wallet/vc_wallet/vc_wallet.py +35 -35
  608. chia/wallet/wallet.py +54 -54
  609. chia/wallet/wallet_action_scope.py +14 -13
  610. chia/wallet/wallet_blockchain.py +10 -10
  611. chia/wallet/wallet_coin_record.py +2 -2
  612. chia/wallet/wallet_coin_store.py +10 -10
  613. chia/wallet/wallet_info.py +1 -2
  614. chia/wallet/wallet_interested_store.py +5 -5
  615. chia/wallet/wallet_nft_store.py +6 -6
  616. chia/wallet/wallet_node.py +72 -76
  617. chia/wallet/wallet_node_api.py +33 -27
  618. chia/wallet/wallet_pool_store.py +1 -2
  619. chia/wallet/wallet_protocol.py +15 -15
  620. chia/wallet/wallet_puzzle_store.py +35 -4
  621. chia/wallet/wallet_retry_store.py +2 -2
  622. chia/wallet/wallet_singleton_store.py +10 -9
  623. chia/wallet/wallet_spend_bundle.py +4 -20
  624. chia/wallet/wallet_state_manager.py +223 -224
  625. chia/wallet/wallet_transaction_store.py +44 -18
  626. chia/wallet/wallet_user_store.py +2 -2
  627. chia/wallet/wallet_weight_proof_handler.py +2 -2
  628. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
  629. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
  630. chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
  631. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
  632. mozilla-ca/cacert.pem +32 -87
  633. chia/_tests/cmds/wallet/test_coins.py +0 -195
  634. chia/consensus/block_root_validation.py +0 -46
  635. chia/util/api_decorators.py +0 -89
  636. chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
  637. {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
@@ -1,27 +1,32 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import contextlib
4
5
  import functools
5
6
  import logging
7
+ from collections.abc import Awaitable
6
8
  from dataclasses import dataclass
7
- from typing import Awaitable, Callable, List, Optional
9
+ from typing import Callable, Optional
8
10
  from unittest.mock import MagicMock
9
11
 
10
12
  import pytest
11
13
  from aiosqlite import Error as AIOSqliteError
12
- from chia_rs import confirm_not_included_already_hashed
14
+ from chia_rs import G2Element, confirm_not_included_already_hashed
15
+ from chiabip158 import PyBIP158
13
16
  from colorlog import getLogger
14
17
 
15
- from chia._tests.connection_utils import disconnect_all, disconnect_all_and_reconnect
18
+ from chia._tests.connection_utils import connect_and_get_peer, disconnect_all, disconnect_all_and_reconnect
16
19
  from chia._tests.util.blockchain_mock import BlockchainMock
17
- from chia._tests.util.misc import add_blocks_in_batches, wallet_height_at_least
20
+ from chia._tests.util.misc import patch_request_handler, wallet_height_at_least
18
21
  from chia._tests.util.setup_nodes import OldSimulatorsAndWallets
19
22
  from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
20
23
  from chia._tests.weight_proof.test_weight_proof import load_blocks_dont_validate
24
+ from chia.consensus.block_body_validation import ForkInfo
21
25
  from chia.consensus.block_record import BlockRecord
22
26
  from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
23
27
  from chia.consensus.constants import ConsensusConstants
24
28
  from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
29
+ from chia.full_node.full_node_api import FullNodeAPI
25
30
  from chia.full_node.weight_proof import WeightProofHandler
26
31
  from chia.protocols import full_node_protocol, wallet_protocol
27
32
  from chia.protocols.protocol_message_types import ProtocolMessageTypes
@@ -30,16 +35,26 @@ from chia.protocols.wallet_protocol import (
30
35
  CoinState,
31
36
  RequestAdditions,
32
37
  RespondAdditions,
38
+ RespondBlockHeader,
33
39
  RespondBlockHeaders,
34
40
  SendTransaction,
35
41
  )
36
42
  from chia.server.outbound_message import Message, make_msg
43
+ from chia.server.server import ChiaServer
37
44
  from chia.server.ws_connection import WSChiaConnection
45
+ from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
46
+ from chia.simulator.block_tools import BlockTools
47
+ from chia.simulator.full_node_simulator import FullNodeSimulator
38
48
  from chia.simulator.simulator_protocol import FarmNewBlockProtocol
39
49
  from chia.types.blockchain_format.program import Program
50
+ from chia.types.blockchain_format.serialized_program import SerializedProgram
40
51
  from chia.types.blockchain_format.sized_bytes import bytes32
52
+ from chia.types.coin_spend import make_spend
53
+ from chia.types.condition_opcodes import ConditionOpcode
41
54
  from chia.types.full_block import FullBlock
42
55
  from chia.types.peer_info import PeerInfo
56
+ from chia.types.spend_bundle import SpendBundle
57
+ from chia.types.validation_state import ValidationState
43
58
  from chia.util.hash import std_hash
44
59
  from chia.util.ints import uint32, uint64, uint128
45
60
  from chia.wallet.nft_wallet.nft_wallet import NFTWallet
@@ -70,7 +85,7 @@ pytestmark = pytest.mark.standard_block_tools
70
85
  @pytest.mark.limit_consensus_modes(reason="save time")
71
86
  @pytest.mark.anyio
72
87
  async def test_request_block_headers(
73
- simulator_and_wallet: OldSimulatorsAndWallets, default_400_blocks: List[FullBlock]
88
+ simulator_and_wallet: OldSimulatorsAndWallets, default_400_blocks: list[FullBlock]
74
89
  ) -> None:
75
90
  # Tests the edge case of receiving funds right before the recent blocks in weight proof
76
91
  [full_node_api], [(wallet_node, _)], bt = simulator_and_wallet
@@ -99,6 +114,84 @@ async def test_request_block_headers(
99
114
  assert len(bh) == 6
100
115
 
101
116
 
117
+ @pytest.mark.limit_consensus_modes(reason="save time")
118
+ @pytest.mark.anyio
119
+ @pytest.mark.parametrize("rewards_only_tx_block", [True, False])
120
+ async def test_request_block_headers_transactions_filter(
121
+ one_node_one_block: tuple[FullNodeSimulator, ChiaServer, BlockTools], rewards_only_tx_block: bool
122
+ ) -> None:
123
+ """
124
+ Tests that `request_block_headers` returns a transactions filter that
125
+ correctly reflects the blocks transactions.
126
+
127
+ We use `rewards_only_tx_block` to control whether the test transaction
128
+ block contains our test spend as well, or just the reward coins.
129
+
130
+ For completeness, we're also comparing the outcome of
131
+ `request_block_headers` in this regard, to `request_header_blocks` as
132
+ well as `request_block_header`.
133
+ """
134
+ full_node_api, _, bt = one_node_one_block
135
+ ph = SerializedProgram.to(1).get_tree_hash()
136
+ for _ in range(2):
137
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph))
138
+ if rewards_only_tx_block:
139
+ # Generate a transaction block without any spends
140
+ sb = None
141
+ else:
142
+ # Generate a transaction block with our test spend
143
+ coins = await full_node_api.full_node.coin_store.get_coin_records_by_puzzle_hash(False, ph)
144
+ [parent_coin] = [c.coin for c in coins if c.coin.amount == 250_000_000_000]
145
+ sb = SpendBundle(
146
+ [
147
+ make_spend(
148
+ parent_coin, SerializedProgram.to(1), SerializedProgram.to([[ConditionOpcode.CREATE_COIN, ph, 42]])
149
+ )
150
+ ],
151
+ G2Element(),
152
+ )
153
+ blocks = await full_node_api.get_all_full_blocks()
154
+ blocks = bt.get_consecutive_blocks(1, blocks, guarantee_transaction_block=True, transaction_data=sb)
155
+ new_block = blocks[-1]
156
+ await full_node_api.full_node.add_block(new_block)
157
+ # Compute the expected transactions filter
158
+ if rewards_only_tx_block:
159
+ byte_array_tx = [bytearray(coin.puzzle_hash) for coin in new_block.get_included_reward_coins()]
160
+ else:
161
+ assert sb is not None
162
+ [test_spend] = sb.additions()
163
+ byte_array_tx = (
164
+ [bytearray(test_spend.puzzle_hash)]
165
+ + [bytearray(coin.puzzle_hash) for coin in new_block.get_included_reward_coins()]
166
+ + [bytearray(parent_coin.name())]
167
+ )
168
+ expected_transactions_filter = bytes(PyBIP158(byte_array_tx).GetEncoded())
169
+ # Perform the request and check the transactions filter
170
+ msg = await full_node_api.request_block_headers(
171
+ wallet_protocol.RequestBlockHeaders(uint32(new_block.height), uint32(new_block.height), True)
172
+ )
173
+ assert msg is not None
174
+ res_block_headers = RespondBlockHeaders.from_bytes(msg.data)
175
+ block_headers = res_block_headers.header_blocks
176
+ assert len(block_headers) == 1
177
+ block_header = block_headers[0]
178
+ assert block_header.transactions_filter == expected_transactions_filter
179
+ # Go further and compare this to the outcome of request_header_blocks
180
+ msg = await full_node_api.request_header_blocks(
181
+ wallet_protocol.RequestHeaderBlocks(uint32(new_block.height), uint32(new_block.height))
182
+ )
183
+ assert msg is not None
184
+ block_headers_res = RespondBlockHeaders.from_bytes(msg.data)
185
+ assert block_headers_res.header_blocks == block_headers
186
+ assert block_headers_res.header_blocks[0].transactions_filter == expected_transactions_filter
187
+ # Go even further and compare this to the outcome of request_block_header
188
+ msg = await full_node_api.request_block_header(wallet_protocol.RequestBlockHeader(uint32(new_block.height)))
189
+ assert msg is not None
190
+ block_header_res = RespondBlockHeader.from_bytes(msg.data)
191
+ assert block_header_res.header_block == block_header
192
+ assert block_header_res.header_block.transactions_filter == expected_transactions_filter
193
+
194
+
102
195
  # @pytest.mark.parametrize(
103
196
  # "test_case",
104
197
  # [(1_000_000, 10_000_010, False, ProtocolMessageTypes.reject_block_headers)],
@@ -107,7 +200,7 @@ async def test_request_block_headers(
107
200
  # )
108
201
  @pytest.mark.anyio
109
202
  async def test_request_block_headers_rejected(
110
- simulator_and_wallet: OldSimulatorsAndWallets, default_400_blocks: List[FullBlock]
203
+ simulator_and_wallet: OldSimulatorsAndWallets, default_400_blocks: list[FullBlock]
111
204
  ) -> None:
112
205
  # Tests the edge case of receiving funds right before the recent blocks in weight proof
113
206
  [full_node_api], _, _ = simulator_and_wallet
@@ -154,7 +247,7 @@ async def test_request_block_headers_rejected(
154
247
  @pytest.mark.anyio
155
248
  async def test_basic_sync_wallet(
156
249
  two_wallet_nodes: OldSimulatorsAndWallets,
157
- default_400_blocks: List[FullBlock],
250
+ default_400_blocks: list[FullBlock],
158
251
  self_hostname: str,
159
252
  use_delta_sync: bool,
160
253
  ) -> None:
@@ -182,10 +275,7 @@ async def test_basic_sync_wallet(
182
275
  blocks_reorg = bt.get_consecutive_blocks(num_blocks - 1, block_list_input=default_400_blocks[:-5])
183
276
  blocks_reorg = bt.get_consecutive_blocks(1, blocks_reorg, guarantee_transaction_block=True, current_time=True)
184
277
 
185
- await add_blocks_in_batches(blocks_reorg[1:], full_node, blocks_reorg[0].header_hash)
186
-
187
- for wallet_node, wallet_server in wallets:
188
- await disconnect_all_and_reconnect(wallet_server, full_node_server, self_hostname)
278
+ await add_blocks_in_batches(blocks_reorg[1:], full_node)
189
279
 
190
280
  for wallet_node, wallet_server in wallets:
191
281
  await time_out_assert(
@@ -205,7 +295,7 @@ async def test_basic_sync_wallet(
205
295
  @pytest.mark.anyio
206
296
  async def test_almost_recent(
207
297
  two_wallet_nodes: OldSimulatorsAndWallets,
208
- default_400_blocks: List[FullBlock],
298
+ default_400_blocks: list[FullBlock],
209
299
  self_hostname: str,
210
300
  blockchain_constants: ConsensusConstants,
211
301
  use_delta_sync: bool,
@@ -242,9 +332,7 @@ async def test_almost_recent(
242
332
  blockchain_constants.WEIGHT_PROOF_RECENT_BLOCKS + 10, block_list_input=all_blocks
243
333
  )
244
334
 
245
- await add_blocks_in_batches(
246
- new_blocks[base_num_blocks + 20 :], full_node, new_blocks[base_num_blocks + 19].header_hash
247
- )
335
+ await add_blocks_in_batches(new_blocks[base_num_blocks + 20 :], full_node)
248
336
 
249
337
  for wallet_node, wallet_server in wallets:
250
338
  wallet = wallet_node.wallet_state_manager.main_wallet
@@ -255,7 +343,7 @@ async def test_almost_recent(
255
343
  @pytest.mark.anyio
256
344
  async def test_backtrack_sync_wallet(
257
345
  two_wallet_nodes: OldSimulatorsAndWallets,
258
- default_400_blocks: List[FullBlock],
346
+ default_400_blocks: list[FullBlock],
259
347
  self_hostname: str,
260
348
  use_delta_sync: bool,
261
349
  ) -> None:
@@ -285,7 +373,7 @@ async def test_backtrack_sync_wallet(
285
373
  @pytest.mark.anyio
286
374
  async def test_short_batch_sync_wallet(
287
375
  two_wallet_nodes: OldSimulatorsAndWallets,
288
- default_400_blocks: List[FullBlock],
376
+ default_400_blocks: list[FullBlock],
289
377
  self_hostname: str,
290
378
  use_delta_sync: bool,
291
379
  ) -> None:
@@ -314,8 +402,8 @@ async def test_short_batch_sync_wallet(
314
402
  @pytest.mark.anyio
315
403
  async def test_long_sync_wallet(
316
404
  two_wallet_nodes: OldSimulatorsAndWallets,
317
- default_1000_blocks: List[FullBlock],
318
- default_400_blocks: List[FullBlock],
405
+ default_1000_blocks: list[FullBlock],
406
+ default_400_blocks: list[FullBlock],
319
407
  self_hostname: str,
320
408
  use_delta_sync: bool,
321
409
  ) -> None:
@@ -330,7 +418,6 @@ async def test_long_sync_wallet(
330
418
  # Untrusted node sync
331
419
  wallets[1][0].config["trusted_peers"] = {}
332
420
  wallets[1][0].config["use_delta_sync"] = use_delta_sync
333
-
334
421
  await add_blocks_in_batches(default_400_blocks, full_node)
335
422
 
336
423
  for wallet_node, wallet_server in wallets:
@@ -342,13 +429,11 @@ async def test_long_sync_wallet(
342
429
  # Tests a long reorg
343
430
  await add_blocks_in_batches(default_1000_blocks, full_node)
344
431
 
432
+ # ony the wallet with untrusted sync needs to reconnect
433
+ await disconnect_all_and_reconnect(wallets[1][1], full_node_server, self_hostname)
345
434
  for wallet_node, wallet_server in wallets:
346
- await disconnect_all_and_reconnect(wallet_server, full_node_server, self_hostname)
347
-
348
435
  log.info(f"wallet node height is {await wallet_node.wallet_state_manager.blockchain.get_finished_sync_up_to()}")
349
- await time_out_assert(600, wallet_height_at_least, True, wallet_node, len(default_1000_blocks) - 1)
350
-
351
- await disconnect_all_and_reconnect(wallet_server, full_node_server, self_hostname)
436
+ await time_out_assert(200, wallet_height_at_least, True, wallet_node, len(default_1000_blocks) - 1)
352
437
 
353
438
  # Tests a short reorg
354
439
  num_blocks = 30
@@ -358,12 +443,12 @@ async def test_long_sync_wallet(
358
443
  sub_slot_iters, difficulty = get_next_sub_slot_iters_and_difficulty(
359
444
  full_node.constants, True, block_record, full_node.blockchain
360
445
  )
446
+ fork_height = blocks_reorg[-num_blocks - 10].height - 1
361
447
  await full_node.add_block_batch(
362
448
  blocks_reorg[-num_blocks - 10 : -1],
363
449
  PeerInfo("0.0.0.0", 0),
364
- None,
365
- current_ssi=sub_slot_iters,
366
- current_difficulty=difficulty,
450
+ ForkInfo(fork_height, fork_height, blocks_reorg[-num_blocks - 10].prev_header_hash),
451
+ ValidationState(sub_slot_iters, difficulty, None),
367
452
  )
368
453
  await full_node.add_block(blocks_reorg[-1])
369
454
 
@@ -377,7 +462,7 @@ async def test_long_sync_wallet(
377
462
  @pytest.mark.anyio
378
463
  async def test_wallet_reorg_sync(
379
464
  two_wallet_nodes: OldSimulatorsAndWallets,
380
- default_400_blocks: List[FullBlock],
465
+ default_400_blocks: list[FullBlock],
381
466
  self_hostname: str,
382
467
  use_delta_sync: bool,
383
468
  ) -> None:
@@ -401,12 +486,19 @@ async def test_wallet_reorg_sync(
401
486
  await wallet_server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
402
487
 
403
488
  # Insert 400 blocks
404
- await full_node.add_block(default_400_blocks[0])
405
- await add_blocks_in_batches(default_400_blocks[1:], full_node)
489
+ await add_blocks_in_batches(default_400_blocks, full_node)
406
490
  # Farm few more with reward
491
+
492
+ wallet_node1, _ = wallets[0]
493
+ wallet1 = wallet_node.wallet_state_manager.main_wallet
494
+ wallet_node2, _ = wallets[1]
495
+ wallet2 = wallet_node2.wallet_state_manager.main_wallet
496
+
497
+ await time_out_assert(60, wallet_height_at_least, True, wallet1, 399)
498
+ await time_out_assert(60, wallet_height_at_least, True, wallet2, 399)
499
+
407
500
  for _ in range(num_blocks - 1):
408
501
  await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(phs[0]))
409
-
410
502
  for _ in range(num_blocks):
411
503
  await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(phs[1]))
412
504
 
@@ -415,17 +507,19 @@ async def test_wallet_reorg_sync(
415
507
  calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, num_blocks)
416
508
  )
417
509
 
418
- for wallet_node, wallet_server in wallets:
419
- wallet = wallet_node.wallet_state_manager.main_wallet
420
- await time_out_assert(60, wallet.get_confirmed_balance, funds)
421
- await time_out_assert(60, get_tx_count, 2 * (num_blocks - 1), wallet_node.wallet_state_manager, 1)
510
+ await time_out_assert(60, wallet_height_at_least, True, wallet1, 408)
511
+ await time_out_assert(60, wallet1.get_confirmed_balance, funds)
512
+ await time_out_assert(60, get_tx_count, 2 * (num_blocks - 1), wallet_node1.wallet_state_manager, 1)
513
+
514
+ await time_out_assert(60, wallet_height_at_least, True, wallet2, 408)
515
+ await time_out_assert(60, wallet2.get_confirmed_balance, funds)
516
+ await time_out_assert(60, get_tx_count, 2 * (num_blocks - 1), wallet_node2.wallet_state_manager, 1)
422
517
 
423
518
  # Reorg blocks that carry reward
424
519
  num_blocks = 30
425
520
  blocks_reorg = bt.get_consecutive_blocks(num_blocks, block_list_input=default_400_blocks[:-5])
426
521
 
427
- for block in blocks_reorg[-30:]:
428
- await full_node.add_block(block)
522
+ await add_blocks_in_batches(blocks_reorg[-30:], full_node)
429
523
 
430
524
  for wallet_node, wallet_server in wallets:
431
525
  wallet = wallet_node.wallet_state_manager.main_wallet
@@ -436,7 +530,7 @@ async def test_wallet_reorg_sync(
436
530
  @pytest.mark.limit_consensus_modes(reason="save time")
437
531
  @pytest.mark.anyio
438
532
  async def test_wallet_reorg_get_coinbase(
439
- two_wallet_nodes: OldSimulatorsAndWallets, default_400_blocks: List[FullBlock], self_hostname: str
533
+ two_wallet_nodes: OldSimulatorsAndWallets, default_400_blocks: list[FullBlock], self_hostname: str
440
534
  ) -> None:
441
535
  [full_node_api], wallets, bt = two_wallet_nodes
442
536
  full_node = full_node_api.full_node
@@ -481,9 +575,8 @@ async def test_wallet_reorg_get_coinbase(
481
575
  await full_node.add_block_batch(
482
576
  blocks_reorg_2[-44:],
483
577
  PeerInfo("0.0.0.0", 0),
484
- None,
485
- current_ssi=sub_slot_iters,
486
- current_difficulty=difficulty,
578
+ ForkInfo(blocks_reorg_2[-45].height, blocks_reorg_2[-45].height, blocks_reorg_2[-45].header_hash),
579
+ ValidationState(sub_slot_iters, difficulty, None),
487
580
  )
488
581
 
489
582
  for wallet_node, wallet_server in wallets:
@@ -572,7 +665,7 @@ async def test_request_additions_success(simulator_and_wallet: OldSimulatorsAndW
572
665
 
573
666
  await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
574
667
 
575
- payees: List[Payment] = []
668
+ payees: list[Payment] = []
576
669
  for i in range(10):
577
670
  payee_ph = await wallet.get_new_puzzlehash()
578
671
  payees.append(Payment(payee_ph, uint64(i + 100)))
@@ -644,7 +737,7 @@ async def test_request_additions_success(simulator_and_wallet: OldSimulatorsAndW
644
737
 
645
738
  @pytest.mark.anyio
646
739
  async def test_get_wp_fork_point(
647
- default_10000_blocks: List[FullBlock], blockchain_constants: ConsensusConstants
740
+ default_10000_blocks: list[FullBlock], blockchain_constants: ConsensusConstants
648
741
  ) -> None:
649
742
  blocks = default_10000_blocks
650
743
  header_cache, height_to_hash, sub_blocks, summaries = await load_blocks_dont_validate(blocks, blockchain_constants)
@@ -787,7 +880,7 @@ async def test_dusted_wallet(
787
880
  await full_node_api.wait_for_wallets_synced(wallet_nodes=[farm_wallet_node, dust_wallet_node], timeout=20)
788
881
 
789
882
  # Part 1: create a single dust coin
790
- payees: List[Payment] = []
883
+ payees: list[Payment] = []
791
884
  payee_ph = await dust_wallet.get_new_puzzlehash()
792
885
  payees.append(Payment(payee_ph, uint64(dust_value)))
793
886
 
@@ -1244,7 +1337,7 @@ async def test_retry_store(
1244
1337
  full_node_api = full_nodes[0]
1245
1338
  full_node_server = full_node_api.full_node.server
1246
1339
 
1247
- await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32([0] * 32)))
1340
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
1248
1341
 
1249
1342
  # Trusted node sync
1250
1343
  wallets[0][0].config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()}
@@ -1261,11 +1354,11 @@ async def test_retry_store(
1261
1354
 
1262
1355
  def flaky_get_coin_state(
1263
1356
  flakiness_info: FlakinessInfo,
1264
- func: Callable[[List[bytes32], WSChiaConnection, Optional[uint32]], Awaitable[List[CoinState]]],
1265
- ) -> Callable[[List[bytes32], WSChiaConnection, Optional[uint32]], Awaitable[List[CoinState]]]:
1357
+ func: Callable[[list[bytes32], WSChiaConnection, Optional[uint32]], Awaitable[list[CoinState]]],
1358
+ ) -> Callable[[list[bytes32], WSChiaConnection, Optional[uint32]], Awaitable[list[CoinState]]]:
1266
1359
  async def new_func(
1267
- coin_names: List[bytes32], peer: WSChiaConnection, fork_height: Optional[uint32] = None
1268
- ) -> List[CoinState]:
1360
+ coin_names: list[bytes32], peer: WSChiaConnection, fork_height: Optional[uint32] = None
1361
+ ) -> list[CoinState]:
1269
1362
  if flakiness_info.coin_state_flaky:
1270
1363
  flakiness_info.coin_state_flaky = False
1271
1364
  raise PeerRequestException()
@@ -1277,28 +1370,28 @@ async def test_retry_store(
1277
1370
  request_puzzle_solution_failure_tested = False
1278
1371
 
1279
1372
  def flaky_request_puzzle_solution(
1280
- func: Callable[[wallet_protocol.RequestPuzzleSolution], Awaitable[Optional[Message]]]
1281
- ) -> Callable[[wallet_protocol.RequestPuzzleSolution], Awaitable[Optional[Message]]]:
1373
+ func: Callable[[FullNodeAPI, wallet_protocol.RequestPuzzleSolution], Awaitable[Optional[Message]]],
1374
+ ) -> Callable[[FullNodeAPI, wallet_protocol.RequestPuzzleSolution], Awaitable[Optional[Message]]]:
1282
1375
  @functools.wraps(func)
1283
- async def new_func(request: wallet_protocol.RequestPuzzleSolution) -> Optional[Message]:
1376
+ async def new_func(self: FullNodeAPI, request: wallet_protocol.RequestPuzzleSolution) -> Optional[Message]:
1284
1377
  nonlocal request_puzzle_solution_failure_tested
1285
1378
  if not request_puzzle_solution_failure_tested:
1286
1379
  request_puzzle_solution_failure_tested = True
1287
1380
  # This can just return None if we have `none_response` enabled.
1288
- reject = wallet_protocol.RejectPuzzleSolution(bytes32([0] * 32), uint32(0))
1381
+ reject = wallet_protocol.RejectPuzzleSolution(bytes32.zeros, uint32(0))
1289
1382
  return make_msg(ProtocolMessageTypes.reject_puzzle_solution, reject)
1290
1383
  else:
1291
- return await func(request)
1384
+ return await func(self, request)
1292
1385
 
1293
1386
  return new_func
1294
1387
 
1295
1388
  def flaky_fetch_children(
1296
1389
  flakiness_info: FlakinessInfo,
1297
- func: Callable[[bytes32, WSChiaConnection, Optional[uint32]], Awaitable[List[CoinState]]],
1298
- ) -> Callable[[bytes32, WSChiaConnection, Optional[uint32]], Awaitable[List[CoinState]]]:
1390
+ func: Callable[[bytes32, WSChiaConnection, Optional[uint32]], Awaitable[list[CoinState]]],
1391
+ ) -> Callable[[bytes32, WSChiaConnection, Optional[uint32]], Awaitable[list[CoinState]]]:
1299
1392
  async def new_func(
1300
1393
  coin_name: bytes32, peer: WSChiaConnection, fork_height: Optional[uint32] = None
1301
- ) -> List[CoinState]:
1394
+ ) -> list[CoinState]:
1302
1395
  if flakiness_info.fetch_children_flaky:
1303
1396
  flakiness_info.fetch_children_flaky = False
1304
1397
  raise PeerRequestException()
@@ -1331,12 +1424,15 @@ async def test_retry_store(
1331
1424
 
1332
1425
  return new_func
1333
1426
 
1334
- with monkeypatch.context() as m:
1335
- m.setattr(
1336
- full_node_api,
1337
- "request_puzzle_solution",
1338
- flaky_request_puzzle_solution(full_node_api.request_puzzle_solution),
1427
+ with contextlib.ExitStack() as exit_stack:
1428
+ exit_stack.enter_context(
1429
+ patch_request_handler(
1430
+ api=full_node_api,
1431
+ handler=flaky_request_puzzle_solution(FullNodeAPI.request_puzzle_solution),
1432
+ request_type=ProtocolMessageTypes.request_puzzle_solution,
1433
+ )
1339
1434
  )
1435
+ m = exit_stack.enter_context(monkeypatch.context())
1340
1436
 
1341
1437
  for wallet_node, wallet_server in wallets:
1342
1438
  wallet_node.coin_state_retry_seconds = 1
@@ -1362,7 +1458,7 @@ async def test_retry_store(
1362
1458
  wallet = wallet_node.wallet_state_manager.main_wallet
1363
1459
  ph = await wallet.get_new_puzzlehash()
1364
1460
  await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph))
1365
- await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32([0] * 32)))
1461
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
1366
1462
 
1367
1463
  async def retry_store_empty() -> bool:
1368
1464
  return len(await wallet_node.wallet_state_manager.retry_store.get_all_states_to_retry()) == 0
@@ -1377,7 +1473,7 @@ async def test_retry_store(
1377
1473
 
1378
1474
  async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
1379
1475
  await wallet.generate_signed_transaction(
1380
- uint64(1_000_000_000_000), bytes32([0] * 32), action_scope, memos=[ph]
1476
+ uint64(1_000_000_000_000), bytes32.zeros, action_scope, memos=[ph]
1381
1477
  )
1382
1478
  [tx] = action_scope.side_effects.transactions
1383
1479
  await time_out_assert(30, wallet.get_confirmed_balance, 2_000_000_000_000)
@@ -1386,7 +1482,7 @@ async def test_retry_store(
1386
1482
  return full_node_api.full_node.mempool_manager.get_spendbundle(tx.name) is not None
1387
1483
 
1388
1484
  await time_out_assert(15, tx_in_mempool)
1389
- await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32([0] * 32)))
1485
+ await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
1390
1486
 
1391
1487
  await assert_coin_state_retry()
1392
1488
 
@@ -1404,7 +1500,7 @@ async def test_retry_store(
1404
1500
  @pytest.mark.skip("the test fails with 'wallet_state_manager not assigned'. This test doesn't work, skip it for now")
1405
1501
  async def test_bad_peak_mismatch(
1406
1502
  two_wallet_nodes: OldSimulatorsAndWallets,
1407
- default_1000_blocks: List[FullBlock],
1503
+ default_1000_blocks: list[FullBlock],
1408
1504
  self_hostname: str,
1409
1505
  blockchain_constants: ConsensusConstants,
1410
1506
  monkeypatch: pytest.MonkeyPatch,
@@ -1463,11 +1559,10 @@ async def test_bad_peak_mismatch(
1463
1559
  @pytest.mark.anyio
1464
1560
  async def test_long_sync_untrusted_break(
1465
1561
  setup_two_nodes_and_wallet: OldSimulatorsAndWallets,
1466
- default_1000_blocks: List[FullBlock],
1467
- default_400_blocks: List[FullBlock],
1562
+ default_1000_blocks: list[FullBlock],
1563
+ default_400_blocks: list[FullBlock],
1468
1564
  self_hostname: str,
1469
1565
  caplog: pytest.LogCaptureFixture,
1470
- monkeypatch: pytest.MonkeyPatch,
1471
1566
  use_delta_sync: bool,
1472
1567
  ) -> None:
1473
1568
  [trusted_full_node_api, untrusted_full_node_api], [(wallet_node, wallet_server)], _ = setup_two_nodes_and_wallet
@@ -1478,7 +1573,11 @@ async def test_long_sync_untrusted_break(
1478
1573
 
1479
1574
  sync_canceled = False
1480
1575
 
1481
- async def register_interest_in_puzzle_hash() -> None:
1576
+ async def register_for_ph_updates(
1577
+ self: object,
1578
+ request: wallet_protocol.RegisterForPhUpdates,
1579
+ peer: WSChiaConnection,
1580
+ ) -> None:
1482
1581
  nonlocal sync_canceled
1483
1582
  # Just sleep a long time here to simulate a long-running untrusted sync
1484
1583
  try:
@@ -1505,13 +1604,7 @@ async def test_long_sync_untrusted_break(
1505
1604
 
1506
1605
  await add_blocks_in_batches(default_1000_blocks[:400], untrusted_full_node_api.full_node)
1507
1606
 
1508
- with monkeypatch.context() as m:
1509
- m.setattr(
1510
- untrusted_full_node_api,
1511
- "register_interest_in_puzzle_hash",
1512
- MagicMock(return_value=register_interest_in_puzzle_hash()),
1513
- )
1514
-
1607
+ with patch_request_handler(api=untrusted_full_node_api, handler=register_for_ph_updates):
1515
1608
  # Connect to the untrusted peer and wait until the long sync started
1516
1609
  await wallet_server.start_client(PeerInfo(self_hostname, untrusted_full_node_server.get_port()), None)
1517
1610
  await time_out_assert(30, wallet_syncing)
@@ -1527,3 +1620,73 @@ async def test_long_sync_untrusted_break(
1527
1620
  assert time_out_assert(30, check_sync_canceled)
1528
1621
  # And that we only have a trusted peer left
1529
1622
  assert time_out_assert(30, only_trusted_peer)
1623
+
1624
+
1625
+ @pytest.mark.anyio
1626
+ @pytest.mark.parametrize("chain_length", [0, 100])
1627
+ @pytest.mark.parametrize("fork_point", [500, 1500])
1628
+ async def test_long_reorg_nodes_and_wallet(
1629
+ chain_length: int,
1630
+ fork_point: int,
1631
+ three_nodes: list[FullNodeAPI],
1632
+ simulator_and_wallet: OldSimulatorsAndWallets,
1633
+ default_10000_blocks: list[FullBlock],
1634
+ test_long_reorg_blocks: list[FullBlock],
1635
+ test_long_reorg_1500_blocks: list[FullBlock],
1636
+ self_hostname: str,
1637
+ ) -> None:
1638
+ full_node_1, full_node_2, _ = three_nodes
1639
+ _, [wallet], _ = simulator_and_wallet
1640
+ wallet_node = wallet[0]
1641
+ wallet_server = wallet[1]
1642
+ # Trusted node sync
1643
+ wallet_node.config["trusted_peers"] = {full_node_1.server.node_id.hex(): full_node_1.server.node_id.hex()}
1644
+
1645
+ if fork_point == 1500:
1646
+ blocks = default_10000_blocks[: 3600 - chain_length]
1647
+ else:
1648
+ blocks = default_10000_blocks[: 1600 - chain_length]
1649
+ if fork_point == 1500:
1650
+ reorg_blocks = test_long_reorg_1500_blocks[: 3100 - chain_length]
1651
+ else:
1652
+ reorg_blocks = test_long_reorg_blocks[: 1200 - chain_length]
1653
+ pytest.skip("We rely on the light-blocks test for a 0 forkpoint")
1654
+
1655
+ last_blk = blocks[-1]
1656
+ last_reorg_blk = reorg_blocks[-1]
1657
+ assert last_blk.header_hash != last_reorg_blk.header_hash
1658
+ assert last_blk.weight < last_reorg_blk.weight
1659
+
1660
+ await wallet_server.start_client(PeerInfo(self_hostname, full_node_1.server.get_port()), None)
1661
+ assert len(wallet_server.all_connections) == 1
1662
+ assert len(full_node_1.server.all_connections) == 1
1663
+
1664
+ await add_blocks_in_batches(blocks, full_node_1.full_node)
1665
+ node_1_peak = full_node_1.full_node.blockchain.get_peak()
1666
+ assert node_1_peak is not None
1667
+ await time_out_assert(600, wallet_height_at_least, True, wallet_node, node_1_peak.height)
1668
+ log.info(f"wallet node height is {node_1_peak.height}")
1669
+ # full node 2 has the reorg-chain
1670
+ await add_blocks_in_batches(reorg_blocks[:-1], full_node_2.full_node)
1671
+ await connect_and_get_peer(full_node_1.full_node.server, full_node_2.full_node.server, self_hostname)
1672
+
1673
+ # # TODO: There appears to be an issue where the node with the lighter chain
1674
+ # # fails to initiate the reorg until there's a new block farmed onto the
1675
+ # # heavier chain.
1676
+ await full_node_2.full_node.add_block(reorg_blocks[-1])
1677
+
1678
+ def check_nodes_in_sync() -> bool:
1679
+ p1 = full_node_1.full_node.blockchain.get_peak()
1680
+ p2 = full_node_2.full_node.blockchain.get_peak()
1681
+ return p1 is not None and p1 == p2
1682
+
1683
+ await time_out_assert(600, check_nodes_in_sync)
1684
+ node_2_peak = full_node_2.full_node.blockchain.get_peak()
1685
+ assert node_2_peak is not None
1686
+ print(f"peak: {str(node_2_peak.header_hash)[:6]}")
1687
+ await time_out_assert(600, wallet_height_at_least, True, wallet_node, node_2_peak.height)
1688
+ # reorg1_timing = time.monotonic() - start
1689
+ # we already checked p1==p2
1690
+ p1 = full_node_2.full_node.blockchain.get_peak()
1691
+ assert p1 is not None
1692
+ assert p1.header_hash == last_reorg_blk.header_hash