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
@@ -4,16 +4,13 @@ import asyncio
4
4
  import dataclasses
5
5
  import enum
6
6
  import logging
7
- import time
8
7
  import traceback
9
- from concurrent.futures import Executor
10
- from concurrent.futures.process import ProcessPoolExecutor
8
+ from concurrent.futures import Executor, ThreadPoolExecutor
11
9
  from enum import Enum
12
- from multiprocessing.context import BaseContext
13
10
  from pathlib import Path
14
- from typing import TYPE_CHECKING, ClassVar, Dict, List, Optional, Set, Tuple, cast
11
+ from typing import TYPE_CHECKING, ClassVar, Optional, cast
15
12
 
16
- from chia_rs import BLSCache
13
+ from chia_rs import additions_and_removals, get_flags_for_height_and_constants
17
14
 
18
15
  from chia.consensus.block_body_validation import ForkInfo, validate_block_body
19
16
  from chia.consensus.block_header_validation import validate_unfinished_header_block
@@ -24,11 +21,10 @@ from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_dif
24
21
  from chia.consensus.find_fork_point import lookup_fork_chain
25
22
  from chia.consensus.full_block_to_block_record import block_to_block_record
26
23
  from chia.consensus.get_block_generator import get_block_generator
27
- from chia.consensus.multiprocess_validation import PreValidationResult, _run_generator
24
+ from chia.consensus.multiprocess_validation import PreValidationResult
28
25
  from chia.full_node.block_height_map import BlockHeightMap
29
26
  from chia.full_node.block_store import BlockStore
30
27
  from chia.full_node.coin_store import CoinStore
31
- from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions
32
28
  from chia.types.blockchain_format.coin import Coin
33
29
  from chia.types.blockchain_format.sized_bytes import bytes32
34
30
  from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
@@ -40,15 +36,15 @@ from chia.types.generator_types import BlockGenerator
40
36
  from chia.types.header_block import HeaderBlock
41
37
  from chia.types.unfinished_block import UnfinishedBlock
42
38
  from chia.types.unfinished_header_block import UnfinishedHeaderBlock
39
+ from chia.types.validation_state import ValidationState
43
40
  from chia.types.weight_proof import SubEpochChallengeSegment
44
41
  from chia.util.cpu import available_logical_cores
45
- from chia.util.errors import ConsensusError, Err
42
+ from chia.util.errors import Err
46
43
  from chia.util.generator_tools import get_block_header
47
44
  from chia.util.hash import std_hash
48
45
  from chia.util.inline_executor import InlineExecutor
49
46
  from chia.util.ints import uint16, uint32, uint64, uint128
50
47
  from chia.util.priority_mutex import PriorityMutex
51
- from chia.util.setproctitle import getproctitle, setproctitle
52
48
 
53
49
  log = logging.getLogger(__name__)
54
50
 
@@ -71,12 +67,12 @@ class AddBlockResult(Enum):
71
67
  class StateChangeSummary:
72
68
  peak: BlockRecord
73
69
  fork_height: uint32
74
- rolled_back_records: List[CoinRecord]
70
+ rolled_back_records: list[CoinRecord]
75
71
  # list of coin-id, puzzle-hash pairs
76
- removals: List[Tuple[bytes32, bytes32]]
72
+ removals: list[tuple[bytes32, bytes32]]
77
73
  # new coin and hint
78
- additions: List[Tuple[Coin, Optional[bytes]]]
79
- new_rewards: List[Coin]
74
+ additions: list[tuple[Coin, Optional[bytes]]]
75
+ new_rewards: list[Coin]
80
76
 
81
77
 
82
78
  class BlockchainMutexPriority(enum.IntEnum):
@@ -97,9 +93,9 @@ class Blockchain:
97
93
  # peak of the blockchain
98
94
  _peak_height: Optional[uint32]
99
95
  # All blocks in peak path are guaranteed to be included, can include orphan blocks
100
- __block_records: Dict[bytes32, BlockRecord]
96
+ __block_records: dict[bytes32, BlockRecord]
101
97
  # all hashes of blocks in block_record by height, used for garbage collection
102
- __heights_in_cache: Dict[uint32, Set[bytes32]]
98
+ __heights_in_cache: dict[uint32, set[bytes32]]
103
99
  # maps block height (of the current heaviest chain) to block hash and sub
104
100
  # epoch summaries
105
101
  __height_map: BlockHeightMap
@@ -110,7 +106,7 @@ class Blockchain:
110
106
  # Used to verify blocks in parallel
111
107
  pool: Executor
112
108
  # Set holding seen compact proofs, in order to avoid duplicates.
113
- _seen_compact_proofs: Set[Tuple[VDFInfo, uint32]]
109
+ _seen_compact_proofs: set[tuple[VDFInfo, uint32]]
114
110
 
115
111
  # Whether blockchain is shut down or not
116
112
  _shut_down: bool
@@ -119,6 +115,8 @@ class Blockchain:
119
115
  priority_mutex: PriorityMutex[BlockchainMutexPriority]
120
116
  compact_proof_lock: asyncio.Lock
121
117
 
118
+ _log_coins: bool
119
+
122
120
  @staticmethod
123
121
  async def create(
124
122
  coin_store: CoinStore,
@@ -126,9 +124,9 @@ class Blockchain:
126
124
  consensus_constants: ConsensusConstants,
127
125
  blockchain_dir: Path,
128
126
  reserved_cores: int,
129
- multiprocessing_context: Optional[BaseContext] = None,
130
127
  *,
131
128
  single_threaded: bool = False,
129
+ log_coins: bool = False,
132
130
  ) -> Blockchain:
133
131
  """
134
132
  Initializes a blockchain with the BlockRecords from disk, assuming they have all been
@@ -136,6 +134,7 @@ class Blockchain:
136
134
  in the consensus constants config.
137
135
  """
138
136
  self = Blockchain()
137
+ self._log_coins = log_coins
139
138
  # Blocks are validated under high priority, and transactions under low priority. This guarantees blocks will
140
139
  # be validated first.
141
140
  self.priority_mutex = PriorityMutex.create(priority_type=BlockchainMutexPriority)
@@ -145,11 +144,8 @@ class Blockchain:
145
144
  else:
146
145
  cpu_count = available_logical_cores()
147
146
  num_workers = max(cpu_count - reserved_cores, 1)
148
- self.pool = ProcessPoolExecutor(
147
+ self.pool = ThreadPoolExecutor(
149
148
  max_workers=num_workers,
150
- mp_context=multiprocessing_context,
151
- initializer=setproctitle,
152
- initargs=(f"{getproctitle()}_block_validation_worker",),
153
149
  )
154
150
  log.info(f"Started {num_workers} processes for block validation")
155
151
 
@@ -267,32 +263,32 @@ class Blockchain:
267
263
  assert fork_info.peak_height == block.height - 1
268
264
  assert block.height == 0 or fork_info.peak_hash == block.prev_header_hash
269
265
 
270
- npc: Optional[NPCResult] = None
266
+ additions: list[tuple[Coin, Optional[bytes]]] = []
267
+ removals: list[Coin] = []
271
268
  if block.transactions_generator is not None:
272
269
  block_generator: Optional[BlockGenerator] = await get_block_generator(self.lookup_block_generators, block)
273
270
  assert block_generator is not None
274
271
  assert block.transactions_info is not None
275
272
  assert block.foliage_transaction_block is not None
276
- npc = get_name_puzzle_conditions(
277
- block_generator,
278
- block.transactions_info.cost,
279
- mempool_mode=False,
280
- height=block.height,
281
- constants=self.constants,
273
+ flags = get_flags_for_height_and_constants(block.height, self.constants)
274
+ additions, removals = additions_and_removals(
275
+ bytes(block.transactions_generator),
276
+ block_generator.generator_refs,
277
+ flags,
278
+ self.constants,
282
279
  )
283
- assert npc.error is None
284
280
 
285
- fork_info.include_spends(None if npc is None else npc.conds, block, block.header_hash)
281
+ fork_info.include_block(additions, removals, block, block.header_hash)
286
282
 
287
283
  async def add_block(
288
284
  self,
289
285
  block: FullBlock,
290
286
  pre_validation_result: PreValidationResult,
291
- bls_cache: Optional[BLSCache],
292
287
  sub_slot_iters: uint64,
293
- fork_info: Optional[ForkInfo] = None,
288
+ fork_info: ForkInfo,
294
289
  prev_ses_block: Optional[BlockRecord] = None,
295
- ) -> Tuple[AddBlockResult, Optional[Err], Optional[StateChangeSummary]]:
290
+ block_record: Optional[BlockRecord] = None,
291
+ ) -> tuple[AddBlockResult, Optional[Err], Optional[StateChangeSummary]]:
296
292
  """
297
293
  This method must be called under the blockchain lock
298
294
  Adds a new block into the blockchain, if it's valid and connected to the current
@@ -303,9 +299,6 @@ class Blockchain:
303
299
  Args:
304
300
  block: The FullBlock to be validated.
305
301
  pre_validation_result: A result of successful pre validation
306
- bls_cache: An optional cache of pairings that are likely to be part
307
- of the aggregate signature. If this is set, the cache will always
308
- be used (which may be slower if there are no cache hits).
309
302
  fork_info: Information about the fork chain this block is part of,
310
303
  to make validation more efficient. This is an in-out parameter.
311
304
 
@@ -345,78 +338,38 @@ class Blockchain:
345
338
 
346
339
  header_hash: bytes32 = block.header_hash
347
340
 
348
- # maybe fork_info should be mandatory to pass in, but we have a lot of
349
- # tests that make sure the Blockchain object can handle any blocks,
350
- # including orphaned ones, without any fork context
351
- if fork_info is None:
352
- block_rec = await self.get_block_record_from_db(header_hash)
353
- if block_rec is not None:
354
- self.add_block_record(block_rec)
355
- # this means we have already seen and validated this block.
356
- return AddBlockResult.ALREADY_HAVE_BLOCK, None, None
357
- elif extending_main_chain:
358
- # this is the common and efficient case where we extend the main
359
- # chain. The fork_info can be empty
360
- prev_height = block.height - 1
361
- fork_info = ForkInfo(prev_height, prev_height, block.prev_header_hash)
341
+ # passing in correct fork_info is critical for performing reorgs
342
+ # correctly, so we perform some validation of it here
343
+ assert block.height - 1 == fork_info.peak_height
344
+ assert len(fork_info.block_hashes) == fork_info.peak_height - fork_info.fork_height
345
+ if fork_info.peak_height == fork_info.fork_height:
346
+ # if fork_info is saying we're not on a fork, the previous block better
347
+ # be part of the main chain
348
+ assert block.prev_header_hash == fork_info.peak_hash
349
+ if fork_info.fork_height == -1:
350
+ assert fork_info.peak_hash == self.constants.GENESIS_CHALLENGE
362
351
  else:
363
- assert peak is not None
364
- # the block is extending a fork, and we don't have any fork_info
365
- # for it. This can potentially be quite expensive and we should
366
- # try to avoid getting here
367
-
368
- # first, collect all the block hashes of the forked chain
369
- # the block we're trying to add doesn't exist in the chain yet,
370
- # so we need to start traversing from its prev_header_hash
371
- fork_chain, fork_hash = await lookup_fork_chain(
372
- self,
373
- (peak.height, peak.header_hash),
374
- (block.height - 1, block.prev_header_hash),
375
- self.constants,
376
- )
377
- # now we know how long the fork is, and can compute the fork
378
- # height.
379
- fork_height = block.height - len(fork_chain) - 1
380
- fork_info = ForkInfo(fork_height, fork_height, fork_hash)
381
-
382
- log.warning(
383
- f"slow path in block validation. Building coin set for fork ({fork_height}, {block.height})"
384
- )
385
-
386
- # now run all the blocks of the fork to compute the additions
387
- # and removals. They are recorded in the fork_info object
388
- counter = 0
389
- start = time.monotonic()
390
- for height in range(fork_info.fork_height + 1, block.height):
391
- fork_block: Optional[FullBlock] = await self.block_store.get_full_block(fork_chain[uint32(height)])
392
- assert fork_block is not None
393
- assert fork_block.height - 1 == fork_info.peak_height
394
- assert fork_block.height == 0 or fork_block.prev_header_hash == fork_info.peak_hash
395
- await self.run_single_block(fork_block, fork_info)
396
- counter += 1
397
- end = time.monotonic()
398
- log.info(
399
- f"executed {counter} block generators in {end - start:2f} s. "
400
- f"{len(fork_info.additions_since_fork)} additions, "
401
- f"{len(fork_info.removals_since_fork)} removals"
402
- )
403
-
352
+ assert self.height_to_hash(uint32(fork_info.fork_height)) == block.prev_header_hash
404
353
  else:
405
- if extending_main_chain:
406
- fork_info.reset(block.height - 1, block.prev_header_hash)
407
-
408
- block_rec = await self.get_block_record_from_db(header_hash)
409
- if block_rec is not None:
410
- # We have already validated the block, but if it's not part of the
411
- # main chain, we still need to re-run it to update the additions and
412
- # removals in fork_info.
413
- await self.advance_fork_info(block, fork_info)
414
- fork_info.include_spends(pre_validation_result.conds, block, header_hash)
415
- self.add_block_record(block_rec)
416
- return AddBlockResult.ALREADY_HAVE_BLOCK, None, None
417
-
418
- if fork_info.peak_hash != block.prev_header_hash:
419
- await self.advance_fork_info(block, fork_info)
354
+ assert fork_info.peak_hash == block.prev_header_hash
355
+
356
+ if extending_main_chain:
357
+ fork_info.reset(block.height - 1, block.prev_header_hash)
358
+
359
+ # we dont consider block_record passed in here since it might be from
360
+ # a current sync process and not yet fully validated and commited to the DB
361
+ block_rec_from_db = await self.get_block_record_from_db(header_hash)
362
+ if block_rec_from_db is not None:
363
+ # We have already validated the block, but if it's not part of the
364
+ # main chain, we still need to re-run it to update the additions and
365
+ # removals in fork_info.
366
+ await self.advance_fork_info(block, fork_info)
367
+ fork_info.include_spends(pre_validation_result.conds, block, header_hash)
368
+ self.add_block_record(block_rec_from_db)
369
+ return AddBlockResult.ALREADY_HAVE_BLOCK, None, None
370
+
371
+ if fork_info.peak_hash != block.prev_header_hash:
372
+ await self.advance_fork_info(block, fork_info)
420
373
 
421
374
  # if these prerequisites of the fork_info aren't met, the fork_info
422
375
  # object is invalid for this block. If the caller would have passed in
@@ -424,7 +377,8 @@ class Blockchain:
424
377
  assert fork_info.peak_height == block.height - 1
425
378
  assert block.height == 0 or fork_info.peak_hash == block.prev_header_hash
426
379
 
427
- error_code, _ = await validate_block_body(
380
+ assert block.transactions_generator is None or pre_validation_result.validated_signature
381
+ error_code = await validate_block_body(
428
382
  self.constants,
429
383
  self,
430
384
  self.coin_store.get_coin_records,
@@ -432,9 +386,7 @@ class Blockchain:
432
386
  block.height,
433
387
  pre_validation_result.conds,
434
388
  fork_info,
435
- bls_cache,
436
- # If we did not already validate the signature, validate it now
437
- validate_signature=not pre_validation_result.validated_signature,
389
+ log_coins=self._log_coins,
438
390
  )
439
391
  if error_code is not None:
440
392
  return AddBlockResult.INVALID_BLOCK, error_code, None
@@ -449,18 +401,20 @@ class Blockchain:
449
401
  if not genesis and prev_block is not None:
450
402
  self.add_block_record(prev_block)
451
403
 
452
- block_record = block_to_block_record(
453
- self.constants,
454
- self,
455
- required_iters,
456
- block,
457
- sub_slot_iters=sub_slot_iters,
458
- prev_ses_block=prev_ses_block,
459
- )
404
+ if block_record is None:
405
+ block_record = block_to_block_record(
406
+ self.constants,
407
+ self,
408
+ required_iters,
409
+ block,
410
+ sub_slot_iters=sub_slot_iters,
411
+ prev_ses_block=prev_ses_block,
412
+ )
460
413
 
461
414
  # in case we fail and need to restore the blockchain state, remember the
462
415
  # peak height
463
416
  previous_peak_height = self._peak_height
417
+ prev_fork_peak = (fork_info.peak_height, fork_info.peak_hash)
464
418
 
465
419
  try:
466
420
  # Always add the block to the database
@@ -497,7 +451,8 @@ class Blockchain:
497
451
  self.remove_block_record(header_hash)
498
452
  except KeyError:
499
453
  pass
500
- fork_info.rollback(header_hash, -1 if previous_peak_height is None else previous_peak_height)
454
+ # restore fork_info to the state before adding the block
455
+ fork_info.rollback(prev_fork_peak[1], prev_fork_peak[0])
501
456
  self.block_store.rollback_cache_block(header_hash)
502
457
  self._peak_height = previous_peak_height
503
458
  log.error(
@@ -522,7 +477,7 @@ class Blockchain:
522
477
  block_record: BlockRecord,
523
478
  genesis: bool,
524
479
  fork_info: ForkInfo,
525
- ) -> Tuple[List[BlockRecord], Optional[StateChangeSummary]]:
480
+ ) -> tuple[list[BlockRecord], Optional[StateChangeSummary]]:
526
481
  """
527
482
  When a new block is added, this is called, to check if the new block is the new peak of the chain.
528
483
  This also handles reorgs by reverting blocks which are not in the heaviest chain.
@@ -531,7 +486,7 @@ class Blockchain:
531
486
  """
532
487
 
533
488
  peak = self.get_peak()
534
- rolled_back_state: Dict[bytes32, CoinRecord] = {}
489
+ rolled_back_state: dict[bytes32, CoinRecord] = {}
535
490
 
536
491
  if genesis and peak is not None:
537
492
  return [], None
@@ -543,16 +498,49 @@ class Blockchain:
543
498
  if block_record.weight == peak.weight and peak.total_iters <= block_record.total_iters:
544
499
  # this is an equal weight block but our peak has lower iterations, so we dont change the coin set
545
500
  return [], None
501
+ if block_record.weight == peak.weight:
502
+ log.info(
503
+ f"block has equal weight as our peak ({peak.weight}), but fewer "
504
+ f"total iterations {block_record.total_iters} "
505
+ f"peak: {peak.total_iters} "
506
+ f"peak-hash: {peak.header_hash}"
507
+ )
546
508
 
547
509
  if block_record.prev_hash != peak.header_hash:
548
510
  for coin_record in await self.coin_store.rollback_to_block(fork_info.fork_height):
549
511
  rolled_back_state[coin_record.name] = coin_record
512
+ if self._log_coins and len(rolled_back_state) > 0:
513
+ log.info(f"rolled back {len(rolled_back_state)} coins, to fork height {fork_info.fork_height}")
514
+ log.info(
515
+ "removed: %s",
516
+ ",".join(
517
+ [
518
+ name.hex()[0:6]
519
+ for name, state in rolled_back_state.items()
520
+ if state.confirmed_block_index == 0
521
+ ]
522
+ ),
523
+ )
524
+ log.info(
525
+ "unspent: %s",
526
+ ",".join(
527
+ [
528
+ name.hex()[0:6]
529
+ for name, state in rolled_back_state.items()
530
+ if state.confirmed_block_index != 0
531
+ ]
532
+ ),
533
+ )
550
534
 
551
535
  # Collects all blocks from fork point to new peak
552
- records_to_add: List[BlockRecord] = []
536
+ records_to_add: list[BlockRecord] = []
553
537
 
554
538
  if genesis:
555
539
  records_to_add = [block_record]
540
+ elif fork_info.block_hashes == [block_record.header_hash]:
541
+ # in the common case, we just add a block on top of the chain. Check
542
+ # for that here to avoid an unnecessary database lookup.
543
+ records_to_add = [block_record]
556
544
  else:
557
545
  records_to_add = await self.block_store.get_block_records_by_hash(fork_info.block_hashes)
558
546
 
@@ -589,6 +577,15 @@ class Blockchain:
589
577
  tx_additions,
590
578
  tx_removals,
591
579
  )
580
+ if self._log_coins and (len(tx_removals) > 0 or len(tx_additions) > 0):
581
+ log.info(
582
+ f"adding new block to coin_store "
583
+ f"(hh: {fetched_block_record.header_hash} "
584
+ f"height: {fetched_block_record.height}), {len(tx_removals)} spends"
585
+ )
586
+ log.info("rewards: %s", ",".join([add.name().hex()[0:6] for add in included_reward_coins]))
587
+ log.info("additions: %s", ",".join([add.name().hex()[0:6] for add in tx_additions]))
588
+ log.info("removals: %s", ",".join([f"{rem}"[0:6] for rem in tx_removals]))
592
589
 
593
590
  # we made it to the end successfully
594
591
  # Rollback sub_epoch_summaries
@@ -628,7 +625,7 @@ class Blockchain:
628
625
 
629
626
  async def get_sp_and_ip_sub_slots(
630
627
  self, header_hash: bytes32
631
- ) -> Optional[Tuple[Optional[EndOfSubSlotBundle], Optional[EndOfSubSlotBundle]]]:
628
+ ) -> Optional[tuple[Optional[EndOfSubSlotBundle], Optional[EndOfSubSlotBundle]]]:
632
629
  block: Optional[FullBlock] = await self.block_store.get_full_block(header_hash)
633
630
  if block is None:
634
631
  return None
@@ -679,11 +676,11 @@ class Blockchain:
679
676
  return None, ip_sub_slot
680
677
  return prev_curr.finished_sub_slots[-1], ip_sub_slot
681
678
 
682
- def get_recent_reward_challenges(self) -> List[Tuple[bytes32, uint128]]:
679
+ def get_recent_reward_challenges(self) -> list[tuple[bytes32, uint128]]:
683
680
  peak = self.get_peak()
684
681
  if peak is None:
685
682
  return []
686
- recent_rc: List[Tuple[bytes32, uint128]] = []
683
+ recent_rc: list[tuple[bytes32, uint128]] = []
687
684
  curr: Optional[BlockRecord] = peak
688
685
  while curr is not None and len(recent_rc) < 2 * self.constants.MAX_SUB_SLOT_BLOCKS:
689
686
  if curr != peak:
@@ -702,7 +699,7 @@ class Blockchain:
702
699
 
703
700
  async def validate_unfinished_block_header(
704
701
  self, block: UnfinishedBlock, skip_overflow_ss_validation: bool = True
705
- ) -> Tuple[Optional[uint64], Optional[Err]]:
702
+ ) -> tuple[Optional[uint64], Optional[Err]]:
706
703
  if len(block.transactions_generator_ref_list) > self.constants.MAX_GENERATOR_REF_LIST_SIZE:
707
704
  return None, Err.TOO_MANY_GENERATOR_REFS
708
705
 
@@ -745,13 +742,13 @@ class Blockchain:
745
742
  sub_slot_iters, difficulty = get_next_sub_slot_iters_and_difficulty(
746
743
  self.constants, len(unfinished_header_block.finished_sub_slots) > 0, prev_b, self
747
744
  )
745
+ expected_vs = ValidationState(sub_slot_iters, difficulty, None)
748
746
  required_iters, error = validate_unfinished_header_block(
749
747
  self.constants,
750
748
  self,
751
749
  unfinished_header_block,
752
750
  False,
753
- difficulty,
754
- sub_slot_iters,
751
+ expected_vs,
755
752
  skip_overflow_ss_validation,
756
753
  )
757
754
  if error is not None:
@@ -764,7 +761,7 @@ class Blockchain:
764
761
  required_iters, error = await self.validate_unfinished_block_header(block, skip_overflow_ss_validation)
765
762
 
766
763
  if error is not None:
767
- return PreValidationResult(uint16(error.value), None, None, False, uint32(0))
764
+ return PreValidationResult(uint16(error.value), None, None, uint32(0))
768
765
 
769
766
  prev_height = (
770
767
  -1
@@ -774,39 +771,22 @@ class Blockchain:
774
771
 
775
772
  fork_info = ForkInfo(prev_height, prev_height, block.prev_header_hash)
776
773
 
777
- error_code, cost_result = await validate_block_body(
774
+ conds = None if npc_result is None else npc_result.conds
775
+ error_code = await validate_block_body(
778
776
  self.constants,
779
777
  self,
780
778
  self.coin_store.get_coin_records,
781
779
  block,
782
780
  uint32(prev_height + 1),
783
- None if npc_result is None else npc_result.conds,
781
+ conds,
784
782
  fork_info,
785
- None,
786
- validate_signature=False, # Signature was already validated before calling this method, no need to validate
783
+ log_coins=self._log_coins,
787
784
  )
788
785
 
789
786
  if error_code is not None:
790
- return PreValidationResult(uint16(error_code.value), None, None, False, uint32(0))
787
+ return PreValidationResult(uint16(error_code.value), None, None, uint32(0))
791
788
 
792
- return PreValidationResult(None, required_iters, cost_result, False, uint32(0))
793
-
794
- async def run_generator(self, unfinished_block: bytes, generator: BlockGenerator, height: uint32) -> NPCResult:
795
- task = asyncio.get_running_loop().run_in_executor(
796
- self.pool,
797
- _run_generator,
798
- self.constants,
799
- unfinished_block,
800
- bytes(generator),
801
- height,
802
- )
803
- npc_result_bytes = await task
804
- if npc_result_bytes is None:
805
- raise ConsensusError(Err.UNKNOWN)
806
- ret: NPCResult = NPCResult.from_bytes(npc_result_bytes)
807
- if ret.error is not None:
808
- raise ConsensusError(Err(ret.error))
809
- return ret
789
+ return PreValidationResult(None, required_iters, conds, uint32(0))
810
790
 
811
791
  def contains_block(self, header_hash: bytes32) -> bool:
812
792
  """
@@ -825,7 +805,7 @@ class Blockchain:
825
805
  raise ValueError(f"Height is not in blockchain: {height}")
826
806
  return self.block_record(header_hash)
827
807
 
828
- def get_ses_heights(self) -> List[uint32]:
808
+ def get_ses_heights(self) -> list[uint32]:
829
809
  return self.__height_map.get_ses_heights()
830
810
 
831
811
  def get_ses(self, height: uint32) -> SubEpochSummary:
@@ -877,7 +857,7 @@ class Blockchain:
877
857
 
878
858
  if height == 0:
879
859
  break
880
- height = height - 1
860
+ height -= 1
881
861
  blocks_to_remove = self.__heights_in_cache.get(uint32(height), None)
882
862
 
883
863
  def clean_block_records(self) -> None:
@@ -895,41 +875,49 @@ class Blockchain:
895
875
  return None
896
876
  self.clean_block_record(self._peak_height - self.constants.BLOCKS_CACHE_SIZE)
897
877
 
898
- async def get_block_records_in_range(self, start: int, stop: int) -> Dict[bytes32, BlockRecord]:
878
+ async def get_block_records_in_range(self, start: int, stop: int) -> dict[bytes32, BlockRecord]:
899
879
  return await self.block_store.get_block_records_in_range(start, stop)
900
880
 
901
881
  async def get_header_blocks_in_range(
902
882
  self, start: int, stop: int, tx_filter: bool = True
903
- ) -> Dict[bytes32, HeaderBlock]:
883
+ ) -> dict[bytes32, HeaderBlock]:
904
884
  hashes = []
905
885
  for height in range(start, stop + 1):
906
886
  header_hash: Optional[bytes32] = self.height_to_hash(uint32(height))
907
887
  if header_hash is not None:
908
888
  hashes.append(header_hash)
909
889
 
910
- blocks: List[FullBlock] = []
890
+ blocks: list[FullBlock] = []
911
891
  for hash in hashes.copy():
912
892
  block = self.block_store.block_cache.get(hash)
913
893
  if block is not None:
914
894
  blocks.append(block)
915
895
  hashes.remove(hash)
916
- blocks_on_disk: List[FullBlock] = await self.block_store.get_blocks_by_hash(hashes)
896
+ blocks_on_disk: list[FullBlock] = await self.block_store.get_blocks_by_hash(hashes)
917
897
  blocks.extend(blocks_on_disk)
918
- header_blocks: Dict[bytes32, HeaderBlock] = {}
898
+ header_blocks: dict[bytes32, HeaderBlock] = {}
919
899
 
920
900
  for block in blocks:
921
901
  if self.height_to_hash(block.height) != block.header_hash:
922
902
  raise ValueError(f"Block at {block.header_hash} is no longer in the blockchain (it's in a fork)")
923
903
  if tx_filter is False:
924
- header = get_block_header(block, [], [])
925
- else:
926
- tx_additions: List[CoinRecord] = [
927
- c for c in (await self.coin_store.get_coins_added_at_height(block.height)) if not c.coinbase
928
- ]
929
- removed: List[CoinRecord] = await self.coin_store.get_coins_removed_at_height(block.height)
930
- header = get_block_header(
931
- block, [record.coin for record in tx_additions], [record.coin.name() for record in removed]
904
+ header = get_block_header(block)
905
+ elif block.transactions_generator is not None:
906
+ added_coins_records, removed_coins_records = await asyncio.gather(
907
+ self.coin_store.get_coins_added_at_height(block.height),
908
+ self.coin_store.get_coins_removed_at_height(block.height),
932
909
  )
910
+ tx_additions = [cr.coin for cr in added_coins_records if not cr.coinbase]
911
+ removed = [cr.coin.name() for cr in removed_coins_records]
912
+ header = get_block_header(block, (removed, tx_additions))
913
+ elif block.is_transaction_block():
914
+ # This is a transaction block with just reward coins.
915
+ # We're sending empty additions and removals to signal that we
916
+ # want the transactions filter to be computed.
917
+ header = get_block_header(block, ([], []))
918
+ else:
919
+ # Non transaction block.
920
+ header = get_block_header(block)
933
921
  header_blocks[header.header_hash] = header
934
922
 
935
923
  return header_blocks
@@ -937,19 +925,19 @@ class Blockchain:
937
925
  async def get_header_block_by_height(
938
926
  self, height: int, header_hash: bytes32, tx_filter: bool = True
939
927
  ) -> Optional[HeaderBlock]:
940
- header_dict: Dict[bytes32, HeaderBlock] = await self.get_header_blocks_in_range(height, height, tx_filter)
928
+ header_dict: dict[bytes32, HeaderBlock] = await self.get_header_blocks_in_range(height, height, tx_filter)
941
929
  if len(header_dict) == 0:
942
930
  return None
943
931
  if header_hash not in header_dict:
944
932
  return None
945
933
  return header_dict[header_hash]
946
934
 
947
- async def get_block_records_at(self, heights: List[uint32], batch_size: int = 900) -> List[BlockRecord]:
935
+ async def get_block_records_at(self, heights: list[uint32], batch_size: int = 900) -> list[BlockRecord]:
948
936
  """
949
937
  gets block records by height (only blocks that are part of the chain)
950
938
  """
951
- records: List[BlockRecord] = []
952
- hashes: List[bytes32] = []
939
+ records: list[BlockRecord] = []
940
+ hashes: list[bytes32] = []
953
941
  assert batch_size < self.block_store.db_wrapper.host_parameter_limit
954
942
  for height in heights:
955
943
  header_hash: Optional[bytes32] = self.height_to_hash(height)
@@ -977,7 +965,7 @@ class Blockchain:
977
965
  return ret
978
966
  return await self.block_store.get_block_record(header_hash)
979
967
 
980
- async def prev_block_hash(self, header_hashes: List[bytes32]) -> List[bytes32]:
968
+ async def prev_block_hash(self, header_hashes: list[bytes32]) -> list[bytes32]:
981
969
  """
982
970
  Given a list of block header hashes, returns the previous header hashes
983
971
  for each block, in the order they were passed in.
@@ -1014,15 +1002,15 @@ class Blockchain:
1014
1002
  self.__heights_in_cache[block_record.height].add(block_record.header_hash)
1015
1003
 
1016
1004
  async def persist_sub_epoch_challenge_segments(
1017
- self, ses_block_hash: bytes32, segments: List[SubEpochChallengeSegment]
1005
+ self, ses_block_hash: bytes32, segments: list[SubEpochChallengeSegment]
1018
1006
  ) -> None:
1019
1007
  await self.block_store.persist_sub_epoch_challenge_segments(ses_block_hash, segments)
1020
1008
 
1021
1009
  async def get_sub_epoch_challenge_segments(
1022
1010
  self,
1023
1011
  ses_block_hash: bytes32,
1024
- ) -> Optional[List[SubEpochChallengeSegment]]:
1025
- segments: Optional[List[SubEpochChallengeSegment]] = await self.block_store.get_sub_epoch_challenge_segments(
1012
+ ) -> Optional[list[SubEpochChallengeSegment]]:
1013
+ segments: Optional[list[SubEpochChallengeSegment]] = await self.block_store.get_sub_epoch_challenge_segments(
1026
1014
  ses_block_hash
1027
1015
  )
1028
1016
  if segments is None:
@@ -1040,9 +1028,8 @@ class Blockchain:
1040
1028
  self._seen_compact_proofs.add(pot_tuple)
1041
1029
  return False
1042
1030
 
1043
- async def lookup_block_generators(self, header_hash: bytes32, generator_refs: Set[uint32]) -> Dict[uint32, bytes]:
1044
-
1045
- generators: Dict[uint32, bytes] = {}
1031
+ async def lookup_block_generators(self, header_hash: bytes32, generator_refs: set[uint32]) -> dict[uint32, bytes]:
1032
+ generators: dict[uint32, bytes] = {}
1046
1033
 
1047
1034
  # if this is empty, we shouldn't have called this function to begin with
1048
1035
  assert len(generator_refs)
@@ -1071,7 +1058,7 @@ class Blockchain:
1071
1058
  if self.height_to_hash(peak_block.height) != header_hash:
1072
1059
  peak: Optional[BlockRecord] = self.get_peak()
1073
1060
  assert peak is not None
1074
- reorg_chain: Dict[uint32, bytes32]
1061
+ reorg_chain: dict[uint32, bytes32]
1075
1062
  # Then we look up blocks up to fork point one at a time, backtracking
1076
1063
  reorg_chain, _ = await lookup_fork_chain(
1077
1064
  self,