chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. chia/_tests/blockchain/blockchain_test_utils.py +2 -3
  2. chia/_tests/blockchain/test_augmented_chain.py +2 -3
  3. chia/_tests/blockchain/test_blockchain.py +261 -44
  4. chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
  5. chia/_tests/blockchain/test_build_chains.py +197 -1
  6. chia/_tests/blockchain/test_get_block_generator.py +1 -1
  7. chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
  8. chia/_tests/clvm/benchmark_costs.py +1 -1
  9. chia/_tests/clvm/coin_store.py +3 -4
  10. chia/_tests/clvm/test_message_conditions.py +2 -2
  11. chia/_tests/clvm/test_puzzle_compression.py +2 -3
  12. chia/_tests/clvm/test_puzzles.py +1 -2
  13. chia/_tests/clvm/test_singletons.py +2 -3
  14. chia/_tests/clvm/test_spend_sim.py +7 -7
  15. chia/_tests/cmds/cmd_test_utils.py +30 -25
  16. chia/_tests/cmds/test_dev_gh.py +1 -1
  17. chia/_tests/cmds/test_farm_cmd.py +1 -1
  18. chia/_tests/cmds/test_show.py +1 -2
  19. chia/_tests/cmds/wallet/test_did.py +101 -56
  20. chia/_tests/cmds/wallet/test_nft.py +109 -84
  21. chia/_tests/cmds/wallet/test_notifications.py +1 -1
  22. chia/_tests/cmds/wallet/test_offer.toffer +1 -1
  23. chia/_tests/cmds/wallet/test_vcs.py +8 -8
  24. chia/_tests/cmds/wallet/test_wallet.py +100 -46
  25. chia/_tests/conftest.py +31 -20
  26. chia/_tests/connection_utils.py +1 -1
  27. chia/_tests/core/consensus/stores/__init__.py +0 -0
  28. chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
  29. chia/_tests/core/consensus/test_block_creation.py +2 -31
  30. chia/_tests/core/consensus/test_pot_iterations.py +38 -3
  31. chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
  32. chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
  33. chia/_tests/core/daemon/test_daemon.py +80 -0
  34. chia/_tests/core/data_layer/test_data_layer.py +1 -1
  35. chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
  36. chia/_tests/core/data_layer/test_data_rpc.py +14 -10
  37. chia/_tests/core/data_layer/test_data_store.py +5 -5
  38. chia/_tests/core/farmer/test_farmer_api.py +2 -2
  39. chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
  40. chia/_tests/core/full_node/ram_db.py +3 -1
  41. chia/_tests/core/full_node/stores/test_block_store.py +28 -16
  42. chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
  43. chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
  44. chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
  45. chia/_tests/core/full_node/test_address_manager.py +200 -27
  46. chia/_tests/core/full_node/test_block_height_map.py +2 -2
  47. chia/_tests/core/full_node/test_conditions.py +7 -6
  48. chia/_tests/core/full_node/test_full_node.py +456 -40
  49. chia/_tests/core/full_node/test_generator_tools.py +32 -2
  50. chia/_tests/core/full_node/test_hint_management.py +1 -1
  51. chia/_tests/core/full_node/test_node_load.py +20 -21
  52. chia/_tests/core/full_node/test_performance.py +3 -4
  53. chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
  54. chia/_tests/core/full_node/test_subscriptions.py +1 -2
  55. chia/_tests/core/full_node/test_transactions.py +9 -5
  56. chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
  57. chia/_tests/core/large_block.py +1 -2
  58. chia/_tests/core/make_block_generator.py +3 -4
  59. chia/_tests/core/mempool/test_mempool.py +36 -86
  60. chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
  61. chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
  62. chia/_tests/core/mempool/test_mempool_manager.py +421 -69
  63. chia/_tests/core/mempool/test_mempool_performance.py +3 -2
  64. chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
  65. chia/_tests/core/server/flood.py +1 -1
  66. chia/_tests/core/server/test_dos.py +1 -1
  67. chia/_tests/core/server/test_node_discovery.py +41 -27
  68. chia/_tests/core/server/test_rate_limits.py +1 -1
  69. chia/_tests/core/server/test_server.py +1 -1
  70. chia/_tests/core/services/test_services.py +5 -5
  71. chia/_tests/core/ssl/test_ssl.py +1 -1
  72. chia/_tests/core/test_cost_calculation.py +6 -6
  73. chia/_tests/core/test_crawler.py +2 -2
  74. chia/_tests/core/test_crawler_rpc.py +1 -1
  75. chia/_tests/core/test_db_conversion.py +3 -1
  76. chia/_tests/core/test_db_validation.py +5 -3
  77. chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
  78. chia/_tests/core/test_filter.py +4 -1
  79. chia/_tests/core/test_full_node_rpc.py +99 -82
  80. chia/_tests/core/test_program.py +2 -2
  81. chia/_tests/core/util/test_block_cache.py +1 -1
  82. chia/_tests/core/util/test_keychain.py +2 -2
  83. chia/_tests/core/util/test_lockfile.py +1 -1
  84. chia/_tests/core/util/test_log_exceptions.py +5 -5
  85. chia/_tests/core/util/test_streamable.py +81 -22
  86. chia/_tests/db/test_db_wrapper.py +1 -3
  87. chia/_tests/environments/wallet.py +5 -5
  88. chia/_tests/farmer_harvester/test_farmer.py +9 -7
  89. chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
  90. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
  91. chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
  92. chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
  93. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
  94. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
  95. chia/_tests/generator/test_compression.py +1 -2
  96. chia/_tests/generator/test_rom.py +8 -4
  97. chia/_tests/plot_sync/test_plot_sync.py +3 -3
  98. chia/_tests/plot_sync/test_receiver.py +3 -3
  99. chia/_tests/plot_sync/test_sender.py +1 -1
  100. chia/_tests/plot_sync/test_sync_simulated.py +3 -3
  101. chia/_tests/plot_sync/util.py +2 -2
  102. chia/_tests/pools/test_pool_cmdline.py +48 -21
  103. chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
  104. chia/_tests/pools/test_pool_rpc.py +237 -105
  105. chia/_tests/pools/test_pool_wallet.py +11 -2
  106. chia/_tests/pools/test_wallet_pool_store.py +5 -4
  107. chia/_tests/rpc/test_rpc_client.py +1 -1
  108. chia/_tests/simulation/test_simulation.py +13 -8
  109. chia/_tests/simulation/test_simulator.py +2 -2
  110. chia/_tests/timelord/test_new_peak.py +191 -47
  111. chia/_tests/timelord/test_timelord.py +1 -1
  112. chia/_tests/tools/test_full_sync.py +0 -2
  113. chia/_tests/tools/test_run_block.py +3 -1
  114. chia/_tests/util/benchmark_cost.py +3 -3
  115. chia/_tests/util/benchmarks.py +2 -2
  116. chia/_tests/util/blockchain.py +11 -5
  117. chia/_tests/util/blockchain_mock.py +1 -4
  118. chia/_tests/util/coin_store.py +29 -0
  119. chia/_tests/util/constants.py +2 -18
  120. chia/_tests/util/full_sync.py +3 -3
  121. chia/_tests/util/generator_tools_testing.py +2 -3
  122. chia/_tests/util/key_tool.py +2 -3
  123. chia/_tests/util/misc.py +33 -31
  124. chia/_tests/util/network_protocol_data.py +19 -17
  125. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  126. chia/_tests/util/protocol_messages_json.py +3 -1
  127. chia/_tests/util/run_block.py +2 -2
  128. chia/_tests/util/setup_nodes.py +7 -7
  129. chia/_tests/util/spend_sim.py +47 -55
  130. chia/_tests/util/test_condition_tools.py +5 -4
  131. chia/_tests/util/test_config.py +2 -2
  132. chia/_tests/util/test_dump_keyring.py +1 -1
  133. chia/_tests/util/test_full_block_utils.py +12 -14
  134. chia/_tests/util/test_misc.py +2 -2
  135. chia/_tests/util/test_paginator.py +4 -4
  136. chia/_tests/util/test_priority_mutex.py +2 -2
  137. chia/_tests/util/test_replace_str_to_bytes.py +15 -5
  138. chia/_tests/util/test_ssl_check.py +1 -1
  139. chia/_tests/util/test_testnet_overrides.py +13 -3
  140. chia/_tests/util/time_out_assert.py +4 -2
  141. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
  142. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
  143. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
  144. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
  145. chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
  146. chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
  147. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
  148. chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
  149. chia/_tests/wallet/conftest.py +11 -12
  150. chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
  151. chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
  152. chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
  153. chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
  154. chia/_tests/wallet/nft_wallet/config.py +1 -1
  155. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
  156. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
  157. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
  158. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
  159. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
  160. chia/_tests/wallet/rpc/test_wallet_rpc.py +495 -265
  161. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
  162. chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
  163. chia/_tests/wallet/test_clvm_casts.py +88 -0
  164. chia/_tests/wallet/test_coin_management.py +1 -1
  165. chia/_tests/wallet/test_coin_selection.py +1 -1
  166. chia/_tests/wallet/test_conditions.py +1 -1
  167. chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
  168. chia/_tests/wallet/test_notifications.py +5 -3
  169. chia/_tests/wallet/test_sign_coin_spends.py +6 -6
  170. chia/_tests/wallet/test_signer_protocol.py +13 -12
  171. chia/_tests/wallet/test_singleton.py +1 -1
  172. chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
  173. chia/_tests/wallet/test_util.py +2 -2
  174. chia/_tests/wallet/test_wallet.py +108 -29
  175. chia/_tests/wallet/test_wallet_action_scope.py +9 -2
  176. chia/_tests/wallet/test_wallet_blockchain.py +2 -3
  177. chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
  178. chia/_tests/wallet/test_wallet_node.py +2 -4
  179. chia/_tests/wallet/test_wallet_retry.py +4 -2
  180. chia/_tests/wallet/test_wallet_state_manager.py +191 -5
  181. chia/_tests/wallet/test_wallet_test_framework.py +1 -1
  182. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
  183. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
  184. chia/_tests/wallet/wallet_block_tools.py +6 -6
  185. chia/_tests/weight_proof/test_weight_proof.py +10 -48
  186. chia/apis.py +1 -1
  187. chia/cmds/beta.py +1 -1
  188. chia/cmds/chia.py +9 -9
  189. chia/cmds/cmd_classes.py +12 -11
  190. chia/cmds/cmd_helpers.py +1 -1
  191. chia/cmds/cmds_util.py +12 -9
  192. chia/cmds/coin_funcs.py +2 -2
  193. chia/cmds/configure.py +2 -2
  194. chia/cmds/data.py +0 -2
  195. chia/cmds/data_funcs.py +1 -1
  196. chia/cmds/db_validate_func.py +1 -2
  197. chia/cmds/dev/__init__.py +0 -0
  198. chia/cmds/dev/data.py +273 -0
  199. chia/cmds/{gh.py → dev/gh.py} +5 -5
  200. chia/cmds/dev/main.py +22 -0
  201. chia/cmds/dev/mempool.py +78 -0
  202. chia/cmds/dev/mempool_funcs.py +63 -0
  203. chia/cmds/farm_funcs.py +5 -4
  204. chia/cmds/init_funcs.py +11 -11
  205. chia/cmds/keys.py +2 -2
  206. chia/cmds/keys_funcs.py +4 -4
  207. chia/cmds/netspace_funcs.py +1 -1
  208. chia/cmds/peer_funcs.py +2 -2
  209. chia/cmds/plotnft_funcs.py +72 -26
  210. chia/cmds/rpc.py +1 -1
  211. chia/cmds/show_funcs.py +5 -5
  212. chia/cmds/signer.py +8 -7
  213. chia/cmds/sim_funcs.py +8 -9
  214. chia/cmds/wallet.py +2 -2
  215. chia/cmds/wallet_funcs.py +165 -131
  216. chia/{util → consensus}/augmented_chain.py +1 -2
  217. chia/consensus/block_body_validation.py +54 -40
  218. chia/consensus/block_creation.py +42 -76
  219. chia/consensus/block_header_validation.py +32 -26
  220. chia/consensus/block_record.py +0 -3
  221. chia/consensus/blockchain.py +23 -32
  222. chia/consensus/blockchain_interface.py +1 -5
  223. chia/consensus/check_time_locks.py +57 -0
  224. chia/consensus/coin_store_protocol.py +151 -0
  225. chia/consensus/coinbase.py +0 -6
  226. chia/consensus/condition_costs.py +4 -0
  227. chia/{util → consensus}/condition_tools.py +4 -5
  228. chia/consensus/cost_calculator.py +1 -1
  229. chia/consensus/default_constants.py +32 -9
  230. chia/consensus/deficit.py +1 -3
  231. chia/consensus/difficulty_adjustment.py +1 -2
  232. chia/consensus/find_fork_point.py +1 -3
  233. chia/consensus/full_block_to_block_record.py +1 -6
  234. chia/{util → consensus}/generator_tools.py +1 -3
  235. chia/consensus/get_block_challenge.py +30 -7
  236. chia/consensus/make_sub_epoch_summary.py +1 -5
  237. chia/consensus/multiprocess_validation.py +21 -20
  238. chia/consensus/pot_iterations.py +74 -13
  239. chia/{util → consensus}/prev_transaction_block.py +1 -1
  240. chia/consensus/vdf_info_computation.py +1 -3
  241. chia/daemon/keychain_proxy.py +5 -5
  242. chia/daemon/server.py +22 -5
  243. chia/data_layer/data_layer.py +92 -51
  244. chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
  245. chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
  246. chia/data_layer/data_layer_util.py +4 -6
  247. chia/data_layer/data_layer_wallet.py +42 -69
  248. chia/data_layer/dl_wallet_store.py +12 -6
  249. chia/data_layer/download_data.py +3 -3
  250. chia/data_layer/s3_plugin_service.py +0 -1
  251. chia/farmer/farmer.py +3 -4
  252. chia/farmer/farmer_api.py +11 -7
  253. chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
  254. chia/full_node/block_height_map.py +7 -6
  255. chia/full_node/block_store.py +5 -7
  256. chia/full_node/bundle_tools.py +1 -2
  257. chia/full_node/coin_store.py +143 -124
  258. chia/{types → full_node}/eligible_coin_spends.py +39 -70
  259. chia/full_node/fee_estimator.py +1 -1
  260. chia/full_node/fee_estimator_interface.py +0 -8
  261. chia/full_node/fee_tracker.py +25 -25
  262. chia/full_node/full_node.py +70 -53
  263. chia/full_node/full_node_api.py +57 -40
  264. chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
  265. chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
  266. chia/full_node/full_node_store.py +23 -8
  267. chia/full_node/mempool.py +206 -53
  268. chia/full_node/mempool_check_conditions.py +20 -63
  269. chia/full_node/mempool_manager.py +26 -40
  270. chia/full_node/subscriptions.py +1 -3
  271. chia/full_node/tx_processing_queue.py +50 -3
  272. chia/full_node/weight_proof.py +46 -37
  273. chia/harvester/harvester.py +1 -1
  274. chia/harvester/harvester_api.py +22 -7
  275. chia/introducer/introducer.py +1 -1
  276. chia/introducer/introducer_api.py +1 -1
  277. chia/plot_sync/exceptions.py +1 -1
  278. chia/plot_sync/receiver.py +1 -1
  279. chia/plot_sync/sender.py +2 -2
  280. chia/pools/pool_puzzles.py +13 -18
  281. chia/pools/pool_wallet.py +23 -46
  282. chia/protocols/farmer_protocol.py +11 -3
  283. chia/protocols/full_node_protocol.py +1 -4
  284. chia/protocols/harvester_protocol.py +3 -3
  285. chia/protocols/pool_protocol.py +1 -2
  286. chia/protocols/shared_protocol.py +3 -3
  287. chia/protocols/timelord_protocol.py +1 -3
  288. chia/protocols/wallet_protocol.py +3 -3
  289. chia/rpc/rpc_client.py +7 -8
  290. chia/rpc/rpc_server.py +3 -3
  291. chia/rpc/util.py +3 -1
  292. chia/seeder/crawler.py +1 -1
  293. chia/seeder/crawler_api.py +1 -1
  294. chia/seeder/dns_server.py +2 -0
  295. chia/seeder/start_crawler.py +3 -3
  296. chia/server/address_manager.py +286 -38
  297. chia/server/address_manager_store.py +0 -215
  298. chia/{types → server}/aliases.py +7 -7
  299. chia/server/api_protocol.py +1 -1
  300. chia/server/chia_policy.py +1 -1
  301. chia/server/node_discovery.py +76 -113
  302. chia/server/rate_limits.py +1 -1
  303. chia/server/resolve_peer_info.py +43 -0
  304. chia/server/server.py +5 -5
  305. chia/server/start_data_layer.py +4 -4
  306. chia/server/start_farmer.py +5 -4
  307. chia/server/start_full_node.py +5 -4
  308. chia/server/start_harvester.py +7 -5
  309. chia/server/start_introducer.py +2 -2
  310. chia/server/start_service.py +1 -1
  311. chia/server/start_timelord.py +7 -5
  312. chia/server/start_wallet.py +7 -5
  313. chia/server/ws_connection.py +1 -1
  314. chia/simulator/add_blocks_in_batches.py +2 -2
  315. chia/simulator/block_tools.py +245 -201
  316. chia/simulator/full_node_simulator.py +38 -10
  317. chia/simulator/setup_services.py +12 -12
  318. chia/simulator/simulator_full_node_rpc_api.py +2 -2
  319. chia/simulator/simulator_full_node_rpc_client.py +2 -2
  320. chia/simulator/simulator_test_tools.py +2 -2
  321. chia/simulator/start_simulator.py +1 -1
  322. chia/simulator/wallet_tools.py +10 -18
  323. chia/ssl/create_ssl.py +1 -1
  324. chia/timelord/iters_from_block.py +14 -14
  325. chia/timelord/timelord.py +15 -11
  326. chia/timelord/timelord_api.py +14 -2
  327. chia/timelord/timelord_state.py +20 -14
  328. chia/types/blockchain_format/program.py +53 -10
  329. chia/types/blockchain_format/proof_of_space.py +73 -19
  330. chia/types/coin_spend.py +3 -56
  331. chia/types/generator_types.py +28 -0
  332. chia/types/internal_mempool_item.py +1 -2
  333. chia/types/mempool_item.py +12 -7
  334. chia/types/unfinished_header_block.py +1 -2
  335. chia/types/validation_state.py +1 -2
  336. chia/types/weight_proof.py +1 -3
  337. chia/util/action_scope.py +3 -3
  338. chia/util/block_cache.py +1 -2
  339. chia/util/byte_types.py +1 -1
  340. chia/util/casts.py +21 -0
  341. chia/util/config.py +0 -37
  342. chia/util/db_wrapper.py +8 -1
  343. chia/util/errors.py +3 -2
  344. chia/util/initial-config.yaml +21 -5
  345. chia/util/keychain.py +6 -7
  346. chia/util/keyring_wrapper.py +5 -5
  347. chia/util/limited_semaphore.py +1 -1
  348. chia/util/priority_mutex.py +1 -1
  349. chia/util/streamable.py +63 -5
  350. chia/util/task_timing.py +1 -1
  351. chia/util/virtual_project_analysis.py +1 -1
  352. chia/wallet/cat_wallet/cat_info.py +7 -3
  353. chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
  354. chia/wallet/cat_wallet/cat_utils.py +1 -1
  355. chia/wallet/cat_wallet/cat_wallet.py +44 -36
  356. chia/wallet/cat_wallet/lineage_store.py +7 -0
  357. chia/wallet/cat_wallet/r_cat_wallet.py +274 -0
  358. chia/wallet/conditions.py +5 -10
  359. chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
  360. chia/wallet/derivation_record.py +33 -0
  361. chia/wallet/derive_keys.py +3 -3
  362. chia/wallet/did_wallet/did_info.py +12 -3
  363. chia/wallet/did_wallet/did_wallet.py +132 -101
  364. chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
  365. chia/wallet/driver_protocol.py +3 -1
  366. chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
  367. chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
  368. chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
  369. chia/wallet/nft_wallet/nft_wallet.py +69 -112
  370. chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
  371. chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
  372. chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
  373. chia/wallet/nft_wallet/uncurry_nft.py +4 -6
  374. chia/wallet/notification_manager.py +2 -3
  375. chia/wallet/outer_puzzles.py +7 -2
  376. chia/wallet/puzzle_drivers.py +1 -1
  377. chia/wallet/puzzles/clawback/drivers.py +5 -4
  378. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
  379. chia/wallet/puzzles/singleton_top_layer.py +2 -1
  380. chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
  381. chia/wallet/puzzles/tails.py +1 -3
  382. chia/wallet/signer_protocol.py +5 -6
  383. chia/wallet/singleton.py +5 -4
  384. chia/wallet/singleton_record.py +1 -1
  385. chia/wallet/trade_manager.py +18 -20
  386. chia/wallet/trade_record.py +3 -6
  387. chia/wallet/trading/offer.py +12 -13
  388. chia/wallet/uncurried_puzzle.py +2 -2
  389. chia/wallet/util/compute_additions.py +58 -0
  390. chia/wallet/util/compute_hints.py +3 -3
  391. chia/wallet/util/compute_memos.py +4 -4
  392. chia/wallet/util/curry_and_treehash.py +2 -1
  393. chia/wallet/util/debug_spend_bundle.py +1 -1
  394. chia/wallet/util/merkle_tree.py +1 -1
  395. chia/wallet/util/peer_request_cache.py +1 -2
  396. chia/wallet/util/tx_config.py +3 -8
  397. chia/wallet/util/wallet_sync_utils.py +10 -5
  398. chia/wallet/util/wallet_types.py +1 -0
  399. chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
  400. chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
  401. chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
  402. chia/wallet/vc_wallet/vc_drivers.py +50 -8
  403. chia/wallet/vc_wallet/vc_store.py +3 -5
  404. chia/wallet/vc_wallet/vc_wallet.py +15 -22
  405. chia/wallet/wallet.py +36 -46
  406. chia/wallet/wallet_action_scope.py +73 -4
  407. chia/wallet/wallet_blockchain.py +1 -3
  408. chia/wallet/wallet_interested_store.py +1 -1
  409. chia/wallet/wallet_nft_store.py +3 -3
  410. chia/wallet/wallet_node.py +17 -16
  411. chia/wallet/wallet_node_api.py +4 -5
  412. chia/wallet/wallet_pool_store.py +1 -1
  413. chia/wallet/wallet_protocol.py +2 -0
  414. chia/wallet/wallet_puzzle_store.py +1 -1
  415. chia/{rpc → wallet}/wallet_request_types.py +670 -81
  416. chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
  417. chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
  418. chia/wallet/wallet_singleton_store.py +8 -7
  419. chia/wallet/wallet_spend_bundle.py +4 -3
  420. chia/wallet/wallet_state_manager.py +320 -191
  421. chia/wallet/wallet_weight_proof_handler.py +1 -2
  422. chia/wallet/wsm_apis.py +98 -0
  423. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/METADATA +7 -7
  424. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/RECORD +443 -436
  425. mozilla-ca/cacert.pem +3 -165
  426. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
  427. chia/cmds/dev.py +0 -18
  428. chia/types/blockchain_format/slots.py +0 -9
  429. chia/types/blockchain_format/sub_epoch_summary.py +0 -5
  430. chia/types/end_of_slot_bundle.py +0 -5
  431. chia/types/full_block.py +0 -5
  432. chia/types/header_block.py +0 -5
  433. chia/types/spend_bundle_conditions.py +0 -7
  434. chia/types/transaction_queue_entry.py +0 -56
  435. chia/types/unfinished_block.py +0 -5
  436. /chia/cmds/{installers.py → dev/installers.py} +0 -0
  437. /chia/cmds/{sim.py → dev/sim.py} +0 -0
  438. /chia/{util → cmds}/dump_keyring.py +0 -0
  439. /chia/{full_node → consensus}/signage_point.py +0 -0
  440. /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
  441. /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
  442. /chia/{util → full_node}/full_block_utils.py +0 -0
  443. /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
  444. /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
  445. /chia/{full_node → protocols}/fee_estimate.py +0 -0
  446. /chia/{server → protocols}/outbound_message.py +0 -0
  447. /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
  448. /chia/{util → simulator}/vdf_prover.py +0 -0
  449. /chia/{util → ssl}/ssl_check.py +0 -0
  450. /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
  451. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/LICENSE +0 -0
  452. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/WHEEL +0 -0
  453. {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/entry_points.txt +0 -0
@@ -5,433 +5,473 @@ import logging
5
5
  import time
6
6
 
7
7
  import pytest
8
- from chia_rs.sized_ints import uint16
8
+ from chia_rs import ConsensusConstants, FullBlock, SubEpochSummary
9
+ from chia_rs.sized_ints import uint16, uint32, uint64
9
10
 
11
+ from chia._tests.conftest import ConsensusMode
10
12
  from chia._tests.core.node_height import node_height_between, node_height_exactly
11
13
  from chia._tests.util.time_out_assert import time_out_assert
12
14
  from chia.full_node.full_node_api import FullNodeAPI
13
15
  from chia.protocols import full_node_protocol
14
16
  from chia.protocols.shared_protocol import Capability
15
- from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
16
- from chia.types.full_block import FullBlock
17
+ from chia.server.server import ChiaServer
18
+ from chia.simulator.block_tools import BlockTools
17
19
  from chia.types.peer_info import PeerInfo
18
20
  from chia.util.hash import std_hash
19
21
 
20
22
  log = logging.getLogger(__name__)
21
23
 
22
24
 
23
- class TestFullSync:
24
- @pytest.mark.anyio
25
- async def test_long_sync_from_zero(self, five_nodes, default_400_blocks, bt, self_hostname):
26
- # Must be larger than "sync_block_behind_threshold" in the config
27
- num_blocks = len(default_400_blocks)
28
- blocks: list[FullBlock] = default_400_blocks
29
- full_node_1, full_node_2, full_node_3, full_node_4, full_node_5 = five_nodes
30
- server_1 = full_node_1.full_node.server
31
- server_2 = full_node_2.full_node.server
32
- server_3 = full_node_3.full_node.server
33
- server_4 = full_node_4.full_node.server
34
- server_5 = full_node_5.full_node.server
35
-
36
- # If this constant is changed, update the tests to use more blocks
37
- assert bt.constants.WEIGHT_PROOF_RECENT_BLOCKS < 400
38
-
39
- # Syncs up less than recent blocks
40
- for block in blocks[: bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5]:
25
+ @pytest.mark.anyio
26
+ async def test_long_sync_from_zero(
27
+ five_nodes: list[FullNodeAPI], default_400_blocks: list[FullBlock], bt: BlockTools, self_hostname: str
28
+ ) -> None:
29
+ # Must be larger than "sync_block_behind_threshold" in the config
30
+ num_blocks = len(default_400_blocks)
31
+ blocks: list[FullBlock] = default_400_blocks
32
+ full_node_1, full_node_2, full_node_3, full_node_4, full_node_5 = five_nodes
33
+ server_1 = full_node_1.full_node.server
34
+ server_2 = full_node_2.full_node.server
35
+ server_3 = full_node_3.full_node.server
36
+ server_4 = full_node_4.full_node.server
37
+ server_5 = full_node_5.full_node.server
38
+
39
+ # If this constant is changed, update the tests to use more blocks
40
+ assert bt.constants.WEIGHT_PROOF_RECENT_BLOCKS < 400
41
+
42
+ # Syncs up less than recent blocks
43
+ for block in blocks[: bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5]:
44
+ await full_node_1.full_node.add_block(block)
45
+
46
+ await server_2.start_client(
47
+ PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_2.full_node.on_connect
48
+ )
49
+
50
+ timeout_seconds = 250
51
+
52
+ # The second node should eventually catch up to the first one
53
+ await time_out_assert(
54
+ timeout_seconds, node_height_exactly, True, full_node_2, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5 - 1
55
+ )
56
+
57
+ for block in blocks[bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5 : bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5]:
58
+ await full_node_1.full_node.add_block(block)
59
+
60
+ await server_3.start_client(
61
+ PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_3.full_node.on_connect
62
+ )
63
+
64
+ # Node 3 and Node 2 sync up to node 1
65
+ await time_out_assert(
66
+ timeout_seconds, node_height_exactly, True, full_node_2, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 - 1
67
+ )
68
+ await time_out_assert(
69
+ timeout_seconds, node_height_exactly, True, full_node_3, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 - 1
70
+ )
71
+
72
+ cons = list(server_1.all_connections.values())[:]
73
+ for con in cons:
74
+ await con.close()
75
+ for block in blocks[bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 :]:
76
+ await full_node_1.full_node.add_block(block)
77
+
78
+ await server_2.start_client(
79
+ PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_2.full_node.on_connect
80
+ )
81
+ await server_3.start_client(
82
+ PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_3.full_node.on_connect
83
+ )
84
+ await server_4.start_client(
85
+ PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_4.full_node.on_connect
86
+ )
87
+ await server_3.start_client(
88
+ PeerInfo(self_hostname, server_2.get_port()), on_connect=full_node_3.full_node.on_connect
89
+ )
90
+ await server_4.start_client(
91
+ PeerInfo(self_hostname, server_3.get_port()), on_connect=full_node_4.full_node.on_connect
92
+ )
93
+ await server_4.start_client(
94
+ PeerInfo(self_hostname, server_2.get_port()), on_connect=full_node_4.full_node.on_connect
95
+ )
96
+
97
+ # All four nodes are synced
98
+ await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_1, num_blocks - 1)
99
+ await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_2, num_blocks - 1)
100
+ await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_3, num_blocks - 1)
101
+ await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_4, num_blocks - 1)
102
+
103
+ # Deep reorg, fall back from batch sync to long sync
104
+ blocks_node_5 = bt.get_consecutive_blocks(60, block_list_input=blocks[:350], seed=b"node5")
105
+ for block in blocks_node_5:
106
+ await full_node_5.full_node.add_block(block)
107
+ await server_5.start_client(
108
+ PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_5.full_node.on_connect
109
+ )
110
+ await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_5, 409)
111
+ await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_1, 409)
112
+
113
+
114
+ @pytest.mark.anyio
115
+ async def test_sync_from_fork_point_and_weight_proof(
116
+ three_nodes: list[FullNodeAPI],
117
+ default_1000_blocks: list[FullBlock],
118
+ default_400_blocks: list[FullBlock],
119
+ self_hostname: str,
120
+ ) -> None:
121
+ # Must be larger than "sync_block_behind_threshold" in the config
122
+ num_blocks_initial = len(default_1000_blocks) - 50
123
+ blocks_950 = default_1000_blocks[:num_blocks_initial]
124
+ blocks_rest = default_1000_blocks[num_blocks_initial:]
125
+ blocks_400 = default_400_blocks
126
+ full_node_1, full_node_2, full_node_3 = three_nodes
127
+ server_1 = full_node_1.full_node.server
128
+ server_2 = full_node_2.full_node.server
129
+ server_3 = full_node_3.full_node.server
130
+
131
+ for block in blocks_950:
132
+ await full_node_1.full_node.add_block(block)
133
+
134
+ # Node 2 syncs from halfway
135
+ for i in range(int(len(default_1000_blocks) / 2)):
136
+ await full_node_2.full_node.add_block(default_1000_blocks[i])
137
+
138
+ # Node 3 syncs from a different blockchain
139
+ for block in blocks_400:
140
+ await full_node_3.full_node.add_block(block)
141
+
142
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
143
+ await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
144
+
145
+ # Also test request proof of weight
146
+ # Have the request header hash
147
+ res = await full_node_1.request_proof_of_weight(
148
+ full_node_protocol.RequestProofOfWeight(uint32(blocks_950[-1].height + 1), blocks_950[-1].header_hash)
149
+ )
150
+ assert res is not None
151
+ assert full_node_1.full_node.weight_proof_handler is not None
152
+ validated, _, _ = await full_node_1.full_node.weight_proof_handler.validate_weight_proof(
153
+ full_node_protocol.RespondProofOfWeight.from_bytes(res.data).wp
154
+ )
155
+ assert validated
156
+
157
+ # Don't have the request header hash
158
+ res = await full_node_1.request_proof_of_weight(
159
+ full_node_protocol.RequestProofOfWeight(uint32(blocks_950[-1].height + 1), std_hash(b"12"))
160
+ )
161
+ assert res is None
162
+
163
+ # The second node should eventually catch up to the first one, and have the
164
+ # same tip at height num_blocks - 1
165
+ await time_out_assert(300, node_height_exactly, True, full_node_2, num_blocks_initial - 1)
166
+ await time_out_assert(180, node_height_exactly, True, full_node_3, num_blocks_initial - 1)
167
+
168
+ def fn3_is_not_syncing() -> bool:
169
+ return not full_node_3.full_node.sync_store.get_sync_mode()
170
+
171
+ await time_out_assert(180, fn3_is_not_syncing)
172
+ cons = list(server_1.all_connections.values())[:]
173
+ for con in cons:
174
+ await con.close()
175
+ for block in blocks_rest:
176
+ await full_node_3.full_node.add_block(block)
177
+ peak = full_node_3.full_node.blockchain.get_peak()
178
+ assert peak is not None
179
+ assert peak.height >= block.height
180
+
181
+ peak = full_node_3.full_node.blockchain.get_peak()
182
+ assert peak is not None
183
+ log.warning(f"FN3 height {peak.height}")
184
+
185
+ # TODO: fix this flaky test
186
+ await time_out_assert(180, node_height_exactly, True, full_node_3, 999)
187
+
188
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
189
+ await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
190
+ await server_3.start_client(PeerInfo(self_hostname, server_2.get_port()), full_node_3.full_node.on_connect)
191
+ await time_out_assert(180, node_height_exactly, True, full_node_1, 999)
192
+ await time_out_assert(180, node_height_exactly, True, full_node_2, 999)
193
+
194
+
195
+ @pytest.mark.anyio
196
+ async def test_batch_sync(
197
+ two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
198
+ ) -> None:
199
+ # Must be below "sync_block_behind_threshold" in the config
200
+ num_blocks = 20
201
+ num_blocks_2 = 9
202
+ full_node_1, full_node_2, server_1, server_2, bt = two_nodes
203
+ blocks = bt.get_consecutive_blocks(num_blocks)
204
+ blocks_2 = bt.get_consecutive_blocks(num_blocks_2, seed=b"123")
205
+
206
+ # 12 blocks to node_1
207
+ for block in blocks:
208
+ await full_node_1.full_node.add_block(block)
209
+
210
+ # 9 different blocks to node_2
211
+ for block in blocks_2:
212
+ await full_node_2.full_node.add_block(block)
213
+
214
+ await server_2.start_client(
215
+ PeerInfo(self_hostname, server_1.get_port()),
216
+ on_connect=full_node_2.full_node.on_connect,
217
+ )
218
+ await time_out_assert(60, node_height_exactly, True, full_node_2, num_blocks - 1)
219
+
220
+
221
+ @pytest.mark.anyio
222
+ async def test_backtrack_sync_1(
223
+ two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
224
+ ) -> None:
225
+ full_node_1, full_node_2, server_1, server_2, bt = two_nodes
226
+ blocks = bt.get_consecutive_blocks(1, skip_slots=1)
227
+ blocks = bt.get_consecutive_blocks(1, blocks, skip_slots=0)
228
+ blocks = bt.get_consecutive_blocks(1, blocks, skip_slots=0)
229
+
230
+ # 3 blocks to node_1 in different sub slots
231
+ for block in blocks:
232
+ await full_node_1.full_node.add_block(block)
233
+
234
+ await server_2.start_client(
235
+ PeerInfo(self_hostname, server_1.get_port()),
236
+ on_connect=full_node_2.full_node.on_connect,
237
+ )
238
+ await time_out_assert(60, node_height_exactly, True, full_node_2, 2)
239
+
240
+
241
+ @pytest.mark.anyio
242
+ async def test_backtrack_sync_2(
243
+ two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
244
+ ) -> None:
245
+ full_node_1, full_node_2, server_1, server_2, bt = two_nodes
246
+ blocks = bt.get_consecutive_blocks(1, skip_slots=3)
247
+ blocks = bt.get_consecutive_blocks(8, blocks, skip_slots=0)
248
+
249
+ # 3 blocks to node_1 in different sub slots
250
+ for block in blocks:
251
+ await full_node_1.full_node.add_block(block)
252
+
253
+ await server_2.start_client(
254
+ PeerInfo(self_hostname, server_1.get_port()),
255
+ on_connect=full_node_2.full_node.on_connect,
256
+ )
257
+ await time_out_assert(60, node_height_exactly, True, full_node_2, 8)
258
+
259
+
260
+ @pytest.mark.anyio
261
+ async def test_close_height_but_big_reorg(three_nodes: list[FullNodeAPI], bt: BlockTools, self_hostname: str) -> None:
262
+ blocks_a = bt.get_consecutive_blocks(50)
263
+ blocks_b = bt.get_consecutive_blocks(51, seed=b"B")
264
+ blocks_c = bt.get_consecutive_blocks(90, seed=b"C")
265
+ full_node_1, full_node_2, full_node_3 = three_nodes
266
+ server_1 = full_node_1.full_node.server
267
+ server_2 = full_node_2.full_node.server
268
+ server_3 = full_node_3.full_node.server
269
+
270
+ for block in blocks_a:
271
+ await full_node_1.full_node.add_block(block)
272
+ for block in blocks_b:
273
+ await full_node_2.full_node.add_block(block)
274
+ for block in blocks_c:
275
+ await full_node_3.full_node.add_block(block)
276
+
277
+ await server_2.start_client(
278
+ PeerInfo(self_hostname, server_1.get_port()),
279
+ on_connect=full_node_2.full_node.on_connect,
280
+ )
281
+ await time_out_assert(80, node_height_exactly, True, full_node_1, 50)
282
+ await time_out_assert(80, node_height_exactly, True, full_node_2, 50)
283
+ await time_out_assert(80, node_height_exactly, True, full_node_3, 89)
284
+
285
+ await server_3.start_client(
286
+ PeerInfo(self_hostname, server_1.get_port()),
287
+ on_connect=full_node_3.full_node.on_connect,
288
+ )
289
+
290
+ await server_3.start_client(
291
+ PeerInfo(self_hostname, server_2.get_port()),
292
+ on_connect=full_node_3.full_node.on_connect,
293
+ )
294
+ await time_out_assert(80, node_height_exactly, True, full_node_1, 89)
295
+ await time_out_assert(80, node_height_exactly, True, full_node_2, 89)
296
+ await time_out_assert(80, node_height_exactly, True, full_node_3, 89)
297
+
298
+
299
+ @pytest.mark.anyio
300
+ async def test_sync_bad_peak_while_synced(
301
+ three_nodes: list[FullNodeAPI],
302
+ default_1000_blocks: list[FullBlock],
303
+ default_1500_blocks: list[FullBlock],
304
+ self_hostname: str,
305
+ ) -> None:
306
+ # Must be larger than "sync_block_behind_threshold" in the config
307
+ num_blocks_initial = len(default_1000_blocks) - 250
308
+ blocks_750 = default_1000_blocks[:num_blocks_initial]
309
+ full_node_1, full_node_2, full_node_3 = three_nodes
310
+ server_1 = full_node_1.full_node.server
311
+ server_2 = full_node_2.full_node.server
312
+ server_3 = full_node_3.full_node.server
313
+ full_node_3.full_node.weight_proof_handler = None
314
+ for block in blocks_750:
315
+ await full_node_1.full_node.add_block(block)
316
+ # Node 3 syncs from a different blockchain
317
+
318
+ for block in default_1500_blocks[:1100]:
319
+ await full_node_3.full_node.add_block(block)
320
+
321
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
322
+
323
+ # The second node should eventually catch up to the first one, and have the
324
+ # same tip at height num_blocks - 1
325
+ await time_out_assert(180, node_height_exactly, True, full_node_2, num_blocks_initial - 1)
326
+ # set new heavy peak, fn3 cannot serve wp's
327
+ # node 2 should keep being synced and receive blocks
328
+ await server_3.start_client(PeerInfo(self_hostname, server_3.get_port()), full_node_3.full_node.on_connect)
329
+ # trigger long sync in full node 2
330
+ peak_block = default_1500_blocks[1050]
331
+ await server_2.start_client(PeerInfo(self_hostname, server_3.get_port()), full_node_2.full_node.on_connect)
332
+ con = server_2.all_connections[full_node_3.full_node.server.node_id]
333
+ peak = full_node_protocol.NewPeak(
334
+ peak_block.header_hash,
335
+ peak_block.height,
336
+ peak_block.weight,
337
+ peak_block.height,
338
+ peak_block.reward_chain_block.get_unfinished().get_hash(),
339
+ )
340
+ await full_node_2.full_node.new_peak(peak, con)
341
+ await asyncio.sleep(2)
342
+ assert not full_node_2.full_node.sync_store.get_sync_mode()
343
+ for block in default_1000_blocks[1000 - num_blocks_initial :]:
344
+ await full_node_2.full_node.add_block(block)
345
+
346
+ assert node_height_exactly(full_node_2, uint32(999))
347
+
348
+
349
+ @pytest.mark.anyio
350
+ async def test_block_ses_mismatch(
351
+ two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
352
+ default_1000_blocks: list[FullBlock],
353
+ self_hostname: str,
354
+ monkeypatch: pytest.MonkeyPatch,
355
+ ) -> None:
356
+ full_node_1, full_node_2, server_1, server_2, _ = two_nodes
357
+ blocks = default_1000_blocks
358
+
359
+ # mock for full node _sync
360
+ async def async_mock() -> None:
361
+ log.info("do nothing")
362
+
363
+ with monkeypatch.context() as monkeypatch_context:
364
+ monkeypatch_context.setattr(full_node_2.full_node, "_sync", async_mock)
365
+ # load blocks into node 1
366
+ for block in blocks[:501]:
41
367
  await full_node_1.full_node.add_block(block)
42
368
 
43
- await server_2.start_client(
44
- PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_2.full_node.on_connect
45
- )
46
-
47
- timeout_seconds = 250
48
-
49
- # The second node should eventually catch up to the first one
50
- await time_out_assert(
51
- timeout_seconds, node_height_exactly, True, full_node_2, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5 - 1
52
- )
53
-
54
- for block in blocks[bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5 : bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5]:
55
- await full_node_1.full_node.add_block(block)
56
-
57
- await server_3.start_client(
58
- PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_3.full_node.on_connect
59
- )
60
-
61
- # Node 3 and Node 2 sync up to node 1
62
- await time_out_assert(
63
- timeout_seconds, node_height_exactly, True, full_node_2, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 - 1
64
- )
65
- await time_out_assert(
66
- timeout_seconds, node_height_exactly, True, full_node_3, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 - 1
67
- )
68
-
69
- cons = list(server_1.all_connections.values())[:]
70
- for con in cons:
71
- await con.close()
72
- for block in blocks[bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 :]:
73
- await full_node_1.full_node.add_block(block)
74
-
75
- await server_2.start_client(
76
- PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_2.full_node.on_connect
77
- )
78
- await server_3.start_client(
79
- PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_3.full_node.on_connect
80
- )
81
- await server_4.start_client(
82
- PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_4.full_node.on_connect
83
- )
84
- await server_3.start_client(
85
- PeerInfo(self_hostname, server_2.get_port()), on_connect=full_node_3.full_node.on_connect
86
- )
87
- await server_4.start_client(
88
- PeerInfo(self_hostname, server_3.get_port()), on_connect=full_node_4.full_node.on_connect
89
- )
90
- await server_4.start_client(
91
- PeerInfo(self_hostname, server_2.get_port()), on_connect=full_node_4.full_node.on_connect
92
- )
93
-
94
- # All four nodes are synced
95
- await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_1, num_blocks - 1)
96
- await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_2, num_blocks - 1)
97
- await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_3, num_blocks - 1)
98
- await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_4, num_blocks - 1)
99
-
100
- # Deep reorg, fall back from batch sync to long sync
101
- blocks_node_5 = bt.get_consecutive_blocks(60, block_list_input=blocks[:350], seed=b"node5")
102
- for block in blocks_node_5:
103
- await full_node_5.full_node.add_block(block)
104
- await server_5.start_client(
105
- PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_5.full_node.on_connect
106
- )
107
- await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_5, 409)
108
- await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_1, 409)
109
-
110
- @pytest.mark.anyio
111
- async def test_sync_from_fork_point_and_weight_proof(
112
- self, three_nodes, default_1000_blocks, default_400_blocks, self_hostname
113
- ):
114
- # Must be larger than "sync_block_behind_threshold" in the config
115
- num_blocks_initial = len(default_1000_blocks) - 50
116
- blocks_950 = default_1000_blocks[:num_blocks_initial]
117
- blocks_rest = default_1000_blocks[num_blocks_initial:]
118
- blocks_400 = default_400_blocks
119
- full_node_1, full_node_2, full_node_3 = three_nodes
120
- server_1 = full_node_1.full_node.server
121
- server_2 = full_node_2.full_node.server
122
- server_3 = full_node_3.full_node.server
123
-
124
- for block in blocks_950:
125
- await full_node_1.full_node.add_block(block)
126
-
127
- # Node 2 syncs from halfway
128
- for i in range(int(len(default_1000_blocks) / 2)):
129
- await full_node_2.full_node.add_block(default_1000_blocks[i])
130
-
131
- # Node 3 syncs from a different blockchain
132
- for block in blocks_400:
133
- await full_node_3.full_node.add_block(block)
134
-
135
- await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
136
- await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
137
-
138
- # Also test request proof of weight
139
- # Have the request header hash
140
- res = await full_node_1.request_proof_of_weight(
141
- full_node_protocol.RequestProofOfWeight(blocks_950[-1].height + 1, blocks_950[-1].header_hash)
142
- )
143
- assert res is not None
144
- validated, _, _ = await full_node_1.full_node.weight_proof_handler.validate_weight_proof(
145
- full_node_protocol.RespondProofOfWeight.from_bytes(res.data).wp
146
- )
147
- assert validated
148
-
149
- # Don't have the request header hash
150
- res = await full_node_1.request_proof_of_weight(
151
- full_node_protocol.RequestProofOfWeight(blocks_950[-1].height + 1, std_hash(b"12"))
152
- )
153
- assert res is None
154
-
155
- # The second node should eventually catch up to the first one, and have the
156
- # same tip at height num_blocks - 1
157
- await time_out_assert(300, node_height_exactly, True, full_node_2, num_blocks_initial - 1)
158
- await time_out_assert(180, node_height_exactly, True, full_node_3, num_blocks_initial - 1)
159
-
160
- def fn3_is_not_syncing():
161
- return not full_node_3.full_node.sync_store.get_sync_mode()
162
-
163
- await time_out_assert(180, fn3_is_not_syncing)
164
- cons = list(server_1.all_connections.values())[:]
165
- for con in cons:
166
- await con.close()
167
- for block in blocks_rest:
168
- await full_node_3.full_node.add_block(block)
169
- assert full_node_3.full_node.blockchain.get_peak().height >= block.height
170
-
171
- log.warning(f"FN3 height {full_node_3.full_node.blockchain.get_peak().height}")
172
-
173
- # TODO: fix this flaky test
174
- await time_out_assert(180, node_height_exactly, True, full_node_3, 999)
175
-
176
- await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
177
- await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
178
- await server_3.start_client(PeerInfo(self_hostname, server_2.get_port()), full_node_3.full_node.on_connect)
179
- await time_out_assert(180, node_height_exactly, True, full_node_1, 999)
180
- await time_out_assert(180, node_height_exactly, True, full_node_2, 999)
181
-
182
- @pytest.mark.anyio
183
- async def test_batch_sync(self, two_nodes, self_hostname):
184
- # Must be below "sync_block_behind_threshold" in the config
185
- num_blocks = 20
186
- num_blocks_2 = 9
187
- full_node_1, full_node_2, server_1, server_2, bt = two_nodes
188
- blocks = bt.get_consecutive_blocks(num_blocks)
189
- blocks_2 = bt.get_consecutive_blocks(num_blocks_2, seed=b"123")
190
-
191
- # 12 blocks to node_1
192
- for block in blocks:
193
- await full_node_1.full_node.add_block(block)
194
-
195
- # 9 different blocks to node_2
196
- for block in blocks_2:
197
- await full_node_2.full_node.add_block(block)
198
-
199
- await server_2.start_client(
200
- PeerInfo(self_hostname, server_1.get_port()),
201
- on_connect=full_node_2.full_node.on_connect,
202
- )
203
- await time_out_assert(60, node_height_exactly, True, full_node_2, num_blocks - 1)
204
-
205
- @pytest.mark.anyio
206
- async def test_backtrack_sync_1(self, two_nodes, self_hostname):
207
- full_node_1, full_node_2, server_1, server_2, bt = two_nodes
208
- blocks = bt.get_consecutive_blocks(1, skip_slots=1)
209
- blocks = bt.get_consecutive_blocks(1, blocks, skip_slots=0)
210
- blocks = bt.get_consecutive_blocks(1, blocks, skip_slots=0)
211
-
212
- # 3 blocks to node_1 in different sub slots
213
- for block in blocks:
214
- await full_node_1.full_node.add_block(block)
369
+ peak1 = full_node_1.full_node.blockchain.get_peak()
370
+ assert peak1 is not None
215
371
 
216
- await server_2.start_client(
217
- PeerInfo(self_hostname, server_1.get_port()),
218
- on_connect=full_node_2.full_node.on_connect,
219
- )
220
- await time_out_assert(60, node_height_exactly, True, full_node_2, 2)
221
-
222
- @pytest.mark.anyio
223
- async def test_backtrack_sync_2(self, two_nodes, self_hostname):
224
- full_node_1, full_node_2, server_1, server_2, bt = two_nodes
225
- blocks = bt.get_consecutive_blocks(1, skip_slots=3)
226
- blocks = bt.get_consecutive_blocks(8, blocks, skip_slots=0)
227
-
228
- # 3 blocks to node_1 in different sub slots
229
- for block in blocks:
230
- await full_node_1.full_node.add_block(block)
231
-
232
- await server_2.start_client(
233
- PeerInfo(self_hostname, server_1.get_port()),
234
- on_connect=full_node_2.full_node.on_connect,
235
- )
236
- await time_out_assert(60, node_height_exactly, True, full_node_2, 8)
237
-
238
- @pytest.mark.anyio
239
- async def test_close_height_but_big_reorg(self, three_nodes, bt, self_hostname):
240
- blocks_a = bt.get_consecutive_blocks(50)
241
- blocks_b = bt.get_consecutive_blocks(51, seed=b"B")
242
- blocks_c = bt.get_consecutive_blocks(90, seed=b"C")
243
- full_node_1, full_node_2, full_node_3 = three_nodes
244
- server_1 = full_node_1.full_node.server
245
- server_2 = full_node_2.full_node.server
246
- server_3 = full_node_3.full_node.server
247
-
248
- for block in blocks_a:
249
- await full_node_1.full_node.add_block(block)
250
- for block in blocks_b:
251
- await full_node_2.full_node.add_block(block)
252
- for block in blocks_c:
253
- await full_node_3.full_node.add_block(block)
254
-
255
- await server_2.start_client(
256
- PeerInfo(self_hostname, server_1.get_port()),
257
- on_connect=full_node_2.full_node.on_connect,
258
- )
259
- await time_out_assert(80, node_height_exactly, True, full_node_1, 50)
260
- await time_out_assert(80, node_height_exactly, True, full_node_2, 50)
261
- await time_out_assert(80, node_height_exactly, True, full_node_3, 89)
372
+ summary_heights = full_node_1.full_node.blockchain.get_ses_heights()
373
+ summaries: list[SubEpochSummary] = []
262
374
 
263
- await server_3.start_client(
264
- PeerInfo(self_hostname, server_1.get_port()),
265
- on_connect=full_node_3.full_node.on_connect,
266
- )
375
+ # get ses list
376
+ for sub_epoch_n, ses_height in enumerate(summary_heights):
377
+ summaries.append(full_node_1.full_node.blockchain.get_ses(ses_height))
267
378
 
268
- await server_3.start_client(
269
- PeerInfo(self_hostname, server_2.get_port()),
270
- on_connect=full_node_3.full_node.on_connect,
271
- )
272
- await time_out_assert(80, node_height_exactly, True, full_node_1, 89)
273
- await time_out_assert(80, node_height_exactly, True, full_node_2, 89)
274
- await time_out_assert(80, node_height_exactly, True, full_node_3, 89)
275
-
276
- @pytest.mark.anyio
277
- async def test_sync_bad_peak_while_synced(
278
- self, three_nodes, default_1000_blocks, default_1500_blocks, self_hostname
279
- ):
280
- # Must be larger than "sync_block_behind_threshold" in the config
281
- num_blocks_initial = len(default_1000_blocks) - 250
282
- blocks_750 = default_1000_blocks[:num_blocks_initial]
283
- full_node_1, full_node_2, full_node_3 = three_nodes
284
- server_1 = full_node_1.full_node.server
285
- server_2 = full_node_2.full_node.server
286
- server_3 = full_node_3.full_node.server
287
- full_node_3.full_node.weight_proof_handler = None
288
- for block in blocks_750:
289
- await full_node_1.full_node.add_block(block)
290
- # Node 3 syncs from a different blockchain
291
-
292
- for block in default_1500_blocks[:1100]:
293
- await full_node_3.full_node.add_block(block)
294
-
295
- await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
296
-
297
- # The second node should eventually catch up to the first one, and have the
298
- # same tip at height num_blocks - 1
299
- await time_out_assert(180, node_height_exactly, True, full_node_2, num_blocks_initial - 1)
300
- # set new heavy peak, fn3 cannot serve wp's
301
- # node 2 should keep being synced and receive blocks
302
- await server_3.start_client(PeerInfo(self_hostname, server_3.get_port()), full_node_3.full_node.on_connect)
303
- # trigger long sync in full node 2
304
- peak_block = default_1500_blocks[1050]
305
- await server_2.start_client(PeerInfo(self_hostname, server_3.get_port()), full_node_2.full_node.on_connect)
306
- con = server_2.all_connections[full_node_3.full_node.server.node_id]
307
- peak = full_node_protocol.NewPeak(
308
- peak_block.header_hash,
309
- peak_block.height,
310
- peak_block.weight,
311
- peak_block.height,
312
- peak_block.reward_chain_block.get_unfinished().get_hash(),
379
+ # change summary so check would fail on sub epoch 1
380
+ s = summaries[1]
381
+ summaries[1] = SubEpochSummary(
382
+ s.prev_subepoch_summary_hash,
383
+ s.reward_chain_hash,
384
+ s.num_blocks_overflow,
385
+ uint64(s.new_difficulty * 2) if s.new_difficulty is not None else None,
386
+ uint64(s.new_sub_slot_iters * 2) if s.new_sub_slot_iters is not None else None,
313
387
  )
314
- await full_node_2.full_node.new_peak(peak, con)
315
- await asyncio.sleep(2)
316
- assert not full_node_2.full_node.sync_store.get_sync_mode()
317
- for block in default_1000_blocks[1000 - num_blocks_initial :]:
318
- await full_node_2.full_node.add_block(block)
319
-
320
- assert node_height_exactly(full_node_2, 999)
321
-
322
- @pytest.mark.anyio
323
- async def test_block_ses_mismatch(self, two_nodes, default_1000_blocks, self_hostname, monkeypatch):
324
- full_node_1, full_node_2, server_1, server_2, _ = two_nodes
325
- blocks = default_1000_blocks
326
-
327
- # mock for full node _sync
328
- async def async_mock():
329
- log.info("do nothing")
330
-
331
- with monkeypatch.context() as monkeypatch_context:
332
- monkeypatch_context.setattr(full_node_2.full_node, "_sync", async_mock)
333
- # load blocks into node 1
334
- for block in blocks[:501]:
335
- await full_node_1.full_node.add_block(block)
336
-
337
- peak1 = full_node_1.full_node.blockchain.get_peak()
338
- assert peak1 is not None
339
-
340
- summary_heights = full_node_1.full_node.blockchain.get_ses_heights()
341
- summaries: list[SubEpochSummary] = []
342
-
343
- # get ses list
344
- for sub_epoch_n, ses_height in enumerate(summary_heights):
345
- summaries.append(full_node_1.full_node.blockchain.get_ses(ses_height))
346
-
347
- # change summary so check would fail on sub epoch 1
348
- s = summaries[1]
349
- summaries[1] = SubEpochSummary(
350
- s.prev_subepoch_summary_hash,
351
- s.reward_chain_hash,
352
- s.num_blocks_overflow,
353
- s.new_difficulty * 2,
354
- s.new_sub_slot_iters * 2,
355
- )
356
- # manually try sync with wrong sub epoch summary list
357
- await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), None)
358
-
359
- # call peer has block to populate peer_to_peak
360
- full_node_2.full_node.sync_store.peer_has_block(
361
- peak1.header_hash, full_node_1.full_node.server.node_id, peak1.weight, peak1.height, True
362
- )
363
- # sync using bad ses list
364
- await full_node_2.full_node.sync_from_fork_point(0, peak1.height, peak1.header_hash, summaries)
365
- # assert we failed somewhere between sub epoch 0 to sub epoch 1
366
- assert node_height_between(full_node_2, summary_heights[0], summary_heights[1])
367
-
368
- @pytest.mark.anyio
369
- @pytest.mark.skip("skipping until we re-enable the capability in chia.protocols.shared_protocol")
370
- async def test_sync_none_wp_response_backward_comp(self, three_nodes, default_1000_blocks, self_hostname):
371
- num_blocks_initial = len(default_1000_blocks) - 50
372
- blocks_950 = default_1000_blocks[:num_blocks_initial]
373
- full_node_1, full_node_2, full_node_3 = three_nodes
374
- server_1 = full_node_1.full_node.server
375
- server_2 = full_node_2.full_node.server
376
- server_3 = full_node_3.full_node.server
377
- server_3.set_capabilities(
378
- [
379
- (uint16(Capability.BASE.value), "1"),
380
- (uint16(Capability.BLOCK_HEADERS.value), "1"),
381
- (uint16(Capability.RATE_LIMITS_V2.value), "1"),
382
- ]
383
- )
384
-
385
- for block in blocks_950:
386
- await full_node_1.full_node.add_block(block)
387
-
388
- await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
389
- await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
388
+ # manually try sync with wrong sub epoch summary list
389
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), None)
390
390
 
391
- peers: list = [c for c in full_node_2.full_node.server.all_connections.values()]
392
- request = full_node_protocol.RequestProofOfWeight(
393
- blocks_950[-1].height + 1, default_1000_blocks[-1].header_hash
391
+ # call peer has block to populate peer_to_peak
392
+ full_node_2.full_node.sync_store.peer_has_block(
393
+ peak1.header_hash, full_node_1.full_node.server.node_id, peak1.weight, peak1.height, True
394
394
  )
395
- start = time.time()
396
- res = await peers[0].call_api(FullNodeAPI.request_proof_of_weight, request, timeout=5)
397
- assert res is None
398
- duration = time.time() - start
399
- log.info(f"result was {res}")
400
- assert duration < 1
401
-
402
- peers: list = [c for c in full_node_3.full_node.server.all_connections.values()]
403
- request = full_node_protocol.RequestProofOfWeight(
404
- blocks_950[-1].height + 1, default_1000_blocks[-1].header_hash
395
+ # sync using bad ses list
396
+ await full_node_2.full_node.sync_from_fork_point(uint32(0), peak1.height, peak1.header_hash, summaries)
397
+ # assert we failed somewhere between sub epoch 0 to sub epoch 1
398
+ assert node_height_between(full_node_2, summary_heights[0], summary_heights[1])
399
+
400
+
401
+ @pytest.mark.anyio
402
+ @pytest.mark.skip("skipping until we re-enable the capability in chia.protocols.shared_protocol")
403
+ async def test_sync_none_wp_response_backward_comp(
404
+ three_nodes: list[FullNodeAPI], default_1000_blocks: list[FullBlock], self_hostname: str
405
+ ) -> None:
406
+ num_blocks_initial = len(default_1000_blocks) - 50
407
+ blocks_950 = default_1000_blocks[:num_blocks_initial]
408
+ full_node_1, full_node_2, full_node_3 = three_nodes
409
+ server_1 = full_node_1.full_node.server
410
+ server_2 = full_node_2.full_node.server
411
+ server_3 = full_node_3.full_node.server
412
+ server_3.set_capabilities(
413
+ [
414
+ (uint16(Capability.BASE.value), "1"),
415
+ (uint16(Capability.BLOCK_HEADERS.value), "1"),
416
+ (uint16(Capability.RATE_LIMITS_V2.value), "1"),
417
+ ]
418
+ )
419
+
420
+ for block in blocks_950:
421
+ await full_node_1.full_node.add_block(block)
422
+
423
+ await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
424
+ await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
425
+
426
+ peers = [c for c in full_node_2.full_node.server.all_connections.values()]
427
+ request = full_node_protocol.RequestProofOfWeight(
428
+ uint32(blocks_950[-1].height + 1), default_1000_blocks[-1].header_hash
429
+ )
430
+ start = time.time()
431
+ res = await peers[0].call_api(FullNodeAPI.request_proof_of_weight, request, timeout=5)
432
+ assert res is None
433
+ duration = time.time() - start
434
+ log.info(f"result was {res}")
435
+ assert duration < 1
436
+
437
+ peers = [c for c in full_node_3.full_node.server.all_connections.values()]
438
+ request = full_node_protocol.RequestProofOfWeight(
439
+ uint32(blocks_950[-1].height + 1), default_1000_blocks[-1].header_hash
440
+ )
441
+ start = time.time()
442
+ res = await peers[0].call_api(FullNodeAPI.request_proof_of_weight, request, timeout=6)
443
+ assert res is None
444
+ duration = time.time() - start
445
+ assert duration > 5
446
+
447
+
448
+ @pytest.mark.anyio
449
+ async def test_bad_peak_cache_invalidation(
450
+ two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
451
+ default_1000_blocks: list[FullBlock],
452
+ blockchain_constants: ConsensusConstants,
453
+ consensus_mode: ConsensusMode,
454
+ ) -> None:
455
+ full_node_1, _full_node_2, _server_1, _server_2, bt = two_nodes
456
+
457
+ for block in default_1000_blocks[:-500]:
458
+ await full_node_1.full_node.add_block(block)
459
+
460
+ cache_size = full_node_1.full_node.config.get("bad_peak_cache_size")
461
+ assert cache_size is not None
462
+ for x in range(cache_size + 10):
463
+ blocks = bt.get_consecutive_blocks(
464
+ num_blocks=1, block_list_input=default_1000_blocks[:-500], seed=x.to_bytes(2, "big")
405
465
  )
406
- start = time.time()
407
- res = await peers[0].call_api(FullNodeAPI.request_proof_of_weight, request, timeout=6)
408
- assert res is None
409
- duration = time.time() - start
410
- assert duration > 5
411
-
412
- @pytest.mark.anyio
413
- async def test_bad_peak_cache_invalidation(
414
- self, two_nodes, default_1000_blocks, blockchain_constants, consensus_mode
415
- ):
416
- full_node_1, _full_node_2, _server_1, _server_2, bt = two_nodes
417
-
418
- for block in default_1000_blocks[:-500]:
419
- await full_node_1.full_node.add_block(block)
466
+ block = blocks[-1]
467
+ full_node_1.full_node.add_to_bad_peak_cache(block.header_hash, block.height)
420
468
 
421
- cache_size = full_node_1.full_node.config.get("bad_peak_cache_size")
422
- for x in range(cache_size + 10):
423
- blocks = bt.get_consecutive_blocks(
424
- num_blocks=1, block_list_input=default_1000_blocks[:-500], seed=x.to_bytes(2, "big")
425
- )
426
- block = blocks[-1]
427
- full_node_1.full_node.add_to_bad_peak_cache(block.header_hash, block.height)
469
+ assert len(full_node_1.full_node.bad_peak_cache) == cache_size
428
470
 
429
- assert len(full_node_1.full_node.bad_peak_cache) == cache_size
471
+ for block in default_1000_blocks[500:]:
472
+ await full_node_1.full_node.add_block(block)
430
473
 
431
- for block in default_1000_blocks[500:]:
432
- await full_node_1.full_node.add_block(block)
433
-
434
- blocks = bt.get_consecutive_blocks(num_blocks=1, block_list_input=default_1000_blocks[:-1])
435
- block = blocks[-1]
436
- full_node_1.full_node.add_to_bad_peak_cache(block.header_hash, block.height)
437
- assert len(full_node_1.full_node.bad_peak_cache) == 1
474
+ blocks = bt.get_consecutive_blocks(num_blocks=1, block_list_input=default_1000_blocks[:-1])
475
+ block = blocks[-1]
476
+ full_node_1.full_node.add_to_bad_peak_cache(block.header_hash, block.height)
477
+ assert len(full_node_1.full_node.bad_peak_cache) == 1