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