chia-blockchain 2.5.1rc1__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 (1042) hide show
  1. chia/__init__.py +10 -0
  2. chia/__main__.py +5 -0
  3. chia/_tests/README.md +53 -0
  4. chia/_tests/__init__.py +0 -0
  5. chia/_tests/blockchain/__init__.py +0 -0
  6. chia/_tests/blockchain/blockchain_test_utils.py +195 -0
  7. chia/_tests/blockchain/config.py +4 -0
  8. chia/_tests/blockchain/test_augmented_chain.py +145 -0
  9. chia/_tests/blockchain/test_blockchain.py +4202 -0
  10. chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
  11. chia/_tests/blockchain/test_build_chains.py +59 -0
  12. chia/_tests/blockchain/test_get_block_generator.py +72 -0
  13. chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
  14. chia/_tests/build-init-files.py +92 -0
  15. chia/_tests/build-job-matrix.py +204 -0
  16. chia/_tests/check_pytest_monitor_output.py +34 -0
  17. chia/_tests/check_sql_statements.py +72 -0
  18. chia/_tests/chia-start-sim +42 -0
  19. chia/_tests/clvm/__init__.py +0 -0
  20. chia/_tests/clvm/benchmark_costs.py +23 -0
  21. chia/_tests/clvm/coin_store.py +149 -0
  22. chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
  23. chia/_tests/clvm/test_clvm_step.py +37 -0
  24. chia/_tests/clvm/test_condition_codes.py +13 -0
  25. chia/_tests/clvm/test_curry_and_treehash.py +55 -0
  26. chia/_tests/clvm/test_message_conditions.py +184 -0
  27. chia/_tests/clvm/test_program.py +150 -0
  28. chia/_tests/clvm/test_puzzle_compression.py +143 -0
  29. chia/_tests/clvm/test_puzzle_drivers.py +45 -0
  30. chia/_tests/clvm/test_puzzles.py +242 -0
  31. chia/_tests/clvm/test_singletons.py +540 -0
  32. chia/_tests/clvm/test_spend_sim.py +181 -0
  33. chia/_tests/cmds/__init__.py +0 -0
  34. chia/_tests/cmds/cmd_test_utils.py +469 -0
  35. chia/_tests/cmds/config.py +3 -0
  36. chia/_tests/cmds/conftest.py +23 -0
  37. chia/_tests/cmds/test_click_types.py +200 -0
  38. chia/_tests/cmds/test_cmd_framework.py +620 -0
  39. chia/_tests/cmds/test_cmds_util.py +97 -0
  40. chia/_tests/cmds/test_daemon.py +92 -0
  41. chia/_tests/cmds/test_dev_gh.py +131 -0
  42. chia/_tests/cmds/test_farm_cmd.py +66 -0
  43. chia/_tests/cmds/test_show.py +116 -0
  44. chia/_tests/cmds/test_sim.py +207 -0
  45. chia/_tests/cmds/test_timelock_args.py +75 -0
  46. chia/_tests/cmds/test_tx_config_args.py +154 -0
  47. chia/_tests/cmds/testing_classes.py +59 -0
  48. chia/_tests/cmds/wallet/__init__.py +0 -0
  49. chia/_tests/cmds/wallet/test_consts.py +47 -0
  50. chia/_tests/cmds/wallet/test_dao.py +565 -0
  51. chia/_tests/cmds/wallet/test_did.py +403 -0
  52. chia/_tests/cmds/wallet/test_nft.py +471 -0
  53. chia/_tests/cmds/wallet/test_notifications.py +124 -0
  54. chia/_tests/cmds/wallet/test_offer.toffer +1 -0
  55. chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
  56. chia/_tests/cmds/wallet/test_vcs.py +400 -0
  57. chia/_tests/cmds/wallet/test_wallet.py +1125 -0
  58. chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
  59. chia/_tests/conftest.py +1419 -0
  60. chia/_tests/connection_utils.py +125 -0
  61. chia/_tests/core/__init__.py +0 -0
  62. chia/_tests/core/cmds/__init__.py +0 -0
  63. chia/_tests/core/cmds/test_beta.py +382 -0
  64. chia/_tests/core/cmds/test_keys.py +1734 -0
  65. chia/_tests/core/cmds/test_wallet.py +126 -0
  66. chia/_tests/core/config.py +3 -0
  67. chia/_tests/core/consensus/__init__.py +0 -0
  68. chia/_tests/core/consensus/test_block_creation.py +54 -0
  69. chia/_tests/core/consensus/test_pot_iterations.py +117 -0
  70. chia/_tests/core/custom_types/__init__.py +0 -0
  71. chia/_tests/core/custom_types/test_coin.py +107 -0
  72. chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
  73. chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
  74. chia/_tests/core/daemon/__init__.py +0 -0
  75. chia/_tests/core/daemon/config.py +4 -0
  76. chia/_tests/core/daemon/test_daemon.py +2128 -0
  77. chia/_tests/core/daemon/test_daemon_register.py +109 -0
  78. chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
  79. chia/_tests/core/data_layer/__init__.py +0 -0
  80. chia/_tests/core/data_layer/config.py +5 -0
  81. chia/_tests/core/data_layer/conftest.py +106 -0
  82. chia/_tests/core/data_layer/test_data_cli.py +56 -0
  83. chia/_tests/core/data_layer/test_data_layer.py +83 -0
  84. chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
  85. chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
  86. chia/_tests/core/data_layer/test_data_store.py +2424 -0
  87. chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
  88. chia/_tests/core/data_layer/test_plugin.py +91 -0
  89. chia/_tests/core/data_layer/util.py +233 -0
  90. chia/_tests/core/farmer/__init__.py +0 -0
  91. chia/_tests/core/farmer/config.py +3 -0
  92. chia/_tests/core/farmer/test_farmer_api.py +103 -0
  93. chia/_tests/core/full_node/__init__.py +0 -0
  94. chia/_tests/core/full_node/config.py +4 -0
  95. chia/_tests/core/full_node/dos/__init__.py +0 -0
  96. chia/_tests/core/full_node/dos/config.py +3 -0
  97. chia/_tests/core/full_node/full_sync/__init__.py +0 -0
  98. chia/_tests/core/full_node/full_sync/config.py +4 -0
  99. chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
  100. chia/_tests/core/full_node/ram_db.py +27 -0
  101. chia/_tests/core/full_node/stores/__init__.py +0 -0
  102. chia/_tests/core/full_node/stores/config.py +4 -0
  103. chia/_tests/core/full_node/stores/test_block_store.py +590 -0
  104. chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
  105. chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
  106. chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
  107. chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
  108. chia/_tests/core/full_node/test_address_manager.py +588 -0
  109. chia/_tests/core/full_node/test_block_height_map.py +556 -0
  110. chia/_tests/core/full_node/test_conditions.py +556 -0
  111. chia/_tests/core/full_node/test_full_node.py +2700 -0
  112. chia/_tests/core/full_node/test_generator_tools.py +82 -0
  113. chia/_tests/core/full_node/test_hint_management.py +104 -0
  114. chia/_tests/core/full_node/test_node_load.py +34 -0
  115. chia/_tests/core/full_node/test_performance.py +179 -0
  116. chia/_tests/core/full_node/test_subscriptions.py +492 -0
  117. chia/_tests/core/full_node/test_transactions.py +203 -0
  118. chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
  119. chia/_tests/core/large_block.py +2388 -0
  120. chia/_tests/core/make_block_generator.py +70 -0
  121. chia/_tests/core/mempool/__init__.py +0 -0
  122. chia/_tests/core/mempool/config.py +4 -0
  123. chia/_tests/core/mempool/test_mempool.py +3255 -0
  124. chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
  125. chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
  126. chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
  127. chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
  128. chia/_tests/core/mempool/test_mempool_performance.py +64 -0
  129. chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
  130. chia/_tests/core/node_height.py +28 -0
  131. chia/_tests/core/server/__init__.py +0 -0
  132. chia/_tests/core/server/config.py +3 -0
  133. chia/_tests/core/server/flood.py +84 -0
  134. chia/_tests/core/server/serve.py +135 -0
  135. chia/_tests/core/server/test_api_protocol.py +21 -0
  136. chia/_tests/core/server/test_capabilities.py +66 -0
  137. chia/_tests/core/server/test_dos.py +319 -0
  138. chia/_tests/core/server/test_event_loop.py +109 -0
  139. chia/_tests/core/server/test_loop.py +294 -0
  140. chia/_tests/core/server/test_node_discovery.py +73 -0
  141. chia/_tests/core/server/test_rate_limits.py +482 -0
  142. chia/_tests/core/server/test_server.py +226 -0
  143. chia/_tests/core/server/test_upnp.py +8 -0
  144. chia/_tests/core/services/__init__.py +0 -0
  145. chia/_tests/core/services/config.py +3 -0
  146. chia/_tests/core/services/test_services.py +188 -0
  147. chia/_tests/core/ssl/__init__.py +0 -0
  148. chia/_tests/core/ssl/config.py +3 -0
  149. chia/_tests/core/ssl/test_ssl.py +202 -0
  150. chia/_tests/core/test_coins.py +33 -0
  151. chia/_tests/core/test_cost_calculation.py +313 -0
  152. chia/_tests/core/test_crawler.py +175 -0
  153. chia/_tests/core/test_crawler_rpc.py +53 -0
  154. chia/_tests/core/test_daemon_rpc.py +24 -0
  155. chia/_tests/core/test_db_conversion.py +130 -0
  156. chia/_tests/core/test_db_validation.py +162 -0
  157. chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
  158. chia/_tests/core/test_filter.py +35 -0
  159. chia/_tests/core/test_full_node_rpc.py +768 -0
  160. chia/_tests/core/test_merkle_set.py +343 -0
  161. chia/_tests/core/test_program.py +47 -0
  162. chia/_tests/core/test_rpc_util.py +86 -0
  163. chia/_tests/core/test_seeder.py +420 -0
  164. chia/_tests/core/test_setproctitle.py +13 -0
  165. chia/_tests/core/util/__init__.py +0 -0
  166. chia/_tests/core/util/config.py +4 -0
  167. chia/_tests/core/util/test_block_cache.py +44 -0
  168. chia/_tests/core/util/test_cached_bls.py +57 -0
  169. chia/_tests/core/util/test_config.py +337 -0
  170. chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
  171. chia/_tests/core/util/test_files.py +391 -0
  172. chia/_tests/core/util/test_jsonify.py +146 -0
  173. chia/_tests/core/util/test_keychain.py +522 -0
  174. chia/_tests/core/util/test_keyring_wrapper.py +491 -0
  175. chia/_tests/core/util/test_lockfile.py +380 -0
  176. chia/_tests/core/util/test_log_exceptions.py +187 -0
  177. chia/_tests/core/util/test_lru_cache.py +56 -0
  178. chia/_tests/core/util/test_significant_bits.py +40 -0
  179. chia/_tests/core/util/test_streamable.py +883 -0
  180. chia/_tests/db/__init__.py +0 -0
  181. chia/_tests/db/test_db_wrapper.py +566 -0
  182. chia/_tests/environments/__init__.py +0 -0
  183. chia/_tests/environments/common.py +35 -0
  184. chia/_tests/environments/full_node.py +47 -0
  185. chia/_tests/environments/wallet.py +429 -0
  186. chia/_tests/ether.py +19 -0
  187. chia/_tests/farmer_harvester/__init__.py +0 -0
  188. chia/_tests/farmer_harvester/config.py +3 -0
  189. chia/_tests/farmer_harvester/test_farmer.py +1264 -0
  190. chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
  191. chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
  192. chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
  193. chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
  194. chia/_tests/fee_estimation/__init__.py +0 -0
  195. chia/_tests/fee_estimation/config.py +3 -0
  196. chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
  197. chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
  198. chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
  199. chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
  200. chia/_tests/generator/__init__.py +0 -0
  201. chia/_tests/generator/puzzles/__init__.py +0 -0
  202. chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
  203. chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
  204. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
  205. chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
  206. chia/_tests/generator/test_compression.py +201 -0
  207. chia/_tests/generator/test_generator_types.py +44 -0
  208. chia/_tests/generator/test_rom.py +180 -0
  209. chia/_tests/plot_sync/__init__.py +0 -0
  210. chia/_tests/plot_sync/config.py +3 -0
  211. chia/_tests/plot_sync/test_delta.py +101 -0
  212. chia/_tests/plot_sync/test_plot_sync.py +618 -0
  213. chia/_tests/plot_sync/test_receiver.py +451 -0
  214. chia/_tests/plot_sync/test_sender.py +116 -0
  215. chia/_tests/plot_sync/test_sync_simulated.py +451 -0
  216. chia/_tests/plot_sync/util.py +68 -0
  217. chia/_tests/plotting/__init__.py +0 -0
  218. chia/_tests/plotting/config.py +3 -0
  219. chia/_tests/plotting/test_plot_manager.py +781 -0
  220. chia/_tests/plotting/util.py +12 -0
  221. chia/_tests/pools/__init__.py +0 -0
  222. chia/_tests/pools/config.py +5 -0
  223. chia/_tests/pools/test_pool_cli_parsing.py +128 -0
  224. chia/_tests/pools/test_pool_cmdline.py +1001 -0
  225. chia/_tests/pools/test_pool_config.py +42 -0
  226. chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
  227. chia/_tests/pools/test_pool_rpc.py +1123 -0
  228. chia/_tests/pools/test_pool_wallet.py +205 -0
  229. chia/_tests/pools/test_wallet_pool_store.py +161 -0
  230. chia/_tests/process_junit.py +348 -0
  231. chia/_tests/rpc/__init__.py +0 -0
  232. chia/_tests/rpc/test_rpc_client.py +138 -0
  233. chia/_tests/rpc/test_rpc_server.py +183 -0
  234. chia/_tests/simulation/__init__.py +0 -0
  235. chia/_tests/simulation/config.py +6 -0
  236. chia/_tests/simulation/test_simulation.py +501 -0
  237. chia/_tests/simulation/test_simulator.py +232 -0
  238. chia/_tests/simulation/test_start_simulator.py +107 -0
  239. chia/_tests/testconfig.py +13 -0
  240. chia/_tests/timelord/__init__.py +0 -0
  241. chia/_tests/timelord/config.py +3 -0
  242. chia/_tests/timelord/test_new_peak.py +437 -0
  243. chia/_tests/timelord/test_timelord.py +11 -0
  244. chia/_tests/tools/1315537.json +170 -0
  245. chia/_tests/tools/1315544.json +160 -0
  246. chia/_tests/tools/1315630.json +150 -0
  247. chia/_tests/tools/300000.json +105 -0
  248. chia/_tests/tools/442734.json +140 -0
  249. chia/_tests/tools/466212.json +130 -0
  250. chia/_tests/tools/__init__.py +0 -0
  251. chia/_tests/tools/config.py +5 -0
  252. chia/_tests/tools/test-blockchain-db.sqlite +0 -0
  253. chia/_tests/tools/test_full_sync.py +30 -0
  254. chia/_tests/tools/test_legacy_keyring.py +82 -0
  255. chia/_tests/tools/test_run_block.py +128 -0
  256. chia/_tests/tools/test_virtual_project.py +591 -0
  257. chia/_tests/util/__init__.py +0 -0
  258. chia/_tests/util/benchmark_cost.py +170 -0
  259. chia/_tests/util/benchmarks.py +153 -0
  260. chia/_tests/util/bip39_test_vectors.json +148 -0
  261. chia/_tests/util/blockchain.py +134 -0
  262. chia/_tests/util/blockchain_mock.py +132 -0
  263. chia/_tests/util/build_network_protocol_files.py +302 -0
  264. chia/_tests/util/clvm_generator.bin +0 -0
  265. chia/_tests/util/config.py +3 -0
  266. chia/_tests/util/constants.py +20 -0
  267. chia/_tests/util/db_connection.py +37 -0
  268. chia/_tests/util/full_sync.py +253 -0
  269. chia/_tests/util/gen_ssl_certs.py +114 -0
  270. chia/_tests/util/generator_tools_testing.py +45 -0
  271. chia/_tests/util/get_name_puzzle_conditions.py +52 -0
  272. chia/_tests/util/key_tool.py +36 -0
  273. chia/_tests/util/misc.py +675 -0
  274. chia/_tests/util/network_protocol_data.py +1072 -0
  275. chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
  276. chia/_tests/util/protocol_messages_json.py +2701 -0
  277. chia/_tests/util/rpc.py +26 -0
  278. chia/_tests/util/run_block.py +163 -0
  279. chia/_tests/util/setup_nodes.py +481 -0
  280. chia/_tests/util/spend_sim.py +492 -0
  281. chia/_tests/util/split_managers.py +102 -0
  282. chia/_tests/util/temp_file.py +14 -0
  283. chia/_tests/util/test_action_scope.py +144 -0
  284. chia/_tests/util/test_async_pool.py +366 -0
  285. chia/_tests/util/test_build_job_matrix.py +42 -0
  286. chia/_tests/util/test_build_network_protocol_files.py +7 -0
  287. chia/_tests/util/test_chia_version.py +50 -0
  288. chia/_tests/util/test_collection.py +11 -0
  289. chia/_tests/util/test_condition_tools.py +229 -0
  290. chia/_tests/util/test_config.py +426 -0
  291. chia/_tests/util/test_dump_keyring.py +60 -0
  292. chia/_tests/util/test_errors.py +10 -0
  293. chia/_tests/util/test_full_block_utils.py +279 -0
  294. chia/_tests/util/test_installed.py +20 -0
  295. chia/_tests/util/test_limited_semaphore.py +53 -0
  296. chia/_tests/util/test_logging_filter.py +42 -0
  297. chia/_tests/util/test_misc.py +445 -0
  298. chia/_tests/util/test_network.py +73 -0
  299. chia/_tests/util/test_network_protocol_files.py +578 -0
  300. chia/_tests/util/test_network_protocol_json.py +267 -0
  301. chia/_tests/util/test_network_protocol_test.py +256 -0
  302. chia/_tests/util/test_paginator.py +71 -0
  303. chia/_tests/util/test_pprint.py +17 -0
  304. chia/_tests/util/test_priority_mutex.py +488 -0
  305. chia/_tests/util/test_recursive_replace.py +116 -0
  306. chia/_tests/util/test_replace_str_to_bytes.py +137 -0
  307. chia/_tests/util/test_service_groups.py +15 -0
  308. chia/_tests/util/test_ssl_check.py +31 -0
  309. chia/_tests/util/test_testnet_overrides.py +19 -0
  310. chia/_tests/util/test_tests_misc.py +38 -0
  311. chia/_tests/util/test_timing.py +37 -0
  312. chia/_tests/util/test_trusted_peer.py +51 -0
  313. chia/_tests/util/time_out_assert.py +191 -0
  314. chia/_tests/wallet/__init__.py +0 -0
  315. chia/_tests/wallet/cat_wallet/__init__.py +0 -0
  316. chia/_tests/wallet/cat_wallet/config.py +4 -0
  317. chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
  318. chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
  319. chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
  320. chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
  321. chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
  322. chia/_tests/wallet/clawback/__init__.py +0 -0
  323. chia/_tests/wallet/clawback/config.py +3 -0
  324. chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
  325. chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
  326. chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
  327. chia/_tests/wallet/config.py +4 -0
  328. chia/_tests/wallet/conftest.py +278 -0
  329. chia/_tests/wallet/dao_wallet/__init__.py +0 -0
  330. chia/_tests/wallet/dao_wallet/config.py +3 -0
  331. chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
  332. chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
  333. chia/_tests/wallet/db_wallet/__init__.py +0 -0
  334. chia/_tests/wallet/db_wallet/config.py +3 -0
  335. chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
  336. chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
  337. chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
  338. chia/_tests/wallet/did_wallet/__init__.py +0 -0
  339. chia/_tests/wallet/did_wallet/config.py +4 -0
  340. chia/_tests/wallet/did_wallet/test_did.py +2284 -0
  341. chia/_tests/wallet/nft_wallet/__init__.py +0 -0
  342. chia/_tests/wallet/nft_wallet/config.py +4 -0
  343. chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
  344. chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
  345. chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
  346. chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
  347. chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
  348. chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
  349. chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
  350. chia/_tests/wallet/rpc/__init__.py +0 -0
  351. chia/_tests/wallet/rpc/config.py +4 -0
  352. chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
  353. chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
  354. chia/_tests/wallet/simple_sync/__init__.py +0 -0
  355. chia/_tests/wallet/simple_sync/config.py +3 -0
  356. chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
  357. chia/_tests/wallet/sync/__init__.py +0 -0
  358. chia/_tests/wallet/sync/config.py +4 -0
  359. chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
  360. chia/_tests/wallet/test_address_type.py +189 -0
  361. chia/_tests/wallet/test_bech32m.py +45 -0
  362. chia/_tests/wallet/test_clvm_streamable.py +244 -0
  363. chia/_tests/wallet/test_coin_management.py +354 -0
  364. chia/_tests/wallet/test_coin_selection.py +588 -0
  365. chia/_tests/wallet/test_conditions.py +400 -0
  366. chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
  367. chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
  368. chia/_tests/wallet/test_nft_store.py +192 -0
  369. chia/_tests/wallet/test_notifications.py +196 -0
  370. chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
  371. chia/_tests/wallet/test_puzzle_store.py +132 -0
  372. chia/_tests/wallet/test_sign_coin_spends.py +159 -0
  373. chia/_tests/wallet/test_signer_protocol.py +947 -0
  374. chia/_tests/wallet/test_singleton.py +122 -0
  375. chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
  376. chia/_tests/wallet/test_singleton_store.py +152 -0
  377. chia/_tests/wallet/test_taproot.py +19 -0
  378. chia/_tests/wallet/test_transaction_store.py +945 -0
  379. chia/_tests/wallet/test_util.py +185 -0
  380. chia/_tests/wallet/test_wallet.py +2139 -0
  381. chia/_tests/wallet/test_wallet_action_scope.py +85 -0
  382. chia/_tests/wallet/test_wallet_blockchain.py +111 -0
  383. chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
  384. chia/_tests/wallet/test_wallet_interested_store.py +43 -0
  385. chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
  386. chia/_tests/wallet/test_wallet_node.py +780 -0
  387. chia/_tests/wallet/test_wallet_retry.py +95 -0
  388. chia/_tests/wallet/test_wallet_state_manager.py +259 -0
  389. chia/_tests/wallet/test_wallet_test_framework.py +275 -0
  390. chia/_tests/wallet/test_wallet_trade_store.py +218 -0
  391. chia/_tests/wallet/test_wallet_user_store.py +34 -0
  392. chia/_tests/wallet/test_wallet_utils.py +156 -0
  393. chia/_tests/wallet/vc_wallet/__init__.py +0 -0
  394. chia/_tests/wallet/vc_wallet/config.py +3 -0
  395. chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
  396. chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
  397. chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
  398. chia/_tests/wallet/wallet_block_tools.py +327 -0
  399. chia/_tests/weight_proof/__init__.py +0 -0
  400. chia/_tests/weight_proof/config.py +3 -0
  401. chia/_tests/weight_proof/test_weight_proof.py +528 -0
  402. chia/apis.py +19 -0
  403. chia/clvm/__init__.py +0 -0
  404. chia/cmds/__init__.py +0 -0
  405. chia/cmds/beta.py +184 -0
  406. chia/cmds/beta_funcs.py +137 -0
  407. chia/cmds/check_wallet_db.py +420 -0
  408. chia/cmds/chia.py +151 -0
  409. chia/cmds/cmd_classes.py +323 -0
  410. chia/cmds/cmd_helpers.py +242 -0
  411. chia/cmds/cmds_util.py +488 -0
  412. chia/cmds/coin_funcs.py +275 -0
  413. chia/cmds/coins.py +182 -0
  414. chia/cmds/completion.py +49 -0
  415. chia/cmds/configure.py +332 -0
  416. chia/cmds/dao.py +1064 -0
  417. chia/cmds/dao_funcs.py +598 -0
  418. chia/cmds/data.py +708 -0
  419. chia/cmds/data_funcs.py +385 -0
  420. chia/cmds/db.py +87 -0
  421. chia/cmds/db_backup_func.py +77 -0
  422. chia/cmds/db_upgrade_func.py +452 -0
  423. chia/cmds/db_validate_func.py +184 -0
  424. chia/cmds/dev.py +18 -0
  425. chia/cmds/farm.py +100 -0
  426. chia/cmds/farm_funcs.py +200 -0
  427. chia/cmds/gh.py +275 -0
  428. chia/cmds/init.py +63 -0
  429. chia/cmds/init_funcs.py +367 -0
  430. chia/cmds/installers.py +131 -0
  431. chia/cmds/keys.py +527 -0
  432. chia/cmds/keys_funcs.py +863 -0
  433. chia/cmds/netspace.py +50 -0
  434. chia/cmds/netspace_funcs.py +54 -0
  435. chia/cmds/options.py +32 -0
  436. chia/cmds/param_types.py +238 -0
  437. chia/cmds/passphrase.py +131 -0
  438. chia/cmds/passphrase_funcs.py +292 -0
  439. chia/cmds/peer.py +51 -0
  440. chia/cmds/peer_funcs.py +129 -0
  441. chia/cmds/plotnft.py +260 -0
  442. chia/cmds/plotnft_funcs.py +405 -0
  443. chia/cmds/plots.py +230 -0
  444. chia/cmds/plotters.py +18 -0
  445. chia/cmds/rpc.py +208 -0
  446. chia/cmds/show.py +72 -0
  447. chia/cmds/show_funcs.py +215 -0
  448. chia/cmds/signer.py +296 -0
  449. chia/cmds/sim.py +225 -0
  450. chia/cmds/sim_funcs.py +509 -0
  451. chia/cmds/start.py +24 -0
  452. chia/cmds/start_funcs.py +109 -0
  453. chia/cmds/stop.py +62 -0
  454. chia/cmds/units.py +9 -0
  455. chia/cmds/wallet.py +1901 -0
  456. chia/cmds/wallet_funcs.py +1874 -0
  457. chia/consensus/__init__.py +0 -0
  458. chia/consensus/block_body_validation.py +562 -0
  459. chia/consensus/block_creation.py +546 -0
  460. chia/consensus/block_header_validation.py +1059 -0
  461. chia/consensus/block_record.py +31 -0
  462. chia/consensus/block_rewards.py +53 -0
  463. chia/consensus/blockchain.py +1087 -0
  464. chia/consensus/blockchain_interface.py +56 -0
  465. chia/consensus/coinbase.py +30 -0
  466. chia/consensus/condition_costs.py +9 -0
  467. chia/consensus/constants.py +49 -0
  468. chia/consensus/cost_calculator.py +15 -0
  469. chia/consensus/default_constants.py +89 -0
  470. chia/consensus/deficit.py +55 -0
  471. chia/consensus/difficulty_adjustment.py +412 -0
  472. chia/consensus/find_fork_point.py +111 -0
  473. chia/consensus/full_block_to_block_record.py +167 -0
  474. chia/consensus/get_block_challenge.py +106 -0
  475. chia/consensus/get_block_generator.py +27 -0
  476. chia/consensus/make_sub_epoch_summary.py +210 -0
  477. chia/consensus/multiprocess_validation.py +268 -0
  478. chia/consensus/pos_quality.py +19 -0
  479. chia/consensus/pot_iterations.py +67 -0
  480. chia/consensus/puzzles/__init__.py +0 -0
  481. chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
  482. chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
  483. chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
  484. chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
  485. chia/consensus/vdf_info_computation.py +156 -0
  486. chia/daemon/__init__.py +0 -0
  487. chia/daemon/client.py +252 -0
  488. chia/daemon/keychain_proxy.py +502 -0
  489. chia/daemon/keychain_server.py +365 -0
  490. chia/daemon/server.py +1606 -0
  491. chia/daemon/windows_signal.py +56 -0
  492. chia/data_layer/__init__.py +0 -0
  493. chia/data_layer/data_layer.py +1291 -0
  494. chia/data_layer/data_layer_api.py +33 -0
  495. chia/data_layer/data_layer_errors.py +50 -0
  496. chia/data_layer/data_layer_server.py +170 -0
  497. chia/data_layer/data_layer_util.py +985 -0
  498. chia/data_layer/data_layer_wallet.py +1311 -0
  499. chia/data_layer/data_store.py +2267 -0
  500. chia/data_layer/dl_wallet_store.py +407 -0
  501. chia/data_layer/download_data.py +389 -0
  502. chia/data_layer/puzzles/__init__.py +0 -0
  503. chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
  504. chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
  505. chia/data_layer/s3_plugin_config.yml +33 -0
  506. chia/data_layer/s3_plugin_service.py +468 -0
  507. chia/data_layer/util/__init__.py +0 -0
  508. chia/data_layer/util/benchmark.py +107 -0
  509. chia/data_layer/util/plugin.py +40 -0
  510. chia/farmer/__init__.py +0 -0
  511. chia/farmer/farmer.py +923 -0
  512. chia/farmer/farmer_api.py +820 -0
  513. chia/full_node/__init__.py +0 -0
  514. chia/full_node/bitcoin_fee_estimator.py +85 -0
  515. chia/full_node/block_height_map.py +271 -0
  516. chia/full_node/block_store.py +576 -0
  517. chia/full_node/bundle_tools.py +19 -0
  518. chia/full_node/coin_store.py +647 -0
  519. chia/full_node/fee_estimate.py +54 -0
  520. chia/full_node/fee_estimate_store.py +24 -0
  521. chia/full_node/fee_estimation.py +92 -0
  522. chia/full_node/fee_estimator.py +90 -0
  523. chia/full_node/fee_estimator_constants.py +38 -0
  524. chia/full_node/fee_estimator_interface.py +42 -0
  525. chia/full_node/fee_history.py +25 -0
  526. chia/full_node/fee_tracker.py +564 -0
  527. chia/full_node/full_node.py +3327 -0
  528. chia/full_node/full_node_api.py +2025 -0
  529. chia/full_node/full_node_store.py +1033 -0
  530. chia/full_node/hint_management.py +56 -0
  531. chia/full_node/hint_store.py +93 -0
  532. chia/full_node/mempool.py +589 -0
  533. chia/full_node/mempool_check_conditions.py +146 -0
  534. chia/full_node/mempool_manager.py +853 -0
  535. chia/full_node/pending_tx_cache.py +112 -0
  536. chia/full_node/puzzles/__init__.py +0 -0
  537. chia/full_node/puzzles/block_program_zero.clsp +14 -0
  538. chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
  539. chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
  540. chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
  541. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
  542. chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
  543. chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
  544. chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
  545. chia/full_node/signage_point.py +16 -0
  546. chia/full_node/subscriptions.py +247 -0
  547. chia/full_node/sync_store.py +146 -0
  548. chia/full_node/tx_processing_queue.py +78 -0
  549. chia/full_node/util/__init__.py +0 -0
  550. chia/full_node/weight_proof.py +1720 -0
  551. chia/harvester/__init__.py +0 -0
  552. chia/harvester/harvester.py +272 -0
  553. chia/harvester/harvester_api.py +380 -0
  554. chia/introducer/__init__.py +0 -0
  555. chia/introducer/introducer.py +122 -0
  556. chia/introducer/introducer_api.py +70 -0
  557. chia/legacy/__init__.py +0 -0
  558. chia/legacy/keyring.py +155 -0
  559. chia/plot_sync/__init__.py +0 -0
  560. chia/plot_sync/delta.py +61 -0
  561. chia/plot_sync/exceptions.py +56 -0
  562. chia/plot_sync/receiver.py +386 -0
  563. chia/plot_sync/sender.py +340 -0
  564. chia/plot_sync/util.py +43 -0
  565. chia/plotters/__init__.py +0 -0
  566. chia/plotters/bladebit.py +388 -0
  567. chia/plotters/chiapos.py +63 -0
  568. chia/plotters/madmax.py +224 -0
  569. chia/plotters/plotters.py +577 -0
  570. chia/plotters/plotters_util.py +133 -0
  571. chia/plotting/__init__.py +0 -0
  572. chia/plotting/cache.py +213 -0
  573. chia/plotting/check_plots.py +283 -0
  574. chia/plotting/create_plots.py +278 -0
  575. chia/plotting/manager.py +436 -0
  576. chia/plotting/util.py +336 -0
  577. chia/pools/__init__.py +0 -0
  578. chia/pools/pool_config.py +110 -0
  579. chia/pools/pool_puzzles.py +459 -0
  580. chia/pools/pool_wallet.py +933 -0
  581. chia/pools/pool_wallet_info.py +118 -0
  582. chia/pools/puzzles/__init__.py +0 -0
  583. chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
  584. chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
  585. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
  586. chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
  587. chia/protocols/__init__.py +0 -0
  588. chia/protocols/farmer_protocol.py +102 -0
  589. chia/protocols/full_node_protocol.py +219 -0
  590. chia/protocols/harvester_protocol.py +216 -0
  591. chia/protocols/introducer_protocol.py +25 -0
  592. chia/protocols/pool_protocol.py +177 -0
  593. chia/protocols/protocol_message_types.py +139 -0
  594. chia/protocols/protocol_state_machine.py +87 -0
  595. chia/protocols/protocol_timing.py +8 -0
  596. chia/protocols/shared_protocol.py +86 -0
  597. chia/protocols/timelord_protocol.py +93 -0
  598. chia/protocols/wallet_protocol.py +401 -0
  599. chia/py.typed +0 -0
  600. chia/rpc/__init__.py +0 -0
  601. chia/rpc/crawler_rpc_api.py +80 -0
  602. chia/rpc/data_layer_rpc_api.py +644 -0
  603. chia/rpc/data_layer_rpc_client.py +188 -0
  604. chia/rpc/data_layer_rpc_util.py +58 -0
  605. chia/rpc/farmer_rpc_api.py +365 -0
  606. chia/rpc/farmer_rpc_client.py +86 -0
  607. chia/rpc/full_node_rpc_api.py +959 -0
  608. chia/rpc/full_node_rpc_client.py +292 -0
  609. chia/rpc/harvester_rpc_api.py +141 -0
  610. chia/rpc/harvester_rpc_client.py +54 -0
  611. chia/rpc/rpc_client.py +164 -0
  612. chia/rpc/rpc_server.py +521 -0
  613. chia/rpc/timelord_rpc_api.py +32 -0
  614. chia/rpc/util.py +93 -0
  615. chia/rpc/wallet_request_types.py +904 -0
  616. chia/rpc/wallet_rpc_api.py +4943 -0
  617. chia/rpc/wallet_rpc_client.py +1814 -0
  618. chia/seeder/__init__.py +0 -0
  619. chia/seeder/crawl_store.py +425 -0
  620. chia/seeder/crawler.py +410 -0
  621. chia/seeder/crawler_api.py +135 -0
  622. chia/seeder/dns_server.py +593 -0
  623. chia/seeder/peer_record.py +146 -0
  624. chia/seeder/start_crawler.py +92 -0
  625. chia/server/__init__.py +0 -0
  626. chia/server/address_manager.py +658 -0
  627. chia/server/address_manager_store.py +237 -0
  628. chia/server/api_protocol.py +116 -0
  629. chia/server/capabilities.py +24 -0
  630. chia/server/chia_policy.py +346 -0
  631. chia/server/introducer_peers.py +76 -0
  632. chia/server/node_discovery.py +714 -0
  633. chia/server/outbound_message.py +33 -0
  634. chia/server/rate_limit_numbers.py +214 -0
  635. chia/server/rate_limits.py +153 -0
  636. chia/server/server.py +741 -0
  637. chia/server/signal_handlers.py +120 -0
  638. chia/server/ssl_context.py +32 -0
  639. chia/server/start_data_layer.py +151 -0
  640. chia/server/start_farmer.py +98 -0
  641. chia/server/start_full_node.py +112 -0
  642. chia/server/start_harvester.py +93 -0
  643. chia/server/start_introducer.py +81 -0
  644. chia/server/start_service.py +316 -0
  645. chia/server/start_timelord.py +89 -0
  646. chia/server/start_wallet.py +113 -0
  647. chia/server/upnp.py +118 -0
  648. chia/server/ws_connection.py +766 -0
  649. chia/simulator/__init__.py +0 -0
  650. chia/simulator/add_blocks_in_batches.py +54 -0
  651. chia/simulator/block_tools.py +2054 -0
  652. chia/simulator/full_node_simulator.py +794 -0
  653. chia/simulator/keyring.py +128 -0
  654. chia/simulator/setup_services.py +506 -0
  655. chia/simulator/simulator_constants.py +13 -0
  656. chia/simulator/simulator_full_node_rpc_api.py +99 -0
  657. chia/simulator/simulator_full_node_rpc_client.py +60 -0
  658. chia/simulator/simulator_protocol.py +29 -0
  659. chia/simulator/simulator_test_tools.py +164 -0
  660. chia/simulator/socket.py +24 -0
  661. chia/simulator/ssl_certs.py +114 -0
  662. chia/simulator/ssl_certs_1.py +697 -0
  663. chia/simulator/ssl_certs_10.py +697 -0
  664. chia/simulator/ssl_certs_2.py +697 -0
  665. chia/simulator/ssl_certs_3.py +697 -0
  666. chia/simulator/ssl_certs_4.py +697 -0
  667. chia/simulator/ssl_certs_5.py +697 -0
  668. chia/simulator/ssl_certs_6.py +697 -0
  669. chia/simulator/ssl_certs_7.py +697 -0
  670. chia/simulator/ssl_certs_8.py +697 -0
  671. chia/simulator/ssl_certs_9.py +697 -0
  672. chia/simulator/start_simulator.py +143 -0
  673. chia/simulator/wallet_tools.py +246 -0
  674. chia/ssl/__init__.py +0 -0
  675. chia/ssl/chia_ca.crt +19 -0
  676. chia/ssl/chia_ca.key +28 -0
  677. chia/ssl/create_ssl.py +249 -0
  678. chia/ssl/dst_root_ca.pem +20 -0
  679. chia/timelord/__init__.py +0 -0
  680. chia/timelord/iters_from_block.py +50 -0
  681. chia/timelord/timelord.py +1226 -0
  682. chia/timelord/timelord_api.py +138 -0
  683. chia/timelord/timelord_launcher.py +190 -0
  684. chia/timelord/timelord_state.py +244 -0
  685. chia/timelord/types.py +22 -0
  686. chia/types/__init__.py +0 -0
  687. chia/types/aliases.py +35 -0
  688. chia/types/block_protocol.py +20 -0
  689. chia/types/blockchain_format/__init__.py +0 -0
  690. chia/types/blockchain_format/classgroup.py +5 -0
  691. chia/types/blockchain_format/coin.py +28 -0
  692. chia/types/blockchain_format/foliage.py +8 -0
  693. chia/types/blockchain_format/pool_target.py +5 -0
  694. chia/types/blockchain_format/program.py +269 -0
  695. chia/types/blockchain_format/proof_of_space.py +135 -0
  696. chia/types/blockchain_format/reward_chain_block.py +6 -0
  697. chia/types/blockchain_format/serialized_program.py +5 -0
  698. chia/types/blockchain_format/sized_bytes.py +11 -0
  699. chia/types/blockchain_format/slots.py +9 -0
  700. chia/types/blockchain_format/sub_epoch_summary.py +5 -0
  701. chia/types/blockchain_format/tree_hash.py +72 -0
  702. chia/types/blockchain_format/vdf.py +86 -0
  703. chia/types/clvm_cost.py +13 -0
  704. chia/types/coin_record.py +43 -0
  705. chia/types/coin_spend.py +115 -0
  706. chia/types/condition_opcodes.py +73 -0
  707. chia/types/condition_with_args.py +16 -0
  708. chia/types/eligible_coin_spends.py +365 -0
  709. chia/types/end_of_slot_bundle.py +5 -0
  710. chia/types/fee_rate.py +38 -0
  711. chia/types/full_block.py +5 -0
  712. chia/types/generator_types.py +13 -0
  713. chia/types/header_block.py +5 -0
  714. chia/types/internal_mempool_item.py +18 -0
  715. chia/types/mempool_inclusion_status.py +9 -0
  716. chia/types/mempool_item.py +85 -0
  717. chia/types/mempool_submission_status.py +30 -0
  718. chia/types/mojos.py +7 -0
  719. chia/types/peer_info.py +64 -0
  720. chia/types/signing_mode.py +29 -0
  721. chia/types/spend_bundle.py +30 -0
  722. chia/types/spend_bundle_conditions.py +7 -0
  723. chia/types/transaction_queue_entry.py +55 -0
  724. chia/types/unfinished_block.py +5 -0
  725. chia/types/unfinished_header_block.py +37 -0
  726. chia/types/validation_state.py +14 -0
  727. chia/types/weight_proof.py +49 -0
  728. chia/util/__init__.py +0 -0
  729. chia/util/action_scope.py +168 -0
  730. chia/util/async_pool.py +226 -0
  731. chia/util/augmented_chain.py +134 -0
  732. chia/util/batches.py +42 -0
  733. chia/util/bech32m.py +126 -0
  734. chia/util/beta_metrics.py +119 -0
  735. chia/util/block_cache.py +56 -0
  736. chia/util/byte_types.py +12 -0
  737. chia/util/check_fork_next_block.py +33 -0
  738. chia/util/chia_logging.py +144 -0
  739. chia/util/chia_version.py +33 -0
  740. chia/util/collection.py +17 -0
  741. chia/util/condition_tools.py +201 -0
  742. chia/util/config.py +367 -0
  743. chia/util/cpu.py +22 -0
  744. chia/util/db_synchronous.py +23 -0
  745. chia/util/db_version.py +32 -0
  746. chia/util/db_wrapper.py +430 -0
  747. chia/util/default_root.py +27 -0
  748. chia/util/dump_keyring.py +93 -0
  749. chia/util/english.txt +2048 -0
  750. chia/util/errors.py +353 -0
  751. chia/util/file_keyring.py +469 -0
  752. chia/util/files.py +97 -0
  753. chia/util/full_block_utils.py +345 -0
  754. chia/util/generator_tools.py +72 -0
  755. chia/util/hash.py +31 -0
  756. chia/util/initial-config.yaml +694 -0
  757. chia/util/inline_executor.py +26 -0
  758. chia/util/ints.py +19 -0
  759. chia/util/ip_address.py +39 -0
  760. chia/util/json_util.py +37 -0
  761. chia/util/keychain.py +676 -0
  762. chia/util/keyring_wrapper.py +327 -0
  763. chia/util/limited_semaphore.py +41 -0
  764. chia/util/lock.py +49 -0
  765. chia/util/log_exceptions.py +32 -0
  766. chia/util/logging.py +36 -0
  767. chia/util/lru_cache.py +31 -0
  768. chia/util/math.py +20 -0
  769. chia/util/network.py +182 -0
  770. chia/util/paginator.py +48 -0
  771. chia/util/path.py +31 -0
  772. chia/util/permissions.py +20 -0
  773. chia/util/prev_transaction_block.py +21 -0
  774. chia/util/priority_mutex.py +95 -0
  775. chia/util/profiler.py +197 -0
  776. chia/util/recursive_replace.py +24 -0
  777. chia/util/safe_cancel_task.py +16 -0
  778. chia/util/service_groups.py +47 -0
  779. chia/util/setproctitle.py +22 -0
  780. chia/util/significant_bits.py +32 -0
  781. chia/util/ssl_check.py +213 -0
  782. chia/util/streamable.py +642 -0
  783. chia/util/task_referencer.py +59 -0
  784. chia/util/task_timing.py +382 -0
  785. chia/util/timing.py +67 -0
  786. chia/util/vdf_prover.py +30 -0
  787. chia/util/virtual_project_analysis.py +540 -0
  788. chia/util/ws_message.py +66 -0
  789. chia/wallet/__init__.py +0 -0
  790. chia/wallet/cat_wallet/__init__.py +0 -0
  791. chia/wallet/cat_wallet/cat_constants.py +75 -0
  792. chia/wallet/cat_wallet/cat_info.py +47 -0
  793. chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
  794. chia/wallet/cat_wallet/cat_utils.py +164 -0
  795. chia/wallet/cat_wallet/cat_wallet.py +855 -0
  796. chia/wallet/cat_wallet/dao_cat_info.py +28 -0
  797. chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
  798. chia/wallet/cat_wallet/lineage_store.py +74 -0
  799. chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
  800. chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
  801. chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
  802. chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
  803. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
  804. chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
  805. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
  806. chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
  807. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
  808. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
  809. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
  810. chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
  811. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
  812. chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
  813. chia/wallet/coin_selection.py +188 -0
  814. chia/wallet/conditions.py +1512 -0
  815. chia/wallet/dao_wallet/__init__.py +0 -0
  816. chia/wallet/dao_wallet/dao_info.py +61 -0
  817. chia/wallet/dao_wallet/dao_utils.py +811 -0
  818. chia/wallet/dao_wallet/dao_wallet.py +2119 -0
  819. chia/wallet/db_wallet/__init__.py +0 -0
  820. chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
  821. chia/wallet/derivation_record.py +30 -0
  822. chia/wallet/derive_keys.py +146 -0
  823. chia/wallet/did_wallet/__init__.py +0 -0
  824. chia/wallet/did_wallet/did_info.py +39 -0
  825. chia/wallet/did_wallet/did_wallet.py +1494 -0
  826. chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
  827. chia/wallet/did_wallet/puzzles/__init__.py +0 -0
  828. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
  829. chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
  830. chia/wallet/driver_protocol.py +26 -0
  831. chia/wallet/key_val_store.py +55 -0
  832. chia/wallet/lineage_proof.py +58 -0
  833. chia/wallet/nft_wallet/__init__.py +0 -0
  834. chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
  835. chia/wallet/nft_wallet/nft_info.py +120 -0
  836. chia/wallet/nft_wallet/nft_puzzles.py +305 -0
  837. chia/wallet/nft_wallet/nft_wallet.py +1687 -0
  838. chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
  839. chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
  840. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
  841. chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
  842. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
  843. chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
  844. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
  845. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
  846. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
  847. chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
  848. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
  849. chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
  850. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
  851. chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
  852. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
  853. chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
  854. chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
  855. chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
  856. chia/wallet/nft_wallet/uncurry_nft.py +217 -0
  857. chia/wallet/notification_manager.py +117 -0
  858. chia/wallet/notification_store.py +178 -0
  859. chia/wallet/outer_puzzles.py +84 -0
  860. chia/wallet/payment.py +33 -0
  861. chia/wallet/puzzle_drivers.py +118 -0
  862. chia/wallet/puzzles/__init__.py +0 -0
  863. chia/wallet/puzzles/augmented_condition.clsp +13 -0
  864. chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
  865. chia/wallet/puzzles/clawback/__init__.py +0 -0
  866. chia/wallet/puzzles/clawback/drivers.py +188 -0
  867. chia/wallet/puzzles/clawback/metadata.py +38 -0
  868. chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
  869. chia/wallet/puzzles/condition_codes.clib +77 -0
  870. chia/wallet/puzzles/curry-and-treehash.clib +102 -0
  871. chia/wallet/puzzles/curry.clib +135 -0
  872. chia/wallet/puzzles/curry_by_index.clib +16 -0
  873. chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
  874. chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
  875. chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
  876. chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
  877. chia/wallet/puzzles/dao_finished_state.clsp +35 -0
  878. chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
  879. chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
  880. chia/wallet/puzzles/dao_lockup.clsp +288 -0
  881. chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
  882. chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
  883. chia/wallet/puzzles/dao_proposal.clsp +377 -0
  884. chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
  885. chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
  886. chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
  887. chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
  888. chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
  889. chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
  890. chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
  891. chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
  892. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
  893. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
  894. chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
  895. chia/wallet/puzzles/dao_treasury.clsp +115 -0
  896. chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
  897. chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
  898. chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
  899. chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
  900. chia/wallet/puzzles/json.clib +25 -0
  901. chia/wallet/puzzles/load_clvm.py +161 -0
  902. chia/wallet/puzzles/merkle_utils.clib +18 -0
  903. chia/wallet/puzzles/notification.clsp +7 -0
  904. chia/wallet/puzzles/notification.clsp.hex +1 -0
  905. chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
  906. chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
  907. chia/wallet/puzzles/p2_conditions.clsp +3 -0
  908. chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
  909. chia/wallet/puzzles/p2_conditions.py +26 -0
  910. chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
  911. chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
  912. chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
  913. chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
  914. chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
  915. chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
  916. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
  917. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
  918. chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
  919. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
  920. chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
  921. chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
  922. chia/wallet/puzzles/p2_parent.clsp +19 -0
  923. chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
  924. chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
  925. chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
  926. chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
  927. chia/wallet/puzzles/p2_singleton.clsp +30 -0
  928. chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
  929. chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
  930. chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
  931. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
  932. chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
  933. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
  934. chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
  935. chia/wallet/puzzles/puzzle_utils.py +34 -0
  936. chia/wallet/puzzles/settlement_payments.clsp +49 -0
  937. chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
  938. chia/wallet/puzzles/sha256tree.clib +11 -0
  939. chia/wallet/puzzles/singleton_launcher.clsp +16 -0
  940. chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
  941. chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
  942. chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
  943. chia/wallet/puzzles/singleton_top_layer.py +296 -0
  944. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
  945. chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
  946. chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
  947. chia/wallet/puzzles/singleton_truths.clib +21 -0
  948. chia/wallet/puzzles/tails.py +348 -0
  949. chia/wallet/puzzles/utility_macros.clib +48 -0
  950. chia/wallet/signer_protocol.py +125 -0
  951. chia/wallet/singleton.py +106 -0
  952. chia/wallet/singleton_record.py +30 -0
  953. chia/wallet/trade_manager.py +1102 -0
  954. chia/wallet/trade_record.py +67 -0
  955. chia/wallet/trading/__init__.py +0 -0
  956. chia/wallet/trading/offer.py +702 -0
  957. chia/wallet/trading/trade_status.py +13 -0
  958. chia/wallet/trading/trade_store.py +526 -0
  959. chia/wallet/transaction_record.py +158 -0
  960. chia/wallet/transaction_sorting.py +14 -0
  961. chia/wallet/uncurried_puzzle.py +17 -0
  962. chia/wallet/util/__init__.py +0 -0
  963. chia/wallet/util/address_type.py +55 -0
  964. chia/wallet/util/blind_signer_tl.py +164 -0
  965. chia/wallet/util/clvm_streamable.py +203 -0
  966. chia/wallet/util/compute_hints.py +66 -0
  967. chia/wallet/util/compute_memos.py +43 -0
  968. chia/wallet/util/curry_and_treehash.py +91 -0
  969. chia/wallet/util/debug_spend_bundle.py +232 -0
  970. chia/wallet/util/merkle_tree.py +100 -0
  971. chia/wallet/util/merkle_utils.py +102 -0
  972. chia/wallet/util/new_peak_queue.py +82 -0
  973. chia/wallet/util/notifications.py +12 -0
  974. chia/wallet/util/peer_request_cache.py +174 -0
  975. chia/wallet/util/pprint.py +39 -0
  976. chia/wallet/util/puzzle_compression.py +95 -0
  977. chia/wallet/util/puzzle_decorator.py +100 -0
  978. chia/wallet/util/puzzle_decorator_type.py +7 -0
  979. chia/wallet/util/query_filter.py +59 -0
  980. chia/wallet/util/transaction_type.py +23 -0
  981. chia/wallet/util/tx_config.py +158 -0
  982. chia/wallet/util/wallet_sync_utils.py +351 -0
  983. chia/wallet/util/wallet_types.py +72 -0
  984. chia/wallet/vc_wallet/__init__.py +0 -0
  985. chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
  986. chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
  987. chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
  988. chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
  989. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
  990. chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
  991. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
  992. chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
  993. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
  994. chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
  995. chia/wallet/vc_wallet/vc_drivers.py +838 -0
  996. chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
  997. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
  998. chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
  999. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
  1000. chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
  1001. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
  1002. chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
  1003. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
  1004. chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
  1005. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
  1006. chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
  1007. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
  1008. chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
  1009. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
  1010. chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
  1011. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
  1012. chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
  1013. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
  1014. chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
  1015. chia/wallet/vc_wallet/vc_store.py +263 -0
  1016. chia/wallet/vc_wallet/vc_wallet.py +638 -0
  1017. chia/wallet/wallet.py +698 -0
  1018. chia/wallet/wallet_action_scope.py +96 -0
  1019. chia/wallet/wallet_blockchain.py +244 -0
  1020. chia/wallet/wallet_coin_record.py +72 -0
  1021. chia/wallet/wallet_coin_store.py +351 -0
  1022. chia/wallet/wallet_info.py +35 -0
  1023. chia/wallet/wallet_interested_store.py +188 -0
  1024. chia/wallet/wallet_nft_store.py +279 -0
  1025. chia/wallet/wallet_node.py +1765 -0
  1026. chia/wallet/wallet_node_api.py +207 -0
  1027. chia/wallet/wallet_pool_store.py +119 -0
  1028. chia/wallet/wallet_protocol.py +90 -0
  1029. chia/wallet/wallet_puzzle_store.py +396 -0
  1030. chia/wallet/wallet_retry_store.py +70 -0
  1031. chia/wallet/wallet_singleton_store.py +259 -0
  1032. chia/wallet/wallet_spend_bundle.py +25 -0
  1033. chia/wallet/wallet_state_manager.py +2819 -0
  1034. chia/wallet/wallet_transaction_store.py +496 -0
  1035. chia/wallet/wallet_user_store.py +110 -0
  1036. chia/wallet/wallet_weight_proof_handler.py +126 -0
  1037. chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
  1038. chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
  1039. chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
  1040. chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
  1041. chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
  1042. mozilla-ca/cacert.pem +3611 -0
@@ -0,0 +1,1219 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import random
5
+ from collections.abc import AsyncIterator
6
+ from typing import Optional
7
+
8
+ import pytest
9
+
10
+ from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error
11
+ from chia._tests.util.blockchain import create_blockchain
12
+ from chia._tests.util.blockchain_mock import BlockchainMock
13
+ from chia.consensus.block_body_validation import ForkInfo
14
+ from chia.consensus.blockchain import AddBlockResult, Blockchain
15
+ from chia.consensus.constants import ConsensusConstants
16
+ from chia.consensus.default_constants import DEFAULT_CONSTANTS
17
+ from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
18
+ from chia.consensus.find_fork_point import find_fork_point_in_chain
19
+ from chia.consensus.multiprocess_validation import PreValidationResult
20
+ from chia.consensus.pot_iterations import is_overflow_block
21
+ from chia.full_node.full_node_store import FullNodeStore, UnfinishedBlockEntry, find_best_block
22
+ from chia.full_node.signage_point import SignagePoint
23
+ from chia.protocols import timelord_protocol
24
+ from chia.protocols.timelord_protocol import NewInfusionPointVDF
25
+ from chia.simulator.block_tools import BlockTools, create_block_tools_async, get_signage_point, make_unfinished_block
26
+ from chia.simulator.keyring import TempKeyring
27
+ from chia.types.blockchain_format.sized_bytes import bytes32
28
+ from chia.types.full_block import FullBlock
29
+ from chia.types.unfinished_block import UnfinishedBlock
30
+ from chia.util.hash import std_hash
31
+ from chia.util.ints import uint8, uint16, uint32, uint64, uint128
32
+ from chia.util.recursive_replace import recursive_replace
33
+
34
+ log = logging.getLogger(__name__)
35
+
36
+
37
+ @pytest.fixture(scope="function")
38
+ async def custom_block_tools(blockchain_constants: ConsensusConstants) -> AsyncIterator[BlockTools]:
39
+ with TempKeyring() as keychain:
40
+ patched_constants = blockchain_constants.replace(
41
+ DISCRIMINANT_SIZE_BITS=uint16(32),
42
+ SUB_SLOT_ITERS_STARTING=uint64(2**12),
43
+ )
44
+ yield await create_block_tools_async(constants=patched_constants, keychain=keychain)
45
+
46
+
47
+ @pytest.fixture(scope="function")
48
+ async def empty_blockchain(db_version: int, blockchain_constants: ConsensusConstants) -> AsyncIterator[Blockchain]:
49
+ patched_constants = blockchain_constants.replace(
50
+ DISCRIMINANT_SIZE_BITS=uint16(32),
51
+ SUB_SLOT_ITERS_STARTING=uint64(2**12),
52
+ )
53
+ async with create_blockchain(patched_constants, db_version) as (bc1, _):
54
+ yield bc1
55
+
56
+
57
+ @pytest.fixture(scope="function")
58
+ async def empty_blockchain_with_original_constants(
59
+ db_version: int, blockchain_constants: ConsensusConstants
60
+ ) -> AsyncIterator[Blockchain]:
61
+ async with create_blockchain(blockchain_constants, db_version) as (bc1, _):
62
+ yield bc1
63
+
64
+
65
+ @pytest.mark.anyio
66
+ @pytest.mark.parametrize("num_duplicates", [0, 1, 3, 10])
67
+ @pytest.mark.parametrize("include_none", [True, False])
68
+ async def test_unfinished_block_rank(
69
+ empty_blockchain: Blockchain,
70
+ custom_block_tools: BlockTools,
71
+ seeded_random: random.Random,
72
+ num_duplicates: int,
73
+ include_none: bool,
74
+ ) -> None:
75
+ blocks = custom_block_tools.get_consecutive_blocks(
76
+ 1,
77
+ guarantee_transaction_block=True,
78
+ )
79
+
80
+ assert blocks[-1].is_transaction_block()
81
+ store = FullNodeStore(custom_block_tools.constants)
82
+ unf: UnfinishedBlock = make_unfinished_block(blocks[-1], custom_block_tools.constants)
83
+
84
+ # create variants of the unfinished block, where all we do is to change
85
+ # the foliage_transaction_block_hash. As if they all had different foliage,
86
+ # but the same reward block hash (i.e. the same proof-of-space)
87
+ unfinished: list[UnfinishedBlock] = [
88
+ recursive_replace(unf, "foliage.foliage_transaction_block_hash", bytes32([idx + 4] * 32))
89
+ for idx in range(num_duplicates)
90
+ ]
91
+
92
+ if include_none:
93
+ unfinished.append(recursive_replace(unf, "foliage.foliage_transaction_block_hash", None))
94
+
95
+ # shuffle them to ensure the order we add them to the store isn't relevant
96
+ seeded_random.shuffle(unfinished)
97
+ for new_unf in unfinished:
98
+ store.add_unfinished_block(uint32(2), new_unf, PreValidationResult(None, uint64(123532), None, uint32(0)))
99
+
100
+ # now ask for "the" unfinished block given the proof-of-space.
101
+ # the FullNodeStore should return the one with the lowest foliage tx block
102
+ # hash. We prefer a block with foliage over one without (i.e. where foliage
103
+ # is None)
104
+ if num_duplicates == 0 and not include_none:
105
+ assert store.get_unfinished_block(unf.partial_hash) is None
106
+ else:
107
+ best_unf = store.get_unfinished_block(unf.partial_hash)
108
+ assert best_unf is not None
109
+ if num_duplicates == 0:
110
+ # if a block without foliage is our only option, that's what we get
111
+ assert best_unf.foliage.foliage_transaction_block_hash is None
112
+ else:
113
+ assert best_unf.foliage.foliage_transaction_block_hash == bytes32([4] * 32)
114
+
115
+
116
+ @pytest.mark.anyio
117
+ @pytest.mark.limit_consensus_modes(reason="save time")
118
+ @pytest.mark.parametrize(
119
+ "blocks,expected",
120
+ [
121
+ ([(None, True), (1, True), (2, True), (3, True)], 1),
122
+ ([(None, True), (1, False), (2, True), (3, True)], 2),
123
+ ([(None, True), (1, False), (2, False), (3, True)], 3),
124
+ ([(None, True)], None),
125
+ ([], None),
126
+ ([(4, True), (5, True), (3, True)], 3),
127
+ ([(4, True)], 4),
128
+ ([(4, False)], None),
129
+ ],
130
+ )
131
+ async def test_find_best_block(
132
+ seeded_random: random.Random,
133
+ blocks: list[tuple[Optional[int], bool]],
134
+ expected: Optional[int],
135
+ default_400_blocks: list[FullBlock],
136
+ bt: BlockTools,
137
+ ) -> None:
138
+ result: dict[Optional[bytes32], UnfinishedBlockEntry] = {}
139
+ i = 0
140
+ for b, with_unf in blocks:
141
+ unf: Optional[UnfinishedBlock]
142
+ if with_unf:
143
+ unf = make_unfinished_block(default_400_blocks[i], bt.constants)
144
+ i += 1
145
+ else:
146
+ unf = None
147
+ if b is None:
148
+ result[b] = UnfinishedBlockEntry(unf, None, uint32(123))
149
+ else:
150
+ result[bytes32(b.to_bytes(1, "big") * 32)] = UnfinishedBlockEntry(unf, None, uint32(123))
151
+
152
+ foliage_hash, _block = find_best_block(result)
153
+ if expected is None:
154
+ assert foliage_hash is None
155
+ else:
156
+ assert foliage_hash == bytes32(expected.to_bytes(1, "big") * 32)
157
+
158
+
159
+ @pytest.mark.limit_consensus_modes(reason="save time")
160
+ @pytest.mark.anyio
161
+ @pytest.mark.parametrize("normalized_to_identity", [False, True])
162
+ async def test_basic_store(
163
+ empty_blockchain: Blockchain,
164
+ custom_block_tools: BlockTools,
165
+ normalized_to_identity: bool,
166
+ seeded_random: random.Random,
167
+ ) -> None:
168
+ blockchain = empty_blockchain
169
+ blocks = custom_block_tools.get_consecutive_blocks(
170
+ 10,
171
+ seed=b"1234",
172
+ normalized_to_identity_cc_eos=normalized_to_identity,
173
+ normalized_to_identity_icc_eos=normalized_to_identity,
174
+ normalized_to_identity_cc_ip=normalized_to_identity,
175
+ normalized_to_identity_cc_sp=normalized_to_identity,
176
+ )
177
+
178
+ store = FullNodeStore(empty_blockchain.constants)
179
+
180
+ unfinished_blocks = []
181
+ for block in blocks:
182
+ unfinished_blocks.append(
183
+ UnfinishedBlock(
184
+ block.finished_sub_slots,
185
+ block.reward_chain_block.get_unfinished(),
186
+ block.challenge_chain_sp_proof,
187
+ block.reward_chain_sp_proof,
188
+ block.foliage,
189
+ block.foliage_transaction_block,
190
+ block.transactions_info,
191
+ block.transactions_generator,
192
+ [],
193
+ )
194
+ )
195
+
196
+ # Add/get candidate block
197
+ assert store.get_candidate_block(unfinished_blocks[0].get_hash()) is None
198
+ for height, unf_block in enumerate(unfinished_blocks):
199
+ store.add_candidate_block(unf_block.get_hash(), uint32(height), unf_block)
200
+
201
+ candidate = store.get_candidate_block(unfinished_blocks[4].get_hash())
202
+ assert candidate is not None
203
+ assert candidate[1] == unfinished_blocks[4]
204
+ store.clear_candidate_blocks_below(uint32(8))
205
+ assert store.get_candidate_block(unfinished_blocks[5].get_hash()) is None
206
+ assert store.get_candidate_block(unfinished_blocks[8].get_hash()) is not None
207
+
208
+ # Test seen unfinished blocks
209
+ h_hash_1 = bytes32.random(seeded_random)
210
+ assert not store.seen_unfinished_block(h_hash_1)
211
+ assert store.seen_unfinished_block(h_hash_1)
212
+ # this will crowd out h_hash_1
213
+ for _ in range(store.max_seen_unfinished_blocks):
214
+ store.seen_unfinished_block(bytes32.random(seeded_random))
215
+ assert not store.seen_unfinished_block(h_hash_1)
216
+
217
+ # Add/get unfinished block
218
+ for height, unf_block in enumerate(unfinished_blocks):
219
+ assert store.get_unfinished_block(unf_block.partial_hash) is None
220
+ assert store.get_unfinished_block2(unf_block.partial_hash, None) == (None, 0, False)
221
+ store.add_unfinished_block(
222
+ uint32(height), unf_block, PreValidationResult(None, uint64(123532), None, uint32(0))
223
+ )
224
+ assert store.get_unfinished_block(unf_block.partial_hash) == unf_block
225
+ assert store.get_unfinished_block2(
226
+ unf_block.partial_hash, unf_block.foliage.foliage_transaction_block_hash
227
+ ) == (unf_block, 1, False)
228
+
229
+ foliage_hash = unf_block.foliage.foliage_transaction_block_hash
230
+ dummy_hash = bytes32.fromhex("abababababababababababababababababababababababababababababababab")
231
+ assert store.get_unfinished_block2(unf_block.partial_hash, dummy_hash) == (
232
+ None,
233
+ 1,
234
+ foliage_hash is not None and dummy_hash > foliage_hash,
235
+ )
236
+
237
+ # only transaction blocks have PreValidationResults
238
+ # so get_unfinished_block_result requires the foliage hash
239
+ if unf_block.foliage.foliage_transaction_block_hash is not None:
240
+ entry = store.get_unfinished_block_result(
241
+ unf_block.partial_hash, unf_block.foliage.foliage_transaction_block_hash
242
+ )
243
+ assert entry is not None
244
+ ublock = entry.result
245
+ assert ublock is not None and ublock.required_iters == uint64(123532)
246
+ entry = store.get_unfinished_block_result(
247
+ unf_block.partial_hash, unf_block.foliage.foliage_transaction_block_hash
248
+ )
249
+ assert entry is not None
250
+ ublock = entry.result
251
+
252
+ assert ublock is not None and ublock.required_iters == uint64(123532)
253
+
254
+ store.remove_unfinished_block(unf_block.partial_hash)
255
+ assert store.get_unfinished_block(unf_block.partial_hash) is None
256
+ assert store.get_unfinished_block2(
257
+ unf_block.partial_hash, unf_block.foliage.foliage_transaction_block_hash
258
+ ) == (None, 0, False)
259
+
260
+ # Multiple unfinished blocks with colliding partial hashes
261
+ unf1 = unfinished_blocks[0]
262
+ unf2 = unf1.replace(foliage=unfinished_blocks[1].foliage)
263
+ unf3 = unf1.replace(foliage=unfinished_blocks[2].foliage)
264
+ unf4 = unf1.replace(foliage=unfinished_blocks[3].foliage)
265
+
266
+ # we have none of these blocks in the store
267
+ for unf_block in [unf1, unf2, unf3, unf4]:
268
+ assert store.get_unfinished_block(unf_block.partial_hash) is None
269
+ assert store.get_unfinished_block2(unf_block.partial_hash, None) == (None, 0, False)
270
+
271
+ height = uint32(1)
272
+ # all blocks without a foliage all collapse down into being the same
273
+ assert unf1.foliage.foliage_transaction_block_hash is not None
274
+ assert unf2.foliage.foliage_transaction_block_hash is None
275
+ assert unf3.foliage.foliage_transaction_block_hash is None
276
+ assert unf4.foliage.foliage_transaction_block_hash is None
277
+ for val, unf_block in enumerate([unf1, unf2, unf3, unf4]):
278
+ store.add_unfinished_block(uint32(height), unf_block, PreValidationResult(None, uint64(val), None, uint32(0)))
279
+
280
+ # when not specifying a foliage hash, you get the "best" one
281
+ # best is defined as the lowest foliage hash
282
+ assert store.get_unfinished_block(unf1.partial_hash) == unf1
283
+ assert store.get_unfinished_block2(unf1.partial_hash, unf1.foliage.foliage_transaction_block_hash) == (
284
+ unf1,
285
+ 2,
286
+ False,
287
+ )
288
+ # unf4 overwrote unf2 and unf3 (that's why there are only 2 blocks stored).
289
+ # however, there's no way to explicitly request the block with None foliage
290
+ # since when specifying None, you always get the first one. unf1 in this
291
+ # case
292
+ assert store.get_unfinished_block2(unf2.partial_hash, unf2.foliage.foliage_transaction_block_hash) == (
293
+ unf1,
294
+ 2,
295
+ False,
296
+ )
297
+ assert store.get_unfinished_block2(unf3.partial_hash, unf3.foliage.foliage_transaction_block_hash) == (
298
+ unf1,
299
+ 2,
300
+ False,
301
+ )
302
+ assert store.get_unfinished_block2(unf4.partial_hash, unf4.foliage.foliage_transaction_block_hash) == (
303
+ unf1,
304
+ 2,
305
+ False,
306
+ )
307
+ assert store.get_unfinished_block2(unf4.partial_hash, None) == (unf1, 2, False)
308
+
309
+ entry = store.get_unfinished_block_result(unf1.partial_hash, unf1.foliage.foliage_transaction_block_hash)
310
+ assert entry is not None
311
+ ublock = entry.result
312
+ assert ublock is not None and ublock.required_iters == uint64(0)
313
+ entry = store.get_unfinished_block_result(unf1.partial_hash, unf1.foliage.foliage_transaction_block_hash)
314
+ assert entry is not None
315
+ ublock = entry.result
316
+ assert ublock is not None and ublock.required_iters == uint64(0)
317
+ # still, when not specifying a foliage hash, you just get the first ublock
318
+ entry = store.get_unfinished_block_result(unf1.partial_hash, unf1.foliage.foliage_transaction_block_hash)
319
+ assert entry is not None
320
+ ublock = entry.result
321
+ assert ublock is not None and ublock.required_iters == uint64(0)
322
+
323
+ # negative test cases
324
+ assert store.get_unfinished_block_result(bytes32([1] * 32), bytes32([2] * 32)) is None
325
+
326
+ blocks = custom_block_tools.get_consecutive_blocks(
327
+ 1,
328
+ skip_slots=5,
329
+ normalized_to_identity_cc_ip=normalized_to_identity,
330
+ normalized_to_identity_cc_sp=normalized_to_identity,
331
+ normalized_to_identity_cc_eos=normalized_to_identity,
332
+ normalized_to_identity_icc_eos=normalized_to_identity,
333
+ )
334
+ sub_slots = blocks[0].finished_sub_slots
335
+ assert len(sub_slots) == 5
336
+
337
+ assert (
338
+ store.get_finished_sub_slots(
339
+ BlockchainMock({}),
340
+ None,
341
+ sub_slots[0].challenge_chain.challenge_chain_end_of_slot_vdf.challenge,
342
+ )
343
+ == []
344
+ )
345
+ # Test adding non-connecting sub-slots genesis
346
+ assert store.get_sub_slot(empty_blockchain.constants.GENESIS_CHALLENGE) is None
347
+ assert store.get_sub_slot(sub_slots[0].challenge_chain.get_hash()) is None
348
+ assert store.get_sub_slot(sub_slots[1].challenge_chain.get_hash()) is None
349
+ next_sub_slot_iters = custom_block_tools.constants.SUB_SLOT_ITERS_STARTING
350
+ next_difficulty = custom_block_tools.constants.DIFFICULTY_STARTING
351
+ assert (
352
+ store.new_finished_sub_slot(sub_slots[1], blockchain, None, next_sub_slot_iters, next_difficulty, None) is None
353
+ )
354
+ assert (
355
+ store.new_finished_sub_slot(sub_slots[2], blockchain, None, next_sub_slot_iters, next_difficulty, None) is None
356
+ )
357
+
358
+ # Test adding sub-slots after genesis
359
+ assert (
360
+ store.new_finished_sub_slot(sub_slots[0], blockchain, None, next_sub_slot_iters, next_difficulty, None)
361
+ is not None
362
+ )
363
+ sub_slot = store.get_sub_slot(sub_slots[0].challenge_chain.get_hash())
364
+ assert sub_slot is not None
365
+ assert sub_slot[0] == sub_slots[0]
366
+ assert store.get_sub_slot(sub_slots[1].challenge_chain.get_hash()) is None
367
+ assert (
368
+ store.new_finished_sub_slot(sub_slots[1], blockchain, None, next_sub_slot_iters, next_difficulty, None)
369
+ is not None
370
+ )
371
+ for i in range(len(sub_slots)):
372
+ assert (
373
+ store.new_finished_sub_slot(sub_slots[i], blockchain, None, next_sub_slot_iters, next_difficulty, None)
374
+ is not None
375
+ )
376
+ slot_i = store.get_sub_slot(sub_slots[i].challenge_chain.get_hash())
377
+ assert slot_i is not None
378
+ assert slot_i[0] == sub_slots[i]
379
+
380
+ assert store.get_finished_sub_slots(BlockchainMock({}), None, sub_slots[-1].challenge_chain.get_hash()) == sub_slots
381
+ assert store.get_finished_sub_slots(BlockchainMock({}), None, std_hash(b"not a valid hash")) is None
382
+
383
+ assert (
384
+ store.get_finished_sub_slots(BlockchainMock({}), None, sub_slots[-2].challenge_chain.get_hash())
385
+ == sub_slots[:-1]
386
+ )
387
+
388
+ # Test adding genesis peak
389
+ await _validate_and_add_block(blockchain, blocks[0])
390
+ peak = blockchain.get_peak()
391
+ assert peak is not None
392
+ peak_full_block = await blockchain.get_full_peak()
393
+ assert peak_full_block is not None
394
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
395
+ blockchain.constants, False, peak, blockchain
396
+ )
397
+
398
+ if peak.overflow:
399
+ store.new_peak(
400
+ peak,
401
+ peak_full_block,
402
+ sub_slots[-2],
403
+ sub_slots[-1],
404
+ None,
405
+ blockchain,
406
+ next_sub_slot_iters,
407
+ next_difficulty,
408
+ )
409
+ else:
410
+ store.new_peak(
411
+ peak, peak_full_block, None, sub_slots[-1], None, blockchain, next_sub_slot_iters, next_difficulty
412
+ )
413
+
414
+ assert store.get_sub_slot(sub_slots[0].challenge_chain.get_hash()) is None
415
+ assert store.get_sub_slot(sub_slots[1].challenge_chain.get_hash()) is None
416
+ assert store.get_sub_slot(sub_slots[2].challenge_chain.get_hash()) is None
417
+ if peak.overflow:
418
+ slot_3 = store.get_sub_slot(sub_slots[3].challenge_chain.get_hash())
419
+ assert slot_3 is not None
420
+ assert slot_3[0] == sub_slots[3]
421
+ else:
422
+ assert store.get_sub_slot(sub_slots[3].challenge_chain.get_hash()) is None
423
+
424
+ slot_4 = store.get_sub_slot(sub_slots[4].challenge_chain.get_hash())
425
+ assert slot_4 is not None
426
+ assert slot_4[0] == sub_slots[4]
427
+
428
+ assert (
429
+ store.get_finished_sub_slots(
430
+ blockchain,
431
+ peak,
432
+ sub_slots[-1].challenge_chain.get_hash(),
433
+ )
434
+ == []
435
+ )
436
+
437
+ # Test adding non genesis peak directly
438
+ blocks = custom_block_tools.get_consecutive_blocks(
439
+ 2,
440
+ skip_slots=2,
441
+ normalized_to_identity_cc_eos=normalized_to_identity,
442
+ normalized_to_identity_icc_eos=normalized_to_identity,
443
+ normalized_to_identity_cc_ip=normalized_to_identity,
444
+ normalized_to_identity_cc_sp=normalized_to_identity,
445
+ )
446
+ blocks = custom_block_tools.get_consecutive_blocks(
447
+ 3,
448
+ block_list_input=blocks,
449
+ normalized_to_identity_cc_eos=normalized_to_identity,
450
+ normalized_to_identity_icc_eos=normalized_to_identity,
451
+ normalized_to_identity_cc_ip=normalized_to_identity,
452
+ normalized_to_identity_cc_sp=normalized_to_identity,
453
+ )
454
+
455
+ fork_info = ForkInfo(blocks[0].height - 1, blocks[0].height - 1, blocks[0].prev_header_hash)
456
+ for block in blocks:
457
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
458
+ sb = blockchain.block_record(block.header_hash)
459
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
460
+ blockchain.constants, False, sb, blockchain
461
+ )
462
+ result = await blockchain.get_sp_and_ip_sub_slots(block.header_hash)
463
+ assert result is not None
464
+ sp_sub_slot, ip_sub_slot = result
465
+ res = store.new_peak(
466
+ sb, block, sp_sub_slot, ip_sub_slot, None, blockchain, next_sub_slot_iters, next_difficulty
467
+ )
468
+ assert res.added_eos is None
469
+
470
+ # Add reorg blocks
471
+ blocks_reorg = custom_block_tools.get_consecutive_blocks(
472
+ 20,
473
+ normalized_to_identity_cc_eos=normalized_to_identity,
474
+ normalized_to_identity_icc_eos=normalized_to_identity,
475
+ normalized_to_identity_cc_ip=normalized_to_identity,
476
+ normalized_to_identity_cc_sp=normalized_to_identity,
477
+ )
478
+
479
+ fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
480
+ for block in blocks_reorg:
481
+ peak = blockchain.get_peak()
482
+ assert peak is not None
483
+
484
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
485
+
486
+ peak_here = blockchain.get_peak()
487
+ assert peak_here is not None
488
+ if peak_here.header_hash == block.header_hash:
489
+ sb = blockchain.block_record(block.header_hash)
490
+ fork = await find_fork_point_in_chain(blockchain, peak, blockchain.block_record(sb.header_hash))
491
+ if fork > 0:
492
+ fork_block = blockchain.height_to_block_record(uint32(fork))
493
+ else:
494
+ fork_block = None
495
+ result = await blockchain.get_sp_and_ip_sub_slots(block.header_hash)
496
+ assert result is not None
497
+ sp_sub_slot, ip_sub_slot = result
498
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
499
+ blockchain.constants, False, sb, blockchain
500
+ )
501
+ res = store.new_peak(
502
+ sb, block, sp_sub_slot, ip_sub_slot, fork_block, blockchain, next_sub_slot_iters, next_difficulty
503
+ )
504
+ assert res.added_eos is None
505
+
506
+ # Add slots to the end
507
+ blocks_2 = custom_block_tools.get_consecutive_blocks(
508
+ 1,
509
+ block_list_input=blocks_reorg,
510
+ skip_slots=2,
511
+ normalized_to_identity_cc_eos=normalized_to_identity,
512
+ normalized_to_identity_icc_eos=normalized_to_identity,
513
+ normalized_to_identity_cc_ip=normalized_to_identity,
514
+ normalized_to_identity_cc_sp=normalized_to_identity,
515
+ )
516
+ peak = blockchain.get_peak()
517
+ for slot in blocks_2[-1].finished_sub_slots:
518
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
519
+ blockchain.constants, True, peak, blockchain
520
+ )
521
+
522
+ store.new_finished_sub_slot(
523
+ slot,
524
+ blockchain,
525
+ blockchain.get_peak(),
526
+ next_sub_slot_iters,
527
+ next_difficulty,
528
+ await blockchain.get_full_peak(),
529
+ )
530
+
531
+ assert store.get_sub_slot(sub_slots[3].challenge_chain.get_hash()) is None
532
+ assert store.get_sub_slot(sub_slots[4].challenge_chain.get_hash()) is None
533
+
534
+ # Test adding signage point
535
+ peak = blockchain.get_peak()
536
+ assert peak is not None
537
+ ss_start_iters = peak.ip_sub_slot_total_iters(custom_block_tools.constants)
538
+ for i in range(
539
+ 1, custom_block_tools.constants.NUM_SPS_SUB_SLOT - custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA
540
+ ):
541
+ sp = get_signage_point(
542
+ custom_block_tools.constants,
543
+ blockchain,
544
+ peak,
545
+ ss_start_iters,
546
+ uint8(i),
547
+ [],
548
+ peak.sub_slot_iters,
549
+ )
550
+ assert store.new_signage_point(uint8(i), blockchain, peak, peak.sub_slot_iters, sp)
551
+
552
+ blocks = blocks_reorg
553
+ while True:
554
+ blocks = custom_block_tools.get_consecutive_blocks(
555
+ 1,
556
+ block_list_input=blocks,
557
+ normalized_to_identity_cc_eos=normalized_to_identity,
558
+ normalized_to_identity_icc_eos=normalized_to_identity,
559
+ normalized_to_identity_cc_ip=normalized_to_identity,
560
+ normalized_to_identity_cc_sp=normalized_to_identity,
561
+ )
562
+ await _validate_and_add_block(blockchain, blocks[-1], fork_info=fork_info)
563
+ peak_here = blockchain.get_peak()
564
+ assert peak_here is not None
565
+ if peak_here.header_hash == blocks[-1].header_hash:
566
+ sb = blockchain.block_record(blocks[-1].header_hash)
567
+ fork = await find_fork_point_in_chain(blockchain, peak, blockchain.block_record(sb.header_hash))
568
+ if fork > 0:
569
+ fork_block = blockchain.height_to_block_record(uint32(fork))
570
+ else:
571
+ fork_block = None
572
+ result = await blockchain.get_sp_and_ip_sub_slots(blocks[-1].header_hash)
573
+ assert result is not None
574
+ sp_sub_slot, ip_sub_slot = result
575
+
576
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
577
+ blockchain.constants, False, sb, blockchain
578
+ )
579
+ res = store.new_peak(
580
+ sb,
581
+ blocks[-1],
582
+ sp_sub_slot,
583
+ ip_sub_slot,
584
+ fork_block,
585
+ blockchain,
586
+ next_sub_slot_iters,
587
+ next_difficulty,
588
+ )
589
+ assert res.added_eos is None
590
+ if sb.overflow and sp_sub_slot is not None:
591
+ assert sp_sub_slot != ip_sub_slot
592
+ break
593
+
594
+ peak = blockchain.get_peak()
595
+ assert peak is not None
596
+ assert peak.overflow
597
+ # Overflow peak should result in 2 finished sub slots
598
+ assert len(store.finished_sub_slots) == 2
599
+
600
+ # Add slots to the end, except for the last one, which we will use to test invalid SP
601
+ blocks_2 = custom_block_tools.get_consecutive_blocks(
602
+ 1,
603
+ block_list_input=blocks,
604
+ skip_slots=3,
605
+ normalized_to_identity_cc_eos=normalized_to_identity,
606
+ normalized_to_identity_icc_eos=normalized_to_identity,
607
+ normalized_to_identity_cc_ip=normalized_to_identity,
608
+ normalized_to_identity_cc_sp=normalized_to_identity,
609
+ )
610
+ for slot in blocks_2[-1].finished_sub_slots[:-1]:
611
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
612
+ blockchain.constants, True, peak, blockchain
613
+ )
614
+
615
+ store.new_finished_sub_slot(
616
+ slot,
617
+ blockchain,
618
+ blockchain.get_peak(),
619
+ next_sub_slot_iters,
620
+ next_difficulty,
621
+ await blockchain.get_full_peak(),
622
+ )
623
+ finished_sub_slots = blocks_2[-1].finished_sub_slots
624
+ assert len(store.finished_sub_slots) == 4
625
+
626
+ # Test adding signage points for overflow blocks (sp_sub_slot)
627
+ ss_start_iters = peak.sp_sub_slot_total_iters(custom_block_tools.constants)
628
+ # for i in range(peak.signage_point_index, custom_block_tools.constants.NUM_SPS_SUB_SLOT):
629
+ # if i < peak.signage_point_index:
630
+ # continue
631
+ # latest = peak
632
+ # while latest.total_iters > peak.sp_total_iters(custom_block_tools.constants):
633
+ # latest = blockchain.blocks[latest.prev_hash]
634
+ # sp = get_signage_point(
635
+ # custom_block_tools.constants,
636
+ # blockchain.blocks,
637
+ # latest,
638
+ # ss_start_iters,
639
+ # uint8(i),
640
+ # [],
641
+ # peak.sub_slot_iters,
642
+ # )
643
+ # assert store.new_signage_point(i, blockchain.blocks, peak, peak.sub_slot_iters, sp)
644
+
645
+ # Test adding signage points for overflow blocks (ip_sub_slot)
646
+ for i in range(
647
+ 1, custom_block_tools.constants.NUM_SPS_SUB_SLOT - custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA
648
+ ):
649
+ sp = get_signage_point(
650
+ custom_block_tools.constants,
651
+ blockchain,
652
+ peak,
653
+ peak.ip_sub_slot_total_iters(custom_block_tools.constants),
654
+ uint8(i),
655
+ [],
656
+ peak.sub_slot_iters,
657
+ )
658
+ assert store.new_signage_point(uint8(i), blockchain, peak, peak.sub_slot_iters, sp)
659
+
660
+ # Test adding future signage point, a few slots forward (good)
661
+ saved_sp_hash = None
662
+ for slot_offset in range(1, len(finished_sub_slots)):
663
+ for i in range(
664
+ 1,
665
+ custom_block_tools.constants.NUM_SPS_SUB_SLOT - custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA,
666
+ ):
667
+ sp = get_signage_point(
668
+ custom_block_tools.constants,
669
+ blockchain,
670
+ peak,
671
+ uint128(peak.ip_sub_slot_total_iters(custom_block_tools.constants) + slot_offset * peak.sub_slot_iters),
672
+ uint8(i),
673
+ finished_sub_slots[:slot_offset],
674
+ peak.sub_slot_iters,
675
+ )
676
+ assert sp.cc_vdf is not None
677
+ saved_sp_hash = sp.cc_vdf.output.get_hash()
678
+ assert store.new_signage_point(uint8(i), blockchain, peak, peak.sub_slot_iters, sp)
679
+
680
+ # Test adding future signage point (bad)
681
+ for i in range(
682
+ 1, custom_block_tools.constants.NUM_SPS_SUB_SLOT - custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA
683
+ ):
684
+ sp = get_signage_point(
685
+ custom_block_tools.constants,
686
+ blockchain,
687
+ peak,
688
+ uint128(
689
+ peak.ip_sub_slot_total_iters(custom_block_tools.constants)
690
+ + len(finished_sub_slots) * peak.sub_slot_iters
691
+ ),
692
+ uint8(i),
693
+ finished_sub_slots[: len(finished_sub_slots)],
694
+ peak.sub_slot_iters,
695
+ )
696
+ assert not store.new_signage_point(uint8(i), blockchain, peak, peak.sub_slot_iters, sp)
697
+
698
+ # Test adding past signage point
699
+ sp = SignagePoint(
700
+ blocks[1].reward_chain_block.challenge_chain_sp_vdf,
701
+ blocks[1].challenge_chain_sp_proof,
702
+ blocks[1].reward_chain_block.reward_chain_sp_vdf,
703
+ blocks[1].reward_chain_sp_proof,
704
+ )
705
+ assert not store.new_signage_point(
706
+ blocks[1].reward_chain_block.signage_point_index,
707
+ blockchain,
708
+ peak,
709
+ uint64(blockchain.block_record(blocks[1].header_hash).sp_sub_slot_total_iters(custom_block_tools.constants)),
710
+ sp,
711
+ )
712
+
713
+ # Get signage point by index
714
+ assert (
715
+ store.get_signage_point_by_index(
716
+ finished_sub_slots[0].challenge_chain.get_hash(),
717
+ uint8(4),
718
+ finished_sub_slots[0].reward_chain.get_hash(),
719
+ )
720
+ is not None
721
+ )
722
+
723
+ assert (
724
+ store.get_signage_point_by_index(finished_sub_slots[0].challenge_chain.get_hash(), uint8(4), std_hash(b"1"))
725
+ is None
726
+ )
727
+
728
+ # Get signage point by hash
729
+ assert saved_sp_hash is not None
730
+ assert store.get_signage_point(saved_sp_hash) is not None
731
+ assert store.get_signage_point(std_hash(b"2")) is None
732
+
733
+ # Test adding signage points before genesis
734
+ store.initialize_genesis_sub_slot()
735
+ assert len(store.finished_sub_slots) == 1
736
+ for i in range(
737
+ 1, custom_block_tools.constants.NUM_SPS_SUB_SLOT - custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA
738
+ ):
739
+ sp = get_signage_point(
740
+ custom_block_tools.constants,
741
+ BlockchainMock({}, {}),
742
+ None,
743
+ uint128(0),
744
+ uint8(i),
745
+ [],
746
+ peak.sub_slot_iters,
747
+ )
748
+ assert store.new_signage_point(uint8(i), blockchain, None, peak.sub_slot_iters, sp)
749
+
750
+ blocks_3 = custom_block_tools.get_consecutive_blocks(
751
+ 1,
752
+ skip_slots=2,
753
+ normalized_to_identity_cc_eos=normalized_to_identity,
754
+ normalized_to_identity_icc_eos=normalized_to_identity,
755
+ normalized_to_identity_cc_ip=normalized_to_identity,
756
+ normalized_to_identity_cc_sp=normalized_to_identity,
757
+ )
758
+ peak = blockchain.get_peak()
759
+ assert peak is not None
760
+ for slot in blocks_3[-1].finished_sub_slots:
761
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
762
+ blockchain.constants, True, peak, blockchain
763
+ )
764
+
765
+ store.new_finished_sub_slot(slot, blockchain, None, next_sub_slot_iters, next_difficulty, None)
766
+ assert len(store.finished_sub_slots) == 3
767
+ finished_sub_slots = blocks_3[-1].finished_sub_slots
768
+
769
+ for slot_offset in range(1, len(finished_sub_slots) + 1):
770
+ for i in range(
771
+ 1,
772
+ custom_block_tools.constants.NUM_SPS_SUB_SLOT - custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA,
773
+ ):
774
+ sp = get_signage_point(
775
+ custom_block_tools.constants,
776
+ BlockchainMock({}, {}),
777
+ None,
778
+ uint128(slot_offset * peak.sub_slot_iters),
779
+ uint8(i),
780
+ finished_sub_slots[:slot_offset],
781
+ peak.sub_slot_iters,
782
+ )
783
+ assert store.new_signage_point(uint8(i), blockchain, None, peak.sub_slot_iters, sp)
784
+
785
+ # Test adding signage points after genesis
786
+ blocks_4 = custom_block_tools.get_consecutive_blocks(
787
+ 1,
788
+ normalized_to_identity_cc_eos=normalized_to_identity,
789
+ normalized_to_identity_icc_eos=normalized_to_identity,
790
+ normalized_to_identity_cc_ip=normalized_to_identity,
791
+ normalized_to_identity_cc_sp=normalized_to_identity,
792
+ )
793
+ blocks_5 = custom_block_tools.get_consecutive_blocks(
794
+ 1,
795
+ block_list_input=blocks_4,
796
+ skip_slots=1,
797
+ normalized_to_identity_cc_eos=normalized_to_identity,
798
+ normalized_to_identity_icc_eos=normalized_to_identity,
799
+ normalized_to_identity_cc_ip=normalized_to_identity,
800
+ normalized_to_identity_cc_sp=normalized_to_identity,
801
+ )
802
+
803
+ # If this is not the case, fix test to find a block that is
804
+ assert (
805
+ blocks_4[-1].reward_chain_block.signage_point_index
806
+ < custom_block_tools.constants.NUM_SPS_SUB_SLOT - custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA
807
+ )
808
+ await _validate_and_add_block(blockchain, blocks_4[-1], expected_result=AddBlockResult.ADDED_AS_ORPHAN)
809
+
810
+ sb = blockchain.block_record(blocks_4[-1].header_hash)
811
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
812
+ blockchain.constants, False, sb, blockchain
813
+ )
814
+
815
+ store.new_peak(sb, blocks_4[-1], None, None, None, blockchain, next_sub_slot_iters, next_difficulty)
816
+ for i in range(
817
+ sb.signage_point_index + custom_block_tools.constants.NUM_SP_INTERVALS_EXTRA,
818
+ custom_block_tools.constants.NUM_SPS_SUB_SLOT,
819
+ ):
820
+ if is_overflow_block(custom_block_tools.constants, uint8(i)):
821
+ finished_sub_slots = blocks_5[-1].finished_sub_slots
822
+ else:
823
+ finished_sub_slots = []
824
+
825
+ sp = get_signage_point(
826
+ custom_block_tools.constants,
827
+ blockchain,
828
+ sb,
829
+ uint128(0),
830
+ uint8(i),
831
+ finished_sub_slots,
832
+ peak.sub_slot_iters,
833
+ )
834
+ assert store.new_signage_point(uint8(i), empty_blockchain, sb, peak.sub_slot_iters, sp)
835
+
836
+ # Test future EOS cache
837
+ store.initialize_genesis_sub_slot()
838
+ fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
839
+ blocks = custom_block_tools.get_consecutive_blocks(
840
+ 1,
841
+ normalized_to_identity_cc_eos=normalized_to_identity,
842
+ normalized_to_identity_icc_eos=normalized_to_identity,
843
+ normalized_to_identity_cc_ip=normalized_to_identity,
844
+ normalized_to_identity_cc_sp=normalized_to_identity,
845
+ )
846
+ await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
847
+ while True:
848
+ blocks = custom_block_tools.get_consecutive_blocks(
849
+ 1,
850
+ block_list_input=blocks,
851
+ normalized_to_identity_cc_eos=normalized_to_identity,
852
+ normalized_to_identity_icc_eos=normalized_to_identity,
853
+ normalized_to_identity_cc_ip=normalized_to_identity,
854
+ normalized_to_identity_cc_sp=normalized_to_identity,
855
+ )
856
+ await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
857
+ sb = blockchain.block_record(blocks[-1].header_hash)
858
+ if sb.first_in_sub_slot:
859
+ break
860
+ assert len(blocks) >= 2
861
+ dependant_sub_slots = blocks[-1].finished_sub_slots
862
+ peak = blockchain.get_peak()
863
+ assert peak is not None
864
+ peak_full_block = await blockchain.get_full_peak()
865
+ for block in blocks[:-2]:
866
+ sb = blockchain.block_record(block.header_hash)
867
+ result = await blockchain.get_sp_and_ip_sub_slots(block.header_hash)
868
+ assert result is not None
869
+ sp_sub_slot, ip_sub_slot = result
870
+ peak = sb
871
+ peak_full_block = block
872
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
873
+ blockchain.constants, False, peak, blockchain
874
+ )
875
+
876
+ res = store.new_peak(
877
+ sb, block, sp_sub_slot, ip_sub_slot, None, blockchain, next_sub_slot_iters, next_difficulty
878
+ )
879
+ assert res.added_eos is None
880
+
881
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
882
+ blockchain.constants, True, peak, blockchain
883
+ )
884
+
885
+ assert (
886
+ store.new_finished_sub_slot(
887
+ dependant_sub_slots[0], blockchain, peak, next_sub_slot_iters, next_difficulty, peak_full_block
888
+ )
889
+ is None
890
+ )
891
+ block = blocks[-2]
892
+ sb = blockchain.block_record(block.header_hash)
893
+ result = await blockchain.get_sp_and_ip_sub_slots(block.header_hash)
894
+ assert result is not None
895
+ sp_sub_slot, ip_sub_slot = result
896
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
897
+ blockchain.constants, False, sb, blockchain
898
+ )
899
+
900
+ res = store.new_peak(sb, block, sp_sub_slot, ip_sub_slot, None, blockchain, next_sub_slot_iters, next_difficulty)
901
+ assert res.added_eos == dependant_sub_slots[0]
902
+ assert res.new_signage_points == []
903
+ assert res.new_infusion_points == []
904
+
905
+ # Test future IP cache
906
+ store.initialize_genesis_sub_slot()
907
+ blocks = custom_block_tools.get_consecutive_blocks(
908
+ 60,
909
+ normalized_to_identity_cc_ip=normalized_to_identity,
910
+ normalized_to_identity_cc_sp=normalized_to_identity,
911
+ normalized_to_identity_cc_eos=normalized_to_identity,
912
+ normalized_to_identity_icc_eos=normalized_to_identity,
913
+ )
914
+
915
+ fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
916
+ for block in blocks[:5]:
917
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
918
+ sb = blockchain.block_record(block.header_hash)
919
+ result = await blockchain.get_sp_and_ip_sub_slots(block.header_hash)
920
+ assert result is not None
921
+ sp_sub_slot, ip_sub_slot = result
922
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
923
+ blockchain.constants, False, sb, blockchain
924
+ )
925
+
926
+ res = store.new_peak(
927
+ sb, block, sp_sub_slot, ip_sub_slot, None, blockchain, next_sub_slot_iters, next_difficulty
928
+ )
929
+ assert res.added_eos is None
930
+
931
+ case_0, case_1 = False, False
932
+ for i in range(5, len(blocks) - 1):
933
+ prev_block = blocks[i]
934
+ block = blocks[i + 1]
935
+ new_ip = NewInfusionPointVDF(
936
+ block.reward_chain_block.get_unfinished().get_hash(),
937
+ block.reward_chain_block.challenge_chain_ip_vdf,
938
+ block.challenge_chain_ip_proof,
939
+ block.reward_chain_block.reward_chain_ip_vdf,
940
+ block.reward_chain_ip_proof,
941
+ block.reward_chain_block.infused_challenge_chain_ip_vdf,
942
+ block.infused_challenge_chain_ip_proof,
943
+ )
944
+ store.add_to_future_ip(new_ip)
945
+
946
+ await _validate_and_add_block_no_error(blockchain, prev_block, fork_info=fork_info)
947
+ result = await blockchain.get_sp_and_ip_sub_slots(prev_block.header_hash)
948
+ assert result is not None
949
+ sp_sub_slot, ip_sub_slot = result
950
+ sb = blockchain.block_record(prev_block.header_hash)
951
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
952
+ blockchain.constants, False, sb, blockchain
953
+ )
954
+
955
+ res = store.new_peak(
956
+ sb, prev_block, sp_sub_slot, ip_sub_slot, None, blockchain, next_sub_slot_iters, next_difficulty
957
+ )
958
+ if len(block.finished_sub_slots) == 0:
959
+ case_0 = True
960
+ assert res.new_infusion_points == [new_ip]
961
+ else:
962
+ case_1 = True
963
+ assert res.new_infusion_points == []
964
+ found_ips: list[timelord_protocol.NewInfusionPointVDF] = []
965
+ peak = blockchain.get_peak()
966
+
967
+ for ss in block.finished_sub_slots:
968
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
969
+ blockchain.constants, True, peak, blockchain
970
+ )
971
+
972
+ ipvdf = store.new_finished_sub_slot(
973
+ ss, blockchain, sb, next_sub_slot_iters, next_difficulty, prev_block
974
+ )
975
+ assert ipvdf is not None
976
+ found_ips += ipvdf
977
+ assert found_ips == [new_ip]
978
+
979
+ # If flaky, increase the number of blocks created
980
+ assert case_0 and case_1
981
+
982
+ # Try to get two blocks in the same slot, such that we have
983
+ # SP, B2 SP .... SP B1
984
+ # i2 ......... i1
985
+ # Then do a reorg up to B2, removing all signage points after B2, but not before
986
+ log.warning(f"Adding blocks up to {blocks[-1]}")
987
+ fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
988
+ for block in blocks:
989
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
990
+
991
+ log.warning("Starting loop")
992
+ while True:
993
+ log.warning("Looping")
994
+ blocks = custom_block_tools.get_consecutive_blocks(1, block_list_input=blocks, skip_slots=1)
995
+ await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
996
+ peak = blockchain.get_peak()
997
+ assert peak is not None
998
+ result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
999
+ assert result is not None
1000
+ sp_sub_slot, ip_sub_slot = result
1001
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
1002
+ blockchain.constants, False, peak, blockchain
1003
+ )
1004
+
1005
+ store.new_peak(
1006
+ peak, blocks[-1], sp_sub_slot, ip_sub_slot, None, blockchain, next_sub_slot_iters, next_difficulty
1007
+ )
1008
+
1009
+ blocks = custom_block_tools.get_consecutive_blocks(2, block_list_input=blocks, guarantee_transaction_block=True)
1010
+
1011
+ i3 = blocks[-3].reward_chain_block.signage_point_index
1012
+ i2 = blocks[-2].reward_chain_block.signage_point_index
1013
+ i1 = blocks[-1].reward_chain_block.signage_point_index
1014
+ if (
1015
+ len(blocks[-2].finished_sub_slots) == len(blocks[-1].finished_sub_slots) == 0
1016
+ and not is_overflow_block(custom_block_tools.constants, signage_point_index=i2)
1017
+ and not is_overflow_block(custom_block_tools.constants, signage_point_index=i1)
1018
+ and i2 > i3 + 3
1019
+ and i1 > (i2 + 3)
1020
+ ):
1021
+ # We hit all the conditions that we want
1022
+ all_sps: list[Optional[SignagePoint]] = [None] * custom_block_tools.constants.NUM_SPS_SUB_SLOT
1023
+
1024
+ def assert_sp_none(sp_index: int, is_none: bool) -> None:
1025
+ sp_to_check: Optional[SignagePoint] = all_sps[sp_index]
1026
+ assert sp_to_check is not None
1027
+ assert sp_to_check.cc_vdf is not None
1028
+ fetched = store.get_signage_point(sp_to_check.cc_vdf.output.get_hash())
1029
+ assert (fetched is None) == is_none
1030
+ if fetched is not None:
1031
+ assert fetched == sp_to_check
1032
+
1033
+ for i in range(i3 + 1, custom_block_tools.constants.NUM_SPS_SUB_SLOT - 3):
1034
+ finished_sub_slots = []
1035
+ sp = get_signage_point(
1036
+ custom_block_tools.constants,
1037
+ blockchain,
1038
+ peak,
1039
+ uint128(peak.ip_sub_slot_total_iters(custom_block_tools.constants)),
1040
+ uint8(i),
1041
+ finished_sub_slots,
1042
+ peak.sub_slot_iters,
1043
+ )
1044
+ all_sps[i] = sp
1045
+ assert store.new_signage_point(uint8(i), blockchain, peak, peak.sub_slot_iters, sp)
1046
+
1047
+ # Adding a new peak clears all SPs after that peak
1048
+ await _validate_and_add_block_no_error(blockchain, blocks[-2], fork_info=fork_info)
1049
+ peak = blockchain.get_peak()
1050
+ assert peak is not None
1051
+ result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
1052
+ assert result is not None
1053
+ sp_sub_slot, ip_sub_slot = result
1054
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
1055
+ blockchain.constants, False, peak, blockchain
1056
+ )
1057
+
1058
+ store.new_peak(
1059
+ peak, blocks[-2], sp_sub_slot, ip_sub_slot, None, blockchain, next_sub_slot_iters, next_difficulty
1060
+ )
1061
+
1062
+ assert_sp_none(i2, False)
1063
+ assert_sp_none(i2 + 1, False)
1064
+ assert_sp_none(i1, True)
1065
+ assert_sp_none(i1 + 1, True)
1066
+ # We load into `all_sps` only up to `NUM_SPS_SUB_SLOT - 3`, so make sure we're not out of range
1067
+ if i1 + 4 < custom_block_tools.constants.NUM_SPS_SUB_SLOT - 3:
1068
+ assert_sp_none(i1 + 4, True)
1069
+
1070
+ for i in range(i2, custom_block_tools.constants.NUM_SPS_SUB_SLOT):
1071
+ if is_overflow_block(custom_block_tools.constants, uint8(i)):
1072
+ blocks_alt = custom_block_tools.get_consecutive_blocks(
1073
+ 1, block_list_input=blocks[:-1], skip_slots=1
1074
+ )
1075
+ finished_sub_slots = blocks_alt[-1].finished_sub_slots
1076
+ else:
1077
+ finished_sub_slots = []
1078
+ sp = get_signage_point(
1079
+ custom_block_tools.constants,
1080
+ blockchain,
1081
+ peak,
1082
+ uint128(peak.ip_sub_slot_total_iters(custom_block_tools.constants)),
1083
+ uint8(i),
1084
+ finished_sub_slots,
1085
+ peak.sub_slot_iters,
1086
+ )
1087
+ all_sps[i] = sp
1088
+ assert store.new_signage_point(uint8(i), blockchain, peak, peak.sub_slot_iters, sp)
1089
+
1090
+ assert_sp_none(i2, False)
1091
+ assert_sp_none(i2 + 1, False)
1092
+ assert_sp_none(i1, False)
1093
+ assert_sp_none(i1 + 1, False)
1094
+ assert_sp_none(i1 + 4, False)
1095
+
1096
+ await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
1097
+ peak = blockchain.get_peak()
1098
+ assert peak is not None
1099
+ result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
1100
+ assert result is not None
1101
+ sp_sub_slot, ip_sub_slot = result
1102
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
1103
+ blockchain.constants, False, peak, blockchain
1104
+ )
1105
+
1106
+ # Do a reorg, which should remove everything after B2
1107
+ store.new_peak(
1108
+ peak,
1109
+ blocks[-1],
1110
+ sp_sub_slot,
1111
+ ip_sub_slot,
1112
+ (await blockchain.get_block_records_at([blocks[-2].height]))[0],
1113
+ blockchain,
1114
+ next_sub_slot_iters,
1115
+ next_difficulty,
1116
+ )
1117
+
1118
+ assert_sp_none(i2, False)
1119
+ assert_sp_none(i2 + 1, False)
1120
+ assert_sp_none(i1, True)
1121
+ assert_sp_none(i1 + 1, True)
1122
+ assert_sp_none(i1 + 4, True)
1123
+ break
1124
+ else:
1125
+ for block in blocks[-2:]:
1126
+ await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
1127
+
1128
+
1129
+ @pytest.mark.limit_consensus_modes(reason="save time")
1130
+ @pytest.mark.anyio
1131
+ async def test_long_chain_slots(
1132
+ empty_blockchain_with_original_constants: Blockchain,
1133
+ default_1000_blocks: list[FullBlock],
1134
+ ) -> None:
1135
+ blockchain = empty_blockchain_with_original_constants
1136
+ store = FullNodeStore(blockchain.constants)
1137
+ peak = None
1138
+ peak_full_block = None
1139
+ for block in default_1000_blocks:
1140
+ next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
1141
+ blockchain.constants, True, peak, blockchain
1142
+ )
1143
+
1144
+ for sub_slot in block.finished_sub_slots:
1145
+ assert (
1146
+ store.new_finished_sub_slot(
1147
+ sub_slot, blockchain, peak, next_sub_slot_iters, next_difficulty, peak_full_block
1148
+ )
1149
+ is not None
1150
+ )
1151
+ await _validate_and_add_block(blockchain, block)
1152
+ peak = blockchain.get_peak()
1153
+ assert peak is not None
1154
+ peak_full_block = await blockchain.get_full_peak()
1155
+ assert peak_full_block is not None
1156
+ result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
1157
+ assert result is not None
1158
+ sp_sub_slot, ip_sub_slot = result
1159
+ store.new_peak(
1160
+ peak, peak_full_block, sp_sub_slot, ip_sub_slot, None, blockchain, next_sub_slot_iters, next_difficulty
1161
+ )
1162
+
1163
+
1164
+ @pytest.mark.anyio
1165
+ async def test_mark_requesting(
1166
+ seeded_random: random.Random,
1167
+ ) -> None:
1168
+ store = FullNodeStore(DEFAULT_CONSTANTS)
1169
+ a = bytes32.random(seeded_random)
1170
+ b = bytes32.random(seeded_random)
1171
+ c = bytes32.random(seeded_random)
1172
+
1173
+ assert store.is_requesting_unfinished_block(a, a) == (False, 0)
1174
+ assert store.is_requesting_unfinished_block(a, b) == (False, 0)
1175
+ assert store.is_requesting_unfinished_block(a, c) == (False, 0)
1176
+ assert store.is_requesting_unfinished_block(b, b) == (False, 0)
1177
+ assert store.is_requesting_unfinished_block(c, c) == (False, 0)
1178
+
1179
+ store.mark_requesting_unfinished_block(a, b)
1180
+ assert store.is_requesting_unfinished_block(a, b) == (True, 1)
1181
+ assert store.is_requesting_unfinished_block(a, c) == (False, 1)
1182
+ assert store.is_requesting_unfinished_block(a, a) == (False, 1)
1183
+ assert store.is_requesting_unfinished_block(b, c) == (False, 0)
1184
+ assert store.is_requesting_unfinished_block(b, b) == (False, 0)
1185
+
1186
+ store.mark_requesting_unfinished_block(a, c)
1187
+ assert store.is_requesting_unfinished_block(a, b) == (True, 2)
1188
+ assert store.is_requesting_unfinished_block(a, c) == (True, 2)
1189
+ assert store.is_requesting_unfinished_block(a, a) == (False, 2)
1190
+ assert store.is_requesting_unfinished_block(b, c) == (False, 0)
1191
+ assert store.is_requesting_unfinished_block(b, b) == (False, 0)
1192
+
1193
+ # this is a no-op
1194
+ store.remove_requesting_unfinished_block(a, a)
1195
+ store.remove_requesting_unfinished_block(c, a)
1196
+
1197
+ assert store.is_requesting_unfinished_block(a, b) == (True, 2)
1198
+ assert store.is_requesting_unfinished_block(a, c) == (True, 2)
1199
+ assert store.is_requesting_unfinished_block(a, a) == (False, 2)
1200
+ assert store.is_requesting_unfinished_block(b, c) == (False, 0)
1201
+ assert store.is_requesting_unfinished_block(b, b) == (False, 0)
1202
+
1203
+ store.remove_requesting_unfinished_block(a, b)
1204
+
1205
+ assert store.is_requesting_unfinished_block(a, b) == (False, 1)
1206
+ assert store.is_requesting_unfinished_block(a, c) == (True, 1)
1207
+ assert store.is_requesting_unfinished_block(a, a) == (False, 1)
1208
+ assert store.is_requesting_unfinished_block(b, c) == (False, 0)
1209
+ assert store.is_requesting_unfinished_block(b, b) == (False, 0)
1210
+
1211
+ store.remove_requesting_unfinished_block(a, c)
1212
+
1213
+ assert store.is_requesting_unfinished_block(a, b) == (False, 0)
1214
+ assert store.is_requesting_unfinished_block(a, c) == (False, 0)
1215
+ assert store.is_requesting_unfinished_block(a, a) == (False, 0)
1216
+ assert store.is_requesting_unfinished_block(b, c) == (False, 0)
1217
+ assert store.is_requesting_unfinished_block(b, b) == (False, 0)
1218
+
1219
+ assert len(store._unfinished_blocks) == 0