chia-blockchain 2.5.1rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +10 -0
- chia/__main__.py +5 -0
- chia/_tests/README.md +53 -0
- chia/_tests/__init__.py +0 -0
- chia/_tests/blockchain/__init__.py +0 -0
- chia/_tests/blockchain/blockchain_test_utils.py +195 -0
- chia/_tests/blockchain/config.py +4 -0
- chia/_tests/blockchain/test_augmented_chain.py +145 -0
- chia/_tests/blockchain/test_blockchain.py +4202 -0
- chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
- chia/_tests/blockchain/test_build_chains.py +59 -0
- chia/_tests/blockchain/test_get_block_generator.py +72 -0
- chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
- chia/_tests/build-init-files.py +92 -0
- chia/_tests/build-job-matrix.py +204 -0
- chia/_tests/check_pytest_monitor_output.py +34 -0
- chia/_tests/check_sql_statements.py +72 -0
- chia/_tests/chia-start-sim +42 -0
- chia/_tests/clvm/__init__.py +0 -0
- chia/_tests/clvm/benchmark_costs.py +23 -0
- chia/_tests/clvm/coin_store.py +149 -0
- chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
- chia/_tests/clvm/test_clvm_step.py +37 -0
- chia/_tests/clvm/test_condition_codes.py +13 -0
- chia/_tests/clvm/test_curry_and_treehash.py +55 -0
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_program.py +150 -0
- chia/_tests/clvm/test_puzzle_compression.py +143 -0
- chia/_tests/clvm/test_puzzle_drivers.py +45 -0
- chia/_tests/clvm/test_puzzles.py +242 -0
- chia/_tests/clvm/test_singletons.py +540 -0
- chia/_tests/clvm/test_spend_sim.py +181 -0
- chia/_tests/cmds/__init__.py +0 -0
- chia/_tests/cmds/cmd_test_utils.py +469 -0
- chia/_tests/cmds/config.py +3 -0
- chia/_tests/cmds/conftest.py +23 -0
- chia/_tests/cmds/test_click_types.py +200 -0
- chia/_tests/cmds/test_cmd_framework.py +620 -0
- chia/_tests/cmds/test_cmds_util.py +97 -0
- chia/_tests/cmds/test_daemon.py +92 -0
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +66 -0
- chia/_tests/cmds/test_show.py +116 -0
- chia/_tests/cmds/test_sim.py +207 -0
- chia/_tests/cmds/test_timelock_args.py +75 -0
- chia/_tests/cmds/test_tx_config_args.py +154 -0
- chia/_tests/cmds/testing_classes.py +59 -0
- chia/_tests/cmds/wallet/__init__.py +0 -0
- chia/_tests/cmds/wallet/test_consts.py +47 -0
- chia/_tests/cmds/wallet/test_dao.py +565 -0
- chia/_tests/cmds/wallet/test_did.py +403 -0
- chia/_tests/cmds/wallet/test_nft.py +471 -0
- chia/_tests/cmds/wallet/test_notifications.py +124 -0
- chia/_tests/cmds/wallet/test_offer.toffer +1 -0
- chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
- chia/_tests/cmds/wallet/test_vcs.py +400 -0
- chia/_tests/cmds/wallet/test_wallet.py +1125 -0
- chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
- chia/_tests/conftest.py +1419 -0
- chia/_tests/connection_utils.py +125 -0
- chia/_tests/core/__init__.py +0 -0
- chia/_tests/core/cmds/__init__.py +0 -0
- chia/_tests/core/cmds/test_beta.py +382 -0
- chia/_tests/core/cmds/test_keys.py +1734 -0
- chia/_tests/core/cmds/test_wallet.py +126 -0
- chia/_tests/core/config.py +3 -0
- chia/_tests/core/consensus/__init__.py +0 -0
- chia/_tests/core/consensus/test_block_creation.py +54 -0
- chia/_tests/core/consensus/test_pot_iterations.py +117 -0
- chia/_tests/core/custom_types/__init__.py +0 -0
- chia/_tests/core/custom_types/test_coin.py +107 -0
- chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
- chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
- chia/_tests/core/daemon/__init__.py +0 -0
- chia/_tests/core/daemon/config.py +4 -0
- chia/_tests/core/daemon/test_daemon.py +2128 -0
- chia/_tests/core/daemon/test_daemon_register.py +109 -0
- chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
- chia/_tests/core/data_layer/__init__.py +0 -0
- chia/_tests/core/data_layer/config.py +5 -0
- chia/_tests/core/data_layer/conftest.py +106 -0
- chia/_tests/core/data_layer/test_data_cli.py +56 -0
- chia/_tests/core/data_layer/test_data_layer.py +83 -0
- chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
- chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
- chia/_tests/core/data_layer/test_data_store.py +2424 -0
- chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
- chia/_tests/core/data_layer/test_plugin.py +91 -0
- chia/_tests/core/data_layer/util.py +233 -0
- chia/_tests/core/farmer/__init__.py +0 -0
- chia/_tests/core/farmer/config.py +3 -0
- chia/_tests/core/farmer/test_farmer_api.py +103 -0
- chia/_tests/core/full_node/__init__.py +0 -0
- chia/_tests/core/full_node/config.py +4 -0
- chia/_tests/core/full_node/dos/__init__.py +0 -0
- chia/_tests/core/full_node/dos/config.py +3 -0
- chia/_tests/core/full_node/full_sync/__init__.py +0 -0
- chia/_tests/core/full_node/full_sync/config.py +4 -0
- chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
- chia/_tests/core/full_node/ram_db.py +27 -0
- chia/_tests/core/full_node/stores/__init__.py +0 -0
- chia/_tests/core/full_node/stores/config.py +4 -0
- chia/_tests/core/full_node/stores/test_block_store.py +590 -0
- chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
- chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
- chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
- chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
- chia/_tests/core/full_node/test_address_manager.py +588 -0
- chia/_tests/core/full_node/test_block_height_map.py +556 -0
- chia/_tests/core/full_node/test_conditions.py +556 -0
- chia/_tests/core/full_node/test_full_node.py +2700 -0
- chia/_tests/core/full_node/test_generator_tools.py +82 -0
- chia/_tests/core/full_node/test_hint_management.py +104 -0
- chia/_tests/core/full_node/test_node_load.py +34 -0
- chia/_tests/core/full_node/test_performance.py +179 -0
- chia/_tests/core/full_node/test_subscriptions.py +492 -0
- chia/_tests/core/full_node/test_transactions.py +203 -0
- chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
- chia/_tests/core/large_block.py +2388 -0
- chia/_tests/core/make_block_generator.py +70 -0
- chia/_tests/core/mempool/__init__.py +0 -0
- chia/_tests/core/mempool/config.py +4 -0
- chia/_tests/core/mempool/test_mempool.py +3255 -0
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
- chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
- chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
- chia/_tests/core/mempool/test_mempool_performance.py +64 -0
- chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
- chia/_tests/core/node_height.py +28 -0
- chia/_tests/core/server/__init__.py +0 -0
- chia/_tests/core/server/config.py +3 -0
- chia/_tests/core/server/flood.py +84 -0
- chia/_tests/core/server/serve.py +135 -0
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +66 -0
- chia/_tests/core/server/test_dos.py +319 -0
- chia/_tests/core/server/test_event_loop.py +109 -0
- chia/_tests/core/server/test_loop.py +294 -0
- chia/_tests/core/server/test_node_discovery.py +73 -0
- chia/_tests/core/server/test_rate_limits.py +482 -0
- chia/_tests/core/server/test_server.py +226 -0
- chia/_tests/core/server/test_upnp.py +8 -0
- chia/_tests/core/services/__init__.py +0 -0
- chia/_tests/core/services/config.py +3 -0
- chia/_tests/core/services/test_services.py +188 -0
- chia/_tests/core/ssl/__init__.py +0 -0
- chia/_tests/core/ssl/config.py +3 -0
- chia/_tests/core/ssl/test_ssl.py +202 -0
- chia/_tests/core/test_coins.py +33 -0
- chia/_tests/core/test_cost_calculation.py +313 -0
- chia/_tests/core/test_crawler.py +175 -0
- chia/_tests/core/test_crawler_rpc.py +53 -0
- chia/_tests/core/test_daemon_rpc.py +24 -0
- chia/_tests/core/test_db_conversion.py +130 -0
- chia/_tests/core/test_db_validation.py +162 -0
- chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
- chia/_tests/core/test_filter.py +35 -0
- chia/_tests/core/test_full_node_rpc.py +768 -0
- chia/_tests/core/test_merkle_set.py +343 -0
- chia/_tests/core/test_program.py +47 -0
- chia/_tests/core/test_rpc_util.py +86 -0
- chia/_tests/core/test_seeder.py +420 -0
- chia/_tests/core/test_setproctitle.py +13 -0
- chia/_tests/core/util/__init__.py +0 -0
- chia/_tests/core/util/config.py +4 -0
- chia/_tests/core/util/test_block_cache.py +44 -0
- chia/_tests/core/util/test_cached_bls.py +57 -0
- chia/_tests/core/util/test_config.py +337 -0
- chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
- chia/_tests/core/util/test_files.py +391 -0
- chia/_tests/core/util/test_jsonify.py +146 -0
- chia/_tests/core/util/test_keychain.py +522 -0
- chia/_tests/core/util/test_keyring_wrapper.py +491 -0
- chia/_tests/core/util/test_lockfile.py +380 -0
- chia/_tests/core/util/test_log_exceptions.py +187 -0
- chia/_tests/core/util/test_lru_cache.py +56 -0
- chia/_tests/core/util/test_significant_bits.py +40 -0
- chia/_tests/core/util/test_streamable.py +883 -0
- chia/_tests/db/__init__.py +0 -0
- chia/_tests/db/test_db_wrapper.py +566 -0
- chia/_tests/environments/__init__.py +0 -0
- chia/_tests/environments/common.py +35 -0
- chia/_tests/environments/full_node.py +47 -0
- chia/_tests/environments/wallet.py +429 -0
- chia/_tests/ether.py +19 -0
- chia/_tests/farmer_harvester/__init__.py +0 -0
- chia/_tests/farmer_harvester/config.py +3 -0
- chia/_tests/farmer_harvester/test_farmer.py +1264 -0
- chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
- chia/_tests/fee_estimation/__init__.py +0 -0
- chia/_tests/fee_estimation/config.py +3 -0
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
- chia/_tests/generator/__init__.py +0 -0
- chia/_tests/generator/puzzles/__init__.py +0 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
- chia/_tests/generator/test_compression.py +201 -0
- chia/_tests/generator/test_generator_types.py +44 -0
- chia/_tests/generator/test_rom.py +180 -0
- chia/_tests/plot_sync/__init__.py +0 -0
- chia/_tests/plot_sync/config.py +3 -0
- chia/_tests/plot_sync/test_delta.py +101 -0
- chia/_tests/plot_sync/test_plot_sync.py +618 -0
- chia/_tests/plot_sync/test_receiver.py +451 -0
- chia/_tests/plot_sync/test_sender.py +116 -0
- chia/_tests/plot_sync/test_sync_simulated.py +451 -0
- chia/_tests/plot_sync/util.py +68 -0
- chia/_tests/plotting/__init__.py +0 -0
- chia/_tests/plotting/config.py +3 -0
- chia/_tests/plotting/test_plot_manager.py +781 -0
- chia/_tests/plotting/util.py +12 -0
- chia/_tests/pools/__init__.py +0 -0
- chia/_tests/pools/config.py +5 -0
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +1001 -0
- chia/_tests/pools/test_pool_config.py +42 -0
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
- chia/_tests/pools/test_pool_rpc.py +1123 -0
- chia/_tests/pools/test_pool_wallet.py +205 -0
- chia/_tests/pools/test_wallet_pool_store.py +161 -0
- chia/_tests/process_junit.py +348 -0
- chia/_tests/rpc/__init__.py +0 -0
- chia/_tests/rpc/test_rpc_client.py +138 -0
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/__init__.py +0 -0
- chia/_tests/simulation/config.py +6 -0
- chia/_tests/simulation/test_simulation.py +501 -0
- chia/_tests/simulation/test_simulator.py +232 -0
- chia/_tests/simulation/test_start_simulator.py +107 -0
- chia/_tests/testconfig.py +13 -0
- chia/_tests/timelord/__init__.py +0 -0
- chia/_tests/timelord/config.py +3 -0
- chia/_tests/timelord/test_new_peak.py +437 -0
- chia/_tests/timelord/test_timelord.py +11 -0
- chia/_tests/tools/1315537.json +170 -0
- chia/_tests/tools/1315544.json +160 -0
- chia/_tests/tools/1315630.json +150 -0
- chia/_tests/tools/300000.json +105 -0
- chia/_tests/tools/442734.json +140 -0
- chia/_tests/tools/466212.json +130 -0
- chia/_tests/tools/__init__.py +0 -0
- chia/_tests/tools/config.py +5 -0
- chia/_tests/tools/test-blockchain-db.sqlite +0 -0
- chia/_tests/tools/test_full_sync.py +30 -0
- chia/_tests/tools/test_legacy_keyring.py +82 -0
- chia/_tests/tools/test_run_block.py +128 -0
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/__init__.py +0 -0
- chia/_tests/util/benchmark_cost.py +170 -0
- chia/_tests/util/benchmarks.py +153 -0
- chia/_tests/util/bip39_test_vectors.json +148 -0
- chia/_tests/util/blockchain.py +134 -0
- chia/_tests/util/blockchain_mock.py +132 -0
- chia/_tests/util/build_network_protocol_files.py +302 -0
- chia/_tests/util/clvm_generator.bin +0 -0
- chia/_tests/util/config.py +3 -0
- chia/_tests/util/constants.py +20 -0
- chia/_tests/util/db_connection.py +37 -0
- chia/_tests/util/full_sync.py +253 -0
- chia/_tests/util/gen_ssl_certs.py +114 -0
- chia/_tests/util/generator_tools_testing.py +45 -0
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +36 -0
- chia/_tests/util/misc.py +675 -0
- chia/_tests/util/network_protocol_data.py +1072 -0
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +2701 -0
- chia/_tests/util/rpc.py +26 -0
- chia/_tests/util/run_block.py +163 -0
- chia/_tests/util/setup_nodes.py +481 -0
- chia/_tests/util/spend_sim.py +492 -0
- chia/_tests/util/split_managers.py +102 -0
- chia/_tests/util/temp_file.py +14 -0
- chia/_tests/util/test_action_scope.py +144 -0
- chia/_tests/util/test_async_pool.py +366 -0
- chia/_tests/util/test_build_job_matrix.py +42 -0
- chia/_tests/util/test_build_network_protocol_files.py +7 -0
- chia/_tests/util/test_chia_version.py +50 -0
- chia/_tests/util/test_collection.py +11 -0
- chia/_tests/util/test_condition_tools.py +229 -0
- chia/_tests/util/test_config.py +426 -0
- chia/_tests/util/test_dump_keyring.py +60 -0
- chia/_tests/util/test_errors.py +10 -0
- chia/_tests/util/test_full_block_utils.py +279 -0
- chia/_tests/util/test_installed.py +20 -0
- chia/_tests/util/test_limited_semaphore.py +53 -0
- chia/_tests/util/test_logging_filter.py +42 -0
- chia/_tests/util/test_misc.py +445 -0
- chia/_tests/util/test_network.py +73 -0
- chia/_tests/util/test_network_protocol_files.py +578 -0
- chia/_tests/util/test_network_protocol_json.py +267 -0
- chia/_tests/util/test_network_protocol_test.py +256 -0
- chia/_tests/util/test_paginator.py +71 -0
- chia/_tests/util/test_pprint.py +17 -0
- chia/_tests/util/test_priority_mutex.py +488 -0
- chia/_tests/util/test_recursive_replace.py +116 -0
- chia/_tests/util/test_replace_str_to_bytes.py +137 -0
- chia/_tests/util/test_service_groups.py +15 -0
- chia/_tests/util/test_ssl_check.py +31 -0
- chia/_tests/util/test_testnet_overrides.py +19 -0
- chia/_tests/util/test_tests_misc.py +38 -0
- chia/_tests/util/test_timing.py +37 -0
- chia/_tests/util/test_trusted_peer.py +51 -0
- chia/_tests/util/time_out_assert.py +191 -0
- chia/_tests/wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/config.py +4 -0
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
- chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
- chia/_tests/wallet/clawback/__init__.py +0 -0
- chia/_tests/wallet/clawback/config.py +3 -0
- chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
- chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
- chia/_tests/wallet/config.py +4 -0
- chia/_tests/wallet/conftest.py +278 -0
- chia/_tests/wallet/dao_wallet/__init__.py +0 -0
- chia/_tests/wallet/dao_wallet/config.py +3 -0
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
- chia/_tests/wallet/db_wallet/__init__.py +0 -0
- chia/_tests/wallet/db_wallet/config.py +3 -0
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
- chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
- chia/_tests/wallet/did_wallet/__init__.py +0 -0
- chia/_tests/wallet/did_wallet/config.py +4 -0
- chia/_tests/wallet/did_wallet/test_did.py +2284 -0
- chia/_tests/wallet/nft_wallet/__init__.py +0 -0
- chia/_tests/wallet/nft_wallet/config.py +4 -0
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
- chia/_tests/wallet/rpc/__init__.py +0 -0
- chia/_tests/wallet/rpc/config.py +4 -0
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
- chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
- chia/_tests/wallet/simple_sync/__init__.py +0 -0
- chia/_tests/wallet/simple_sync/config.py +3 -0
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
- chia/_tests/wallet/sync/__init__.py +0 -0
- chia/_tests/wallet/sync/config.py +4 -0
- chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
- chia/_tests/wallet/test_address_type.py +189 -0
- chia/_tests/wallet/test_bech32m.py +45 -0
- chia/_tests/wallet/test_clvm_streamable.py +244 -0
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +588 -0
- chia/_tests/wallet/test_conditions.py +400 -0
- chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
- chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
- chia/_tests/wallet/test_nft_store.py +192 -0
- chia/_tests/wallet/test_notifications.py +196 -0
- chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
- chia/_tests/wallet/test_puzzle_store.py +132 -0
- chia/_tests/wallet/test_sign_coin_spends.py +159 -0
- chia/_tests/wallet/test_signer_protocol.py +947 -0
- chia/_tests/wallet/test_singleton.py +122 -0
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
- chia/_tests/wallet/test_singleton_store.py +152 -0
- chia/_tests/wallet/test_taproot.py +19 -0
- chia/_tests/wallet/test_transaction_store.py +945 -0
- chia/_tests/wallet/test_util.py +185 -0
- chia/_tests/wallet/test_wallet.py +2139 -0
- chia/_tests/wallet/test_wallet_action_scope.py +85 -0
- chia/_tests/wallet/test_wallet_blockchain.py +111 -0
- chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
- chia/_tests/wallet/test_wallet_interested_store.py +43 -0
- chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
- chia/_tests/wallet/test_wallet_node.py +780 -0
- chia/_tests/wallet/test_wallet_retry.py +95 -0
- chia/_tests/wallet/test_wallet_state_manager.py +259 -0
- chia/_tests/wallet/test_wallet_test_framework.py +275 -0
- chia/_tests/wallet/test_wallet_trade_store.py +218 -0
- chia/_tests/wallet/test_wallet_user_store.py +34 -0
- chia/_tests/wallet/test_wallet_utils.py +156 -0
- chia/_tests/wallet/vc_wallet/__init__.py +0 -0
- chia/_tests/wallet/vc_wallet/config.py +3 -0
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
- chia/_tests/wallet/wallet_block_tools.py +327 -0
- chia/_tests/weight_proof/__init__.py +0 -0
- chia/_tests/weight_proof/config.py +3 -0
- chia/_tests/weight_proof/test_weight_proof.py +528 -0
- chia/apis.py +19 -0
- chia/clvm/__init__.py +0 -0
- chia/cmds/__init__.py +0 -0
- chia/cmds/beta.py +184 -0
- chia/cmds/beta_funcs.py +137 -0
- chia/cmds/check_wallet_db.py +420 -0
- chia/cmds/chia.py +151 -0
- chia/cmds/cmd_classes.py +323 -0
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +488 -0
- chia/cmds/coin_funcs.py +275 -0
- chia/cmds/coins.py +182 -0
- chia/cmds/completion.py +49 -0
- chia/cmds/configure.py +332 -0
- chia/cmds/dao.py +1064 -0
- chia/cmds/dao_funcs.py +598 -0
- chia/cmds/data.py +708 -0
- chia/cmds/data_funcs.py +385 -0
- chia/cmds/db.py +87 -0
- chia/cmds/db_backup_func.py +77 -0
- chia/cmds/db_upgrade_func.py +452 -0
- chia/cmds/db_validate_func.py +184 -0
- chia/cmds/dev.py +18 -0
- chia/cmds/farm.py +100 -0
- chia/cmds/farm_funcs.py +200 -0
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +63 -0
- chia/cmds/init_funcs.py +367 -0
- chia/cmds/installers.py +131 -0
- chia/cmds/keys.py +527 -0
- chia/cmds/keys_funcs.py +863 -0
- chia/cmds/netspace.py +50 -0
- chia/cmds/netspace_funcs.py +54 -0
- chia/cmds/options.py +32 -0
- chia/cmds/param_types.py +238 -0
- chia/cmds/passphrase.py +131 -0
- chia/cmds/passphrase_funcs.py +292 -0
- chia/cmds/peer.py +51 -0
- chia/cmds/peer_funcs.py +129 -0
- chia/cmds/plotnft.py +260 -0
- chia/cmds/plotnft_funcs.py +405 -0
- chia/cmds/plots.py +230 -0
- chia/cmds/plotters.py +18 -0
- chia/cmds/rpc.py +208 -0
- chia/cmds/show.py +72 -0
- chia/cmds/show_funcs.py +215 -0
- chia/cmds/signer.py +296 -0
- chia/cmds/sim.py +225 -0
- chia/cmds/sim_funcs.py +509 -0
- chia/cmds/start.py +24 -0
- chia/cmds/start_funcs.py +109 -0
- chia/cmds/stop.py +62 -0
- chia/cmds/units.py +9 -0
- chia/cmds/wallet.py +1901 -0
- chia/cmds/wallet_funcs.py +1874 -0
- chia/consensus/__init__.py +0 -0
- chia/consensus/block_body_validation.py +562 -0
- chia/consensus/block_creation.py +546 -0
- chia/consensus/block_header_validation.py +1059 -0
- chia/consensus/block_record.py +31 -0
- chia/consensus/block_rewards.py +53 -0
- chia/consensus/blockchain.py +1087 -0
- chia/consensus/blockchain_interface.py +56 -0
- chia/consensus/coinbase.py +30 -0
- chia/consensus/condition_costs.py +9 -0
- chia/consensus/constants.py +49 -0
- chia/consensus/cost_calculator.py +15 -0
- chia/consensus/default_constants.py +89 -0
- chia/consensus/deficit.py +55 -0
- chia/consensus/difficulty_adjustment.py +412 -0
- chia/consensus/find_fork_point.py +111 -0
- chia/consensus/full_block_to_block_record.py +167 -0
- chia/consensus/get_block_challenge.py +106 -0
- chia/consensus/get_block_generator.py +27 -0
- chia/consensus/make_sub_epoch_summary.py +210 -0
- chia/consensus/multiprocess_validation.py +268 -0
- chia/consensus/pos_quality.py +19 -0
- chia/consensus/pot_iterations.py +67 -0
- chia/consensus/puzzles/__init__.py +0 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
- chia/consensus/vdf_info_computation.py +156 -0
- chia/daemon/__init__.py +0 -0
- chia/daemon/client.py +252 -0
- chia/daemon/keychain_proxy.py +502 -0
- chia/daemon/keychain_server.py +365 -0
- chia/daemon/server.py +1606 -0
- chia/daemon/windows_signal.py +56 -0
- chia/data_layer/__init__.py +0 -0
- chia/data_layer/data_layer.py +1291 -0
- chia/data_layer/data_layer_api.py +33 -0
- chia/data_layer/data_layer_errors.py +50 -0
- chia/data_layer/data_layer_server.py +170 -0
- chia/data_layer/data_layer_util.py +985 -0
- chia/data_layer/data_layer_wallet.py +1311 -0
- chia/data_layer/data_store.py +2267 -0
- chia/data_layer/dl_wallet_store.py +407 -0
- chia/data_layer/download_data.py +389 -0
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
- chia/data_layer/s3_plugin_config.yml +33 -0
- chia/data_layer/s3_plugin_service.py +468 -0
- chia/data_layer/util/__init__.py +0 -0
- chia/data_layer/util/benchmark.py +107 -0
- chia/data_layer/util/plugin.py +40 -0
- chia/farmer/__init__.py +0 -0
- chia/farmer/farmer.py +923 -0
- chia/farmer/farmer_api.py +820 -0
- chia/full_node/__init__.py +0 -0
- chia/full_node/bitcoin_fee_estimator.py +85 -0
- chia/full_node/block_height_map.py +271 -0
- chia/full_node/block_store.py +576 -0
- chia/full_node/bundle_tools.py +19 -0
- chia/full_node/coin_store.py +647 -0
- chia/full_node/fee_estimate.py +54 -0
- chia/full_node/fee_estimate_store.py +24 -0
- chia/full_node/fee_estimation.py +92 -0
- chia/full_node/fee_estimator.py +90 -0
- chia/full_node/fee_estimator_constants.py +38 -0
- chia/full_node/fee_estimator_interface.py +42 -0
- chia/full_node/fee_history.py +25 -0
- chia/full_node/fee_tracker.py +564 -0
- chia/full_node/full_node.py +3327 -0
- chia/full_node/full_node_api.py +2025 -0
- chia/full_node/full_node_store.py +1033 -0
- chia/full_node/hint_management.py +56 -0
- chia/full_node/hint_store.py +93 -0
- chia/full_node/mempool.py +589 -0
- chia/full_node/mempool_check_conditions.py +146 -0
- chia/full_node/mempool_manager.py +853 -0
- chia/full_node/pending_tx_cache.py +112 -0
- chia/full_node/puzzles/__init__.py +0 -0
- chia/full_node/puzzles/block_program_zero.clsp +14 -0
- chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
- chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
- chia/full_node/signage_point.py +16 -0
- chia/full_node/subscriptions.py +247 -0
- chia/full_node/sync_store.py +146 -0
- chia/full_node/tx_processing_queue.py +78 -0
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +1720 -0
- chia/harvester/__init__.py +0 -0
- chia/harvester/harvester.py +272 -0
- chia/harvester/harvester_api.py +380 -0
- chia/introducer/__init__.py +0 -0
- chia/introducer/introducer.py +122 -0
- chia/introducer/introducer_api.py +70 -0
- chia/legacy/__init__.py +0 -0
- chia/legacy/keyring.py +155 -0
- chia/plot_sync/__init__.py +0 -0
- chia/plot_sync/delta.py +61 -0
- chia/plot_sync/exceptions.py +56 -0
- chia/plot_sync/receiver.py +386 -0
- chia/plot_sync/sender.py +340 -0
- chia/plot_sync/util.py +43 -0
- chia/plotters/__init__.py +0 -0
- chia/plotters/bladebit.py +388 -0
- chia/plotters/chiapos.py +63 -0
- chia/plotters/madmax.py +224 -0
- chia/plotters/plotters.py +577 -0
- chia/plotters/plotters_util.py +133 -0
- chia/plotting/__init__.py +0 -0
- chia/plotting/cache.py +213 -0
- chia/plotting/check_plots.py +283 -0
- chia/plotting/create_plots.py +278 -0
- chia/plotting/manager.py +436 -0
- chia/plotting/util.py +336 -0
- chia/pools/__init__.py +0 -0
- chia/pools/pool_config.py +110 -0
- chia/pools/pool_puzzles.py +459 -0
- chia/pools/pool_wallet.py +933 -0
- chia/pools/pool_wallet_info.py +118 -0
- chia/pools/puzzles/__init__.py +0 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
- chia/protocols/__init__.py +0 -0
- chia/protocols/farmer_protocol.py +102 -0
- chia/protocols/full_node_protocol.py +219 -0
- chia/protocols/harvester_protocol.py +216 -0
- chia/protocols/introducer_protocol.py +25 -0
- chia/protocols/pool_protocol.py +177 -0
- chia/protocols/protocol_message_types.py +139 -0
- chia/protocols/protocol_state_machine.py +87 -0
- chia/protocols/protocol_timing.py +8 -0
- chia/protocols/shared_protocol.py +86 -0
- chia/protocols/timelord_protocol.py +93 -0
- chia/protocols/wallet_protocol.py +401 -0
- chia/py.typed +0 -0
- chia/rpc/__init__.py +0 -0
- chia/rpc/crawler_rpc_api.py +80 -0
- chia/rpc/data_layer_rpc_api.py +644 -0
- chia/rpc/data_layer_rpc_client.py +188 -0
- chia/rpc/data_layer_rpc_util.py +58 -0
- chia/rpc/farmer_rpc_api.py +365 -0
- chia/rpc/farmer_rpc_client.py +86 -0
- chia/rpc/full_node_rpc_api.py +959 -0
- chia/rpc/full_node_rpc_client.py +292 -0
- chia/rpc/harvester_rpc_api.py +141 -0
- chia/rpc/harvester_rpc_client.py +54 -0
- chia/rpc/rpc_client.py +164 -0
- chia/rpc/rpc_server.py +521 -0
- chia/rpc/timelord_rpc_api.py +32 -0
- chia/rpc/util.py +93 -0
- chia/rpc/wallet_request_types.py +904 -0
- chia/rpc/wallet_rpc_api.py +4943 -0
- chia/rpc/wallet_rpc_client.py +1814 -0
- chia/seeder/__init__.py +0 -0
- chia/seeder/crawl_store.py +425 -0
- chia/seeder/crawler.py +410 -0
- chia/seeder/crawler_api.py +135 -0
- chia/seeder/dns_server.py +593 -0
- chia/seeder/peer_record.py +146 -0
- chia/seeder/start_crawler.py +92 -0
- chia/server/__init__.py +0 -0
- chia/server/address_manager.py +658 -0
- chia/server/address_manager_store.py +237 -0
- chia/server/api_protocol.py +116 -0
- chia/server/capabilities.py +24 -0
- chia/server/chia_policy.py +346 -0
- chia/server/introducer_peers.py +76 -0
- chia/server/node_discovery.py +714 -0
- chia/server/outbound_message.py +33 -0
- chia/server/rate_limit_numbers.py +214 -0
- chia/server/rate_limits.py +153 -0
- chia/server/server.py +741 -0
- chia/server/signal_handlers.py +120 -0
- chia/server/ssl_context.py +32 -0
- chia/server/start_data_layer.py +151 -0
- chia/server/start_farmer.py +98 -0
- chia/server/start_full_node.py +112 -0
- chia/server/start_harvester.py +93 -0
- chia/server/start_introducer.py +81 -0
- chia/server/start_service.py +316 -0
- chia/server/start_timelord.py +89 -0
- chia/server/start_wallet.py +113 -0
- chia/server/upnp.py +118 -0
- chia/server/ws_connection.py +766 -0
- chia/simulator/__init__.py +0 -0
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +2054 -0
- chia/simulator/full_node_simulator.py +794 -0
- chia/simulator/keyring.py +128 -0
- chia/simulator/setup_services.py +506 -0
- chia/simulator/simulator_constants.py +13 -0
- chia/simulator/simulator_full_node_rpc_api.py +99 -0
- chia/simulator/simulator_full_node_rpc_client.py +60 -0
- chia/simulator/simulator_protocol.py +29 -0
- chia/simulator/simulator_test_tools.py +164 -0
- chia/simulator/socket.py +24 -0
- chia/simulator/ssl_certs.py +114 -0
- chia/simulator/ssl_certs_1.py +697 -0
- chia/simulator/ssl_certs_10.py +697 -0
- chia/simulator/ssl_certs_2.py +697 -0
- chia/simulator/ssl_certs_3.py +697 -0
- chia/simulator/ssl_certs_4.py +697 -0
- chia/simulator/ssl_certs_5.py +697 -0
- chia/simulator/ssl_certs_6.py +697 -0
- chia/simulator/ssl_certs_7.py +697 -0
- chia/simulator/ssl_certs_8.py +697 -0
- chia/simulator/ssl_certs_9.py +697 -0
- chia/simulator/start_simulator.py +143 -0
- chia/simulator/wallet_tools.py +246 -0
- chia/ssl/__init__.py +0 -0
- chia/ssl/chia_ca.crt +19 -0
- chia/ssl/chia_ca.key +28 -0
- chia/ssl/create_ssl.py +249 -0
- chia/ssl/dst_root_ca.pem +20 -0
- chia/timelord/__init__.py +0 -0
- chia/timelord/iters_from_block.py +50 -0
- chia/timelord/timelord.py +1226 -0
- chia/timelord/timelord_api.py +138 -0
- chia/timelord/timelord_launcher.py +190 -0
- chia/timelord/timelord_state.py +244 -0
- chia/timelord/types.py +22 -0
- chia/types/__init__.py +0 -0
- chia/types/aliases.py +35 -0
- chia/types/block_protocol.py +20 -0
- chia/types/blockchain_format/__init__.py +0 -0
- chia/types/blockchain_format/classgroup.py +5 -0
- chia/types/blockchain_format/coin.py +28 -0
- chia/types/blockchain_format/foliage.py +8 -0
- chia/types/blockchain_format/pool_target.py +5 -0
- chia/types/blockchain_format/program.py +269 -0
- chia/types/blockchain_format/proof_of_space.py +135 -0
- chia/types/blockchain_format/reward_chain_block.py +6 -0
- chia/types/blockchain_format/serialized_program.py +5 -0
- chia/types/blockchain_format/sized_bytes.py +11 -0
- chia/types/blockchain_format/slots.py +9 -0
- chia/types/blockchain_format/sub_epoch_summary.py +5 -0
- chia/types/blockchain_format/tree_hash.py +72 -0
- chia/types/blockchain_format/vdf.py +86 -0
- chia/types/clvm_cost.py +13 -0
- chia/types/coin_record.py +43 -0
- chia/types/coin_spend.py +115 -0
- chia/types/condition_opcodes.py +73 -0
- chia/types/condition_with_args.py +16 -0
- chia/types/eligible_coin_spends.py +365 -0
- chia/types/end_of_slot_bundle.py +5 -0
- chia/types/fee_rate.py +38 -0
- chia/types/full_block.py +5 -0
- chia/types/generator_types.py +13 -0
- chia/types/header_block.py +5 -0
- chia/types/internal_mempool_item.py +18 -0
- chia/types/mempool_inclusion_status.py +9 -0
- chia/types/mempool_item.py +85 -0
- chia/types/mempool_submission_status.py +30 -0
- chia/types/mojos.py +7 -0
- chia/types/peer_info.py +64 -0
- chia/types/signing_mode.py +29 -0
- chia/types/spend_bundle.py +30 -0
- chia/types/spend_bundle_conditions.py +7 -0
- chia/types/transaction_queue_entry.py +55 -0
- chia/types/unfinished_block.py +5 -0
- chia/types/unfinished_header_block.py +37 -0
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +49 -0
- chia/util/__init__.py +0 -0
- chia/util/action_scope.py +168 -0
- chia/util/async_pool.py +226 -0
- chia/util/augmented_chain.py +134 -0
- chia/util/batches.py +42 -0
- chia/util/bech32m.py +126 -0
- chia/util/beta_metrics.py +119 -0
- chia/util/block_cache.py +56 -0
- chia/util/byte_types.py +12 -0
- chia/util/check_fork_next_block.py +33 -0
- chia/util/chia_logging.py +144 -0
- chia/util/chia_version.py +33 -0
- chia/util/collection.py +17 -0
- chia/util/condition_tools.py +201 -0
- chia/util/config.py +367 -0
- chia/util/cpu.py +22 -0
- chia/util/db_synchronous.py +23 -0
- chia/util/db_version.py +32 -0
- chia/util/db_wrapper.py +430 -0
- chia/util/default_root.py +27 -0
- chia/util/dump_keyring.py +93 -0
- chia/util/english.txt +2048 -0
- chia/util/errors.py +353 -0
- chia/util/file_keyring.py +469 -0
- chia/util/files.py +97 -0
- chia/util/full_block_utils.py +345 -0
- chia/util/generator_tools.py +72 -0
- chia/util/hash.py +31 -0
- chia/util/initial-config.yaml +694 -0
- chia/util/inline_executor.py +26 -0
- chia/util/ints.py +19 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +37 -0
- chia/util/keychain.py +676 -0
- chia/util/keyring_wrapper.py +327 -0
- chia/util/limited_semaphore.py +41 -0
- chia/util/lock.py +49 -0
- chia/util/log_exceptions.py +32 -0
- chia/util/logging.py +36 -0
- chia/util/lru_cache.py +31 -0
- chia/util/math.py +20 -0
- chia/util/network.py +182 -0
- chia/util/paginator.py +48 -0
- chia/util/path.py +31 -0
- chia/util/permissions.py +20 -0
- chia/util/prev_transaction_block.py +21 -0
- chia/util/priority_mutex.py +95 -0
- chia/util/profiler.py +197 -0
- chia/util/recursive_replace.py +24 -0
- chia/util/safe_cancel_task.py +16 -0
- chia/util/service_groups.py +47 -0
- chia/util/setproctitle.py +22 -0
- chia/util/significant_bits.py +32 -0
- chia/util/ssl_check.py +213 -0
- chia/util/streamable.py +642 -0
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +382 -0
- chia/util/timing.py +67 -0
- chia/util/vdf_prover.py +30 -0
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +66 -0
- chia/wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/cat_constants.py +75 -0
- chia/wallet/cat_wallet/cat_info.py +47 -0
- chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
- chia/wallet/cat_wallet/cat_utils.py +164 -0
- chia/wallet/cat_wallet/cat_wallet.py +855 -0
- chia/wallet/cat_wallet/dao_cat_info.py +28 -0
- chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
- chia/wallet/cat_wallet/lineage_store.py +74 -0
- chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
- chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
- chia/wallet/coin_selection.py +188 -0
- chia/wallet/conditions.py +1512 -0
- chia/wallet/dao_wallet/__init__.py +0 -0
- chia/wallet/dao_wallet/dao_info.py +61 -0
- chia/wallet/dao_wallet/dao_utils.py +811 -0
- chia/wallet/dao_wallet/dao_wallet.py +2119 -0
- chia/wallet/db_wallet/__init__.py +0 -0
- chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
- chia/wallet/derivation_record.py +30 -0
- chia/wallet/derive_keys.py +146 -0
- chia/wallet/did_wallet/__init__.py +0 -0
- chia/wallet/did_wallet/did_info.py +39 -0
- chia/wallet/did_wallet/did_wallet.py +1494 -0
- chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
- chia/wallet/did_wallet/puzzles/__init__.py +0 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
- chia/wallet/driver_protocol.py +26 -0
- chia/wallet/key_val_store.py +55 -0
- chia/wallet/lineage_proof.py +58 -0
- chia/wallet/nft_wallet/__init__.py +0 -0
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
- chia/wallet/nft_wallet/nft_info.py +120 -0
- chia/wallet/nft_wallet/nft_puzzles.py +305 -0
- chia/wallet/nft_wallet/nft_wallet.py +1687 -0
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
- chia/wallet/nft_wallet/uncurry_nft.py +217 -0
- chia/wallet/notification_manager.py +117 -0
- chia/wallet/notification_store.py +178 -0
- chia/wallet/outer_puzzles.py +84 -0
- chia/wallet/payment.py +33 -0
- chia/wallet/puzzle_drivers.py +118 -0
- chia/wallet/puzzles/__init__.py +0 -0
- chia/wallet/puzzles/augmented_condition.clsp +13 -0
- chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
- chia/wallet/puzzles/clawback/__init__.py +0 -0
- chia/wallet/puzzles/clawback/drivers.py +188 -0
- chia/wallet/puzzles/clawback/metadata.py +38 -0
- chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
- chia/wallet/puzzles/condition_codes.clib +77 -0
- chia/wallet/puzzles/curry-and-treehash.clib +102 -0
- chia/wallet/puzzles/curry.clib +135 -0
- chia/wallet/puzzles/curry_by_index.clib +16 -0
- chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
- chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp +35 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_lockup.clsp +288 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal.clsp +377 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_treasury.clsp +115 -0
- chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
- chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
- chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
- chia/wallet/puzzles/json.clib +25 -0
- chia/wallet/puzzles/load_clvm.py +161 -0
- chia/wallet/puzzles/merkle_utils.clib +18 -0
- chia/wallet/puzzles/notification.clsp +7 -0
- chia/wallet/puzzles/notification.clsp.hex +1 -0
- chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
- chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.clsp +3 -0
- chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.py +26 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
- chia/wallet/puzzles/p2_parent.clsp +19 -0
- chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
- chia/wallet/puzzles/p2_singleton.clsp +30 -0
- chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/puzzle_utils.py +34 -0
- chia/wallet/puzzles/settlement_payments.clsp +49 -0
- chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
- chia/wallet/puzzles/sha256tree.clib +11 -0
- chia/wallet/puzzles/singleton_launcher.clsp +16 -0
- chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
- chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.py +296 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
- chia/wallet/puzzles/singleton_truths.clib +21 -0
- chia/wallet/puzzles/tails.py +348 -0
- chia/wallet/puzzles/utility_macros.clib +48 -0
- chia/wallet/signer_protocol.py +125 -0
- chia/wallet/singleton.py +106 -0
- chia/wallet/singleton_record.py +30 -0
- chia/wallet/trade_manager.py +1102 -0
- chia/wallet/trade_record.py +67 -0
- chia/wallet/trading/__init__.py +0 -0
- chia/wallet/trading/offer.py +702 -0
- chia/wallet/trading/trade_status.py +13 -0
- chia/wallet/trading/trade_store.py +526 -0
- chia/wallet/transaction_record.py +158 -0
- chia/wallet/transaction_sorting.py +14 -0
- chia/wallet/uncurried_puzzle.py +17 -0
- chia/wallet/util/__init__.py +0 -0
- chia/wallet/util/address_type.py +55 -0
- chia/wallet/util/blind_signer_tl.py +164 -0
- chia/wallet/util/clvm_streamable.py +203 -0
- chia/wallet/util/compute_hints.py +66 -0
- chia/wallet/util/compute_memos.py +43 -0
- chia/wallet/util/curry_and_treehash.py +91 -0
- chia/wallet/util/debug_spend_bundle.py +232 -0
- chia/wallet/util/merkle_tree.py +100 -0
- chia/wallet/util/merkle_utils.py +102 -0
- chia/wallet/util/new_peak_queue.py +82 -0
- chia/wallet/util/notifications.py +12 -0
- chia/wallet/util/peer_request_cache.py +174 -0
- chia/wallet/util/pprint.py +39 -0
- chia/wallet/util/puzzle_compression.py +95 -0
- chia/wallet/util/puzzle_decorator.py +100 -0
- chia/wallet/util/puzzle_decorator_type.py +7 -0
- chia/wallet/util/query_filter.py +59 -0
- chia/wallet/util/transaction_type.py +23 -0
- chia/wallet/util/tx_config.py +158 -0
- chia/wallet/util/wallet_sync_utils.py +351 -0
- chia/wallet/util/wallet_types.py +72 -0
- chia/wallet/vc_wallet/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
- chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
- chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
- chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_drivers.py +838 -0
- chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_store.py +263 -0
- chia/wallet/vc_wallet/vc_wallet.py +638 -0
- chia/wallet/wallet.py +698 -0
- chia/wallet/wallet_action_scope.py +96 -0
- chia/wallet/wallet_blockchain.py +244 -0
- chia/wallet/wallet_coin_record.py +72 -0
- chia/wallet/wallet_coin_store.py +351 -0
- chia/wallet/wallet_info.py +35 -0
- chia/wallet/wallet_interested_store.py +188 -0
- chia/wallet/wallet_nft_store.py +279 -0
- chia/wallet/wallet_node.py +1765 -0
- chia/wallet/wallet_node_api.py +207 -0
- chia/wallet/wallet_pool_store.py +119 -0
- chia/wallet/wallet_protocol.py +90 -0
- chia/wallet/wallet_puzzle_store.py +396 -0
- chia/wallet/wallet_retry_store.py +70 -0
- chia/wallet/wallet_singleton_store.py +259 -0
- chia/wallet/wallet_spend_bundle.py +25 -0
- chia/wallet/wallet_state_manager.py +2819 -0
- chia/wallet/wallet_transaction_store.py +496 -0
- chia/wallet/wallet_user_store.py +110 -0
- chia/wallet/wallet_weight_proof_handler.py +126 -0
- chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
- chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
- chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
- chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
- chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
- mozilla-ca/cacert.pem +3611 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
5
|
+
import functools
|
|
6
|
+
from collections.abc import AsyncIterator
|
|
7
|
+
from dataclasses import dataclass, field, replace
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from shutil import copy
|
|
10
|
+
from typing import Any, Callable, Optional
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
from chia_rs import G1Element
|
|
14
|
+
|
|
15
|
+
from chia._tests.plot_sync.util import start_harvester_service
|
|
16
|
+
from chia._tests.plotting.test_plot_manager import Directory, MockPlotInfo
|
|
17
|
+
from chia._tests.plotting.util import get_test_plots
|
|
18
|
+
from chia._tests.util.split_managers import SplitAsyncManager, split_async_manager
|
|
19
|
+
from chia._tests.util.time_out_assert import time_out_assert
|
|
20
|
+
from chia.farmer.farmer import Farmer
|
|
21
|
+
from chia.harvester.harvester import Harvester
|
|
22
|
+
from chia.plot_sync.delta import Delta, PathListDelta, PlotListDelta
|
|
23
|
+
from chia.plot_sync.receiver import Receiver
|
|
24
|
+
from chia.plot_sync.sender import Sender
|
|
25
|
+
from chia.plot_sync.util import Constants, State
|
|
26
|
+
from chia.plotting.manager import PlotManager
|
|
27
|
+
from chia.plotting.util import add_plot_directory, remove_plot_directory
|
|
28
|
+
from chia.protocols.harvester_protocol import Plot
|
|
29
|
+
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
30
|
+
from chia.simulator.block_tools import BlockTools
|
|
31
|
+
from chia.types.aliases import FarmerService, HarvesterService
|
|
32
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
33
|
+
from chia.util.config import create_default_chia_config, lock_and_load_config, save_config
|
|
34
|
+
from chia.util.ints import uint8, uint32, uint64
|
|
35
|
+
from chia.util.streamable import _T_Streamable
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def synced(sender: Sender, receiver: Receiver, previous_last_sync_id: int) -> bool:
|
|
39
|
+
return (
|
|
40
|
+
sender._last_sync_id != previous_last_sync_id
|
|
41
|
+
and sender._last_sync_id == receiver._last_sync.sync_id != 0
|
|
42
|
+
and receiver.current_sync().state == State.idle
|
|
43
|
+
and not sender.sync_active()
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def assert_path_list_matches(expected_list: list[str], actual_list: list[str]) -> None:
|
|
48
|
+
assert len(expected_list) == len(actual_list)
|
|
49
|
+
for item in expected_list:
|
|
50
|
+
assert str(item) in actual_list
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class ExpectedResult:
|
|
55
|
+
valid_count: int = 0
|
|
56
|
+
valid_delta: PlotListDelta = field(default_factory=PlotListDelta)
|
|
57
|
+
invalid_count: int = 0
|
|
58
|
+
invalid_delta: PathListDelta = field(default_factory=PathListDelta)
|
|
59
|
+
keys_missing_count: int = 0
|
|
60
|
+
keys_missing_delta: PathListDelta = field(default_factory=PathListDelta)
|
|
61
|
+
duplicates_count: int = 0
|
|
62
|
+
duplicates_delta: PathListDelta = field(default_factory=PathListDelta)
|
|
63
|
+
callback_passed: bool = False
|
|
64
|
+
|
|
65
|
+
def add_valid(self, list_plots: list[MockPlotInfo]) -> None:
|
|
66
|
+
def create_mock_plot(info: MockPlotInfo) -> Plot:
|
|
67
|
+
return Plot(
|
|
68
|
+
info.prover.get_filename(),
|
|
69
|
+
uint8(0),
|
|
70
|
+
bytes32.zeros,
|
|
71
|
+
None,
|
|
72
|
+
None,
|
|
73
|
+
G1Element(),
|
|
74
|
+
uint64(0),
|
|
75
|
+
uint64(0),
|
|
76
|
+
uint8(0),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
self.valid_count += len(list_plots)
|
|
80
|
+
self.valid_delta.additions.update({x.prover.get_filename(): create_mock_plot(x) for x in list_plots})
|
|
81
|
+
|
|
82
|
+
def remove_valid(self, list_paths: list[Path]) -> None:
|
|
83
|
+
self.valid_count -= len(list_paths)
|
|
84
|
+
self.valid_delta.removals += [str(x) for x in list_paths]
|
|
85
|
+
|
|
86
|
+
def add_invalid(self, list_paths: list[Path]) -> None:
|
|
87
|
+
self.invalid_count += len(list_paths)
|
|
88
|
+
self.invalid_delta.additions += [str(x) for x in list_paths]
|
|
89
|
+
|
|
90
|
+
def remove_invalid(self, list_paths: list[Path]) -> None:
|
|
91
|
+
self.invalid_count -= len(list_paths)
|
|
92
|
+
self.invalid_delta.removals += [str(x) for x in list_paths]
|
|
93
|
+
|
|
94
|
+
def add_keys_missing(self, list_paths: list[Path]) -> None:
|
|
95
|
+
self.keys_missing_count += len(list_paths)
|
|
96
|
+
self.keys_missing_delta.additions += [str(x) for x in list_paths]
|
|
97
|
+
|
|
98
|
+
def remove_keys_missing(self, list_paths: list[Path]) -> None:
|
|
99
|
+
self.keys_missing_count -= len(list_paths)
|
|
100
|
+
self.keys_missing_delta.removals += [str(x) for x in list_paths]
|
|
101
|
+
|
|
102
|
+
def add_duplicates(self, list_paths: list[Path]) -> None:
|
|
103
|
+
self.duplicates_count += len(list_paths)
|
|
104
|
+
self.duplicates_delta.additions += [str(x) for x in list_paths]
|
|
105
|
+
|
|
106
|
+
def remove_duplicates(self, list_paths: list[Path]) -> None:
|
|
107
|
+
self.duplicates_count -= len(list_paths)
|
|
108
|
+
self.duplicates_delta.removals += [str(x) for x in list_paths]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@dataclass
|
|
112
|
+
class Environment:
|
|
113
|
+
root_path: Path
|
|
114
|
+
harvester_services: list[HarvesterService]
|
|
115
|
+
farmer_service: FarmerService
|
|
116
|
+
harvesters: list[Harvester]
|
|
117
|
+
farmer: Farmer
|
|
118
|
+
dir_1: Directory
|
|
119
|
+
dir_2: Directory
|
|
120
|
+
dir_3: Directory
|
|
121
|
+
dir_4: Directory
|
|
122
|
+
dir_invalid: Directory
|
|
123
|
+
dir_keys_missing: Directory
|
|
124
|
+
dir_duplicates: Directory
|
|
125
|
+
expected: list[ExpectedResult]
|
|
126
|
+
split_farmer_service_manager: SplitAsyncManager[FarmerService]
|
|
127
|
+
split_harvester_managers: list[SplitAsyncManager[Harvester]]
|
|
128
|
+
|
|
129
|
+
def get_harvester(self, peer_id: bytes32) -> Optional[Harvester]:
|
|
130
|
+
for harvester in self.harvesters:
|
|
131
|
+
assert harvester.server is not None
|
|
132
|
+
if harvester.server.node_id == peer_id:
|
|
133
|
+
return harvester
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
def add_directory(self, harvester_index: int, directory: Directory, state: State = State.loaded) -> None:
|
|
137
|
+
try:
|
|
138
|
+
add_plot_directory(self.harvesters[harvester_index].root_path, str(directory.path))
|
|
139
|
+
except ValueError:
|
|
140
|
+
pass
|
|
141
|
+
if state == State.loaded:
|
|
142
|
+
self.expected[harvester_index].add_valid(directory.plot_info_list())
|
|
143
|
+
elif state == State.invalid:
|
|
144
|
+
self.expected[harvester_index].add_invalid(directory.path_list())
|
|
145
|
+
elif state == State.keys_missing:
|
|
146
|
+
self.expected[harvester_index].add_keys_missing(directory.path_list())
|
|
147
|
+
elif state == State.duplicates:
|
|
148
|
+
self.expected[harvester_index].add_duplicates(directory.path_list())
|
|
149
|
+
else:
|
|
150
|
+
assert False, "Invalid state"
|
|
151
|
+
|
|
152
|
+
def remove_directory(self, harvester_index: int, directory: Directory, state: State = State.removed) -> None:
|
|
153
|
+
remove_plot_directory(self.harvesters[harvester_index].root_path, str(directory.path))
|
|
154
|
+
if state == State.removed:
|
|
155
|
+
self.expected[harvester_index].remove_valid(directory.path_list())
|
|
156
|
+
elif state == State.invalid:
|
|
157
|
+
self.expected[harvester_index].remove_invalid(directory.path_list())
|
|
158
|
+
elif state == State.keys_missing:
|
|
159
|
+
self.expected[harvester_index].remove_keys_missing(directory.path_list())
|
|
160
|
+
elif state == State.duplicates:
|
|
161
|
+
self.expected[harvester_index].remove_duplicates(directory.path_list())
|
|
162
|
+
else:
|
|
163
|
+
assert False, "Invalid state"
|
|
164
|
+
|
|
165
|
+
def add_all_directories(self, harvester_index: int) -> None:
|
|
166
|
+
self.add_directory(harvester_index, self.dir_1)
|
|
167
|
+
self.add_directory(harvester_index, self.dir_2)
|
|
168
|
+
self.add_directory(harvester_index, self.dir_3)
|
|
169
|
+
self.add_directory(harvester_index, self.dir_4)
|
|
170
|
+
self.add_directory(harvester_index, self.dir_keys_missing, State.keys_missing)
|
|
171
|
+
self.add_directory(harvester_index, self.dir_invalid, State.invalid)
|
|
172
|
+
# Note: This does not add dir_duplicates since its important that the duplicated plots are loaded after the
|
|
173
|
+
# the original ones.
|
|
174
|
+
# self.add_directory(harvester_index, self.dir_duplicates, State.duplicates)
|
|
175
|
+
|
|
176
|
+
def remove_all_directories(self, harvester_index: int) -> None:
|
|
177
|
+
self.remove_directory(harvester_index, self.dir_1)
|
|
178
|
+
self.remove_directory(harvester_index, self.dir_2)
|
|
179
|
+
self.remove_directory(harvester_index, self.dir_3)
|
|
180
|
+
self.remove_directory(harvester_index, self.dir_4)
|
|
181
|
+
self.remove_directory(harvester_index, self.dir_keys_missing, State.keys_missing)
|
|
182
|
+
self.remove_directory(harvester_index, self.dir_invalid, State.invalid)
|
|
183
|
+
self.remove_directory(harvester_index, self.dir_duplicates, State.duplicates)
|
|
184
|
+
|
|
185
|
+
async def plot_sync_callback(self, peer_id: bytes32, delta: Optional[Delta]) -> None:
|
|
186
|
+
if delta is None:
|
|
187
|
+
return
|
|
188
|
+
harvester: Optional[Harvester] = self.get_harvester(peer_id)
|
|
189
|
+
assert harvester is not None
|
|
190
|
+
expected = self.expected[self.harvesters.index(harvester)]
|
|
191
|
+
assert len(expected.valid_delta.additions) == len(delta.valid.additions)
|
|
192
|
+
for path, plot_info in expected.valid_delta.additions.items():
|
|
193
|
+
assert path in delta.valid.additions
|
|
194
|
+
plot = harvester.plot_manager.plots.get(Path(path), None)
|
|
195
|
+
assert plot is not None
|
|
196
|
+
assert plot.prover.get_filename() == delta.valid.additions[path].filename
|
|
197
|
+
assert plot.prover.get_size() == delta.valid.additions[path].size
|
|
198
|
+
assert plot.prover.get_id() == delta.valid.additions[path].plot_id
|
|
199
|
+
assert plot.prover.get_compression_level() == delta.valid.additions[path].compression_level
|
|
200
|
+
assert plot.pool_public_key == delta.valid.additions[path].pool_public_key
|
|
201
|
+
assert plot.pool_contract_puzzle_hash == delta.valid.additions[path].pool_contract_puzzle_hash
|
|
202
|
+
assert plot.plot_public_key == delta.valid.additions[path].plot_public_key
|
|
203
|
+
assert plot.file_size == delta.valid.additions[path].file_size
|
|
204
|
+
assert int(plot.time_modified) == delta.valid.additions[path].time_modified
|
|
205
|
+
|
|
206
|
+
assert_path_list_matches(expected.valid_delta.removals, delta.valid.removals)
|
|
207
|
+
assert_path_list_matches(expected.invalid_delta.additions, delta.invalid.additions)
|
|
208
|
+
assert_path_list_matches(expected.invalid_delta.removals, delta.invalid.removals)
|
|
209
|
+
assert_path_list_matches(expected.keys_missing_delta.additions, delta.keys_missing.additions)
|
|
210
|
+
assert_path_list_matches(expected.keys_missing_delta.removals, delta.keys_missing.removals)
|
|
211
|
+
assert_path_list_matches(expected.duplicates_delta.additions, delta.duplicates.additions)
|
|
212
|
+
assert_path_list_matches(expected.duplicates_delta.removals, delta.duplicates.removals)
|
|
213
|
+
expected.valid_delta.clear()
|
|
214
|
+
expected.invalid_delta.clear()
|
|
215
|
+
expected.keys_missing_delta.clear()
|
|
216
|
+
expected.duplicates_delta.clear()
|
|
217
|
+
expected.callback_passed = True
|
|
218
|
+
|
|
219
|
+
async def run_sync_test(self) -> None:
|
|
220
|
+
plot_manager: PlotManager
|
|
221
|
+
assert len(self.harvesters) == len(self.expected)
|
|
222
|
+
last_sync_ids: list[uint64] = []
|
|
223
|
+
# Run the test in two steps, first trigger the refresh on both harvesters
|
|
224
|
+
for harvester in self.harvesters:
|
|
225
|
+
plot_manager = harvester.plot_manager
|
|
226
|
+
assert harvester.server is not None
|
|
227
|
+
receiver = self.farmer.plot_sync_receivers[harvester.server.node_id]
|
|
228
|
+
# Make sure to reset the passed flag always before a new run
|
|
229
|
+
self.expected[self.harvesters.index(harvester)].callback_passed = False
|
|
230
|
+
receiver._update_callback = self.plot_sync_callback
|
|
231
|
+
assert harvester.plot_sync_sender._last_sync_id == receiver._last_sync.sync_id
|
|
232
|
+
last_sync_ids.append(harvester.plot_sync_sender._last_sync_id)
|
|
233
|
+
plot_manager.start_refreshing()
|
|
234
|
+
plot_manager.trigger_refresh()
|
|
235
|
+
# Then wait for them to be synced with the farmer and validate them
|
|
236
|
+
for harvester in self.harvesters:
|
|
237
|
+
plot_manager = harvester.plot_manager
|
|
238
|
+
assert harvester.server is not None
|
|
239
|
+
receiver = self.farmer.plot_sync_receivers[harvester.server.node_id]
|
|
240
|
+
await time_out_assert(20, plot_manager.needs_refresh, value=False)
|
|
241
|
+
harvester_index = self.harvesters.index(harvester)
|
|
242
|
+
await time_out_assert(
|
|
243
|
+
10, synced, True, harvester.plot_sync_sender, receiver, last_sync_ids[harvester_index]
|
|
244
|
+
)
|
|
245
|
+
expected = self.expected[harvester_index]
|
|
246
|
+
assert plot_manager.plot_count() == len(receiver.plots()) == expected.valid_count
|
|
247
|
+
assert len(plot_manager.failed_to_open_filenames) == len(receiver.invalid()) == expected.invalid_count
|
|
248
|
+
assert len(plot_manager.no_key_filenames) == len(receiver.keys_missing()) == expected.keys_missing_count
|
|
249
|
+
assert len(plot_manager.get_duplicates()) == len(receiver.duplicates()) == expected.duplicates_count
|
|
250
|
+
assert expected.callback_passed
|
|
251
|
+
assert expected.valid_delta.empty()
|
|
252
|
+
assert expected.invalid_delta.empty()
|
|
253
|
+
assert expected.keys_missing_delta.empty()
|
|
254
|
+
assert expected.duplicates_delta.empty()
|
|
255
|
+
for path, plot_info in plot_manager.plots.items():
|
|
256
|
+
assert str(path) in receiver.plots()
|
|
257
|
+
assert plot_info.prover.get_filename() == receiver.plots()[str(path)].filename
|
|
258
|
+
assert plot_info.prover.get_size() == receiver.plots()[str(path)].size
|
|
259
|
+
assert plot_info.prover.get_id() == receiver.plots()[str(path)].plot_id
|
|
260
|
+
assert plot_info.prover.get_compression_level() == receiver.plots()[str(path)].compression_level
|
|
261
|
+
assert plot_info.pool_public_key == receiver.plots()[str(path)].pool_public_key
|
|
262
|
+
assert plot_info.pool_contract_puzzle_hash == receiver.plots()[str(path)].pool_contract_puzzle_hash
|
|
263
|
+
assert plot_info.plot_public_key == receiver.plots()[str(path)].plot_public_key
|
|
264
|
+
assert plot_info.file_size == receiver.plots()[str(path)].file_size
|
|
265
|
+
assert int(plot_info.time_modified) == receiver.plots()[str(path)].time_modified
|
|
266
|
+
for path in plot_manager.failed_to_open_filenames:
|
|
267
|
+
assert str(path) in receiver.invalid()
|
|
268
|
+
for path in plot_manager.no_key_filenames:
|
|
269
|
+
assert str(path) in receiver.keys_missing()
|
|
270
|
+
for path in plot_manager.get_duplicates():
|
|
271
|
+
assert str(path) in receiver.duplicates()
|
|
272
|
+
|
|
273
|
+
async def handshake_done(self, index: int) -> bool:
|
|
274
|
+
return (
|
|
275
|
+
self.harvesters[index].plot_manager._refresh_thread is not None
|
|
276
|
+
and len(self.harvesters[index].plot_manager.farmer_public_keys) > 0
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
@pytest.fixture(scope="function")
|
|
281
|
+
async def environment(
|
|
282
|
+
tmp_path: Path,
|
|
283
|
+
farmer_two_harvester_not_started: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
284
|
+
) -> AsyncIterator[Environment]:
|
|
285
|
+
def new_test_dir(name: str, plot_list: list[Path]) -> Directory:
|
|
286
|
+
return Directory(tmp_path / "plots" / name, plot_list)
|
|
287
|
+
|
|
288
|
+
plots: list[Path] = get_test_plots()
|
|
289
|
+
plots_invalid: list[Path] = get_test_plots()[0:3]
|
|
290
|
+
plots_keys_missing: list[Path] = get_test_plots("not_in_keychain")
|
|
291
|
+
# Create 4 directories where: dir_n contains n plots
|
|
292
|
+
directories: list[Directory] = []
|
|
293
|
+
offset: int = 0
|
|
294
|
+
while len(directories) < 4:
|
|
295
|
+
dir_number = len(directories) + 1
|
|
296
|
+
directories.append(new_test_dir(f"{dir_number}", plots[offset : offset + dir_number]))
|
|
297
|
+
offset += dir_number
|
|
298
|
+
|
|
299
|
+
dir_invalid: Directory = new_test_dir("invalid", plots_invalid)
|
|
300
|
+
dir_keys_missing: Directory = new_test_dir("keys_missing", plots_keys_missing)
|
|
301
|
+
dir_duplicates: Directory = new_test_dir("duplicates", directories[3].plots)
|
|
302
|
+
create_default_chia_config(tmp_path)
|
|
303
|
+
|
|
304
|
+
# Invalidate the plots in `dir_invalid`
|
|
305
|
+
for path in dir_invalid.path_list():
|
|
306
|
+
with open(path, "wb") as file:
|
|
307
|
+
file.write(bytes(100))
|
|
308
|
+
|
|
309
|
+
harvester_services, farmer_service, bt = farmer_two_harvester_not_started
|
|
310
|
+
farmer_service.reconnect_retry_seconds = 1
|
|
311
|
+
farmer: Farmer = farmer_service._node
|
|
312
|
+
async with split_async_manager(manager=farmer_service.manage(), object=farmer_service) as split_farmer_manager:
|
|
313
|
+
await split_farmer_manager.enter()
|
|
314
|
+
async with contextlib.AsyncExitStack() as async_exit_stack:
|
|
315
|
+
split_harvester_managers = [
|
|
316
|
+
await async_exit_stack.enter_async_context(start_harvester_service(service, farmer_service))
|
|
317
|
+
for service in harvester_services
|
|
318
|
+
]
|
|
319
|
+
harvesters = [manager.object for manager in split_harvester_managers]
|
|
320
|
+
for harvester in harvesters:
|
|
321
|
+
# Remove default plot directory for this tests
|
|
322
|
+
with lock_and_load_config(harvester.root_path, "config.yaml") as config:
|
|
323
|
+
config["harvester"]["plot_directories"] = []
|
|
324
|
+
save_config(harvester.root_path, "config.yaml", config)
|
|
325
|
+
harvester.plot_manager.set_public_keys(
|
|
326
|
+
bt.plot_manager.farmer_public_keys.copy(), bt.plot_manager.pool_public_keys.copy()
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
assert len(farmer.plot_sync_receivers) == 2
|
|
330
|
+
|
|
331
|
+
yield Environment(
|
|
332
|
+
tmp_path,
|
|
333
|
+
harvester_services,
|
|
334
|
+
farmer_service,
|
|
335
|
+
harvesters,
|
|
336
|
+
farmer,
|
|
337
|
+
directories[0],
|
|
338
|
+
directories[1],
|
|
339
|
+
directories[2],
|
|
340
|
+
directories[3],
|
|
341
|
+
dir_invalid,
|
|
342
|
+
dir_keys_missing,
|
|
343
|
+
dir_duplicates,
|
|
344
|
+
[ExpectedResult() for _ in harvesters],
|
|
345
|
+
split_farmer_service_manager=split_farmer_manager,
|
|
346
|
+
split_harvester_managers=split_harvester_managers,
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
@pytest.mark.anyio
|
|
351
|
+
async def test_sync_valid(environment: Environment) -> None:
|
|
352
|
+
env: Environment = environment
|
|
353
|
+
env.add_directory(0, env.dir_1)
|
|
354
|
+
env.add_directory(1, env.dir_2)
|
|
355
|
+
await env.run_sync_test()
|
|
356
|
+
# Run again two times to make sure we still get the same results in repeated refresh intervals
|
|
357
|
+
env.expected[0].valid_delta.clear()
|
|
358
|
+
env.expected[1].valid_delta.clear()
|
|
359
|
+
await env.run_sync_test()
|
|
360
|
+
await env.run_sync_test()
|
|
361
|
+
env.add_directory(0, env.dir_3)
|
|
362
|
+
env.add_directory(1, env.dir_4)
|
|
363
|
+
await env.run_sync_test()
|
|
364
|
+
while len(env.dir_3.path_list()):
|
|
365
|
+
drop_plot = env.dir_3.path_list()[0]
|
|
366
|
+
drop_plot.unlink()
|
|
367
|
+
env.dir_3.drop(drop_plot)
|
|
368
|
+
env.expected[0].remove_valid([drop_plot])
|
|
369
|
+
await env.run_sync_test()
|
|
370
|
+
env.remove_directory(0, env.dir_3)
|
|
371
|
+
await env.run_sync_test()
|
|
372
|
+
env.remove_directory(1, env.dir_4)
|
|
373
|
+
await env.run_sync_test()
|
|
374
|
+
env.remove_directory(0, env.dir_1)
|
|
375
|
+
env.remove_directory(1, env.dir_2)
|
|
376
|
+
await env.run_sync_test()
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
@pytest.mark.anyio
|
|
380
|
+
async def test_sync_invalid(environment: Environment) -> None:
|
|
381
|
+
env: Environment = environment
|
|
382
|
+
assert len(env.farmer.plot_sync_receivers) == 2
|
|
383
|
+
# Use dir_3 and dir_4 in this test because the invalid plots are copies from dir_1 + dir_2
|
|
384
|
+
env.add_directory(0, env.dir_3)
|
|
385
|
+
env.add_directory(0, env.dir_invalid, State.invalid)
|
|
386
|
+
env.add_directory(1, env.dir_4)
|
|
387
|
+
await env.run_sync_test()
|
|
388
|
+
# Run again two times to make sure we still get the same results in repeated refresh intervals
|
|
389
|
+
await env.run_sync_test()
|
|
390
|
+
await env.run_sync_test()
|
|
391
|
+
# Drop all but two of the invalid plots
|
|
392
|
+
assert len(env.dir_invalid) > 2
|
|
393
|
+
for _ in range(len(env.dir_invalid) - 2):
|
|
394
|
+
drop_plot = env.dir_invalid.path_list()[0]
|
|
395
|
+
drop_plot.unlink()
|
|
396
|
+
env.dir_invalid.drop(drop_plot)
|
|
397
|
+
env.expected[0].remove_invalid([drop_plot])
|
|
398
|
+
await env.run_sync_test()
|
|
399
|
+
assert len(env.dir_invalid) == 2
|
|
400
|
+
# Add the directory to the first harvester too
|
|
401
|
+
env.add_directory(1, env.dir_invalid, State.invalid)
|
|
402
|
+
await env.run_sync_test()
|
|
403
|
+
# Recover one the remaining invalid plot
|
|
404
|
+
for path in get_test_plots():
|
|
405
|
+
if path.name == env.dir_invalid.path_list()[0].name:
|
|
406
|
+
copy(path, env.dir_invalid.path)
|
|
407
|
+
for i in range(len(env.harvesters)):
|
|
408
|
+
env.expected[i].add_valid([env.dir_invalid.plot_info_list()[0]])
|
|
409
|
+
env.expected[i].remove_invalid([env.dir_invalid.path_list()[0]])
|
|
410
|
+
env.harvesters[i].plot_manager.refresh_parameter = replace(
|
|
411
|
+
env.harvesters[i].plot_manager.refresh_parameter, retry_invalid_seconds=uint32(0)
|
|
412
|
+
)
|
|
413
|
+
await env.run_sync_test()
|
|
414
|
+
for i in [0, 1]:
|
|
415
|
+
remove_plot_directory(env.harvesters[i].root_path, str(env.dir_invalid.path))
|
|
416
|
+
env.expected[i].remove_valid([env.dir_invalid.path_list()[0]])
|
|
417
|
+
env.expected[i].remove_invalid([env.dir_invalid.path_list()[1]])
|
|
418
|
+
await env.run_sync_test()
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
@pytest.mark.anyio
|
|
422
|
+
async def test_sync_keys_missing(environment: Environment) -> None:
|
|
423
|
+
env: Environment = environment
|
|
424
|
+
env.add_directory(0, env.dir_1)
|
|
425
|
+
env.add_directory(0, env.dir_keys_missing, State.keys_missing)
|
|
426
|
+
env.add_directory(1, env.dir_2)
|
|
427
|
+
await env.run_sync_test()
|
|
428
|
+
# Run again two times to make sure we still get the same results in repeated refresh intervals
|
|
429
|
+
await env.run_sync_test()
|
|
430
|
+
await env.run_sync_test()
|
|
431
|
+
# Drop all but 2 plots with missing keys and test sync inbetween
|
|
432
|
+
assert len(env.dir_keys_missing) > 2
|
|
433
|
+
for _ in range(len(env.dir_keys_missing) - 2):
|
|
434
|
+
drop_plot = env.dir_keys_missing.path_list()[0]
|
|
435
|
+
drop_plot.unlink()
|
|
436
|
+
env.dir_keys_missing.drop(drop_plot)
|
|
437
|
+
env.expected[0].remove_keys_missing([drop_plot])
|
|
438
|
+
await env.run_sync_test()
|
|
439
|
+
assert len(env.dir_keys_missing) == 2
|
|
440
|
+
# Add the plots with missing keys to the other harvester
|
|
441
|
+
env.add_directory(0, env.dir_3)
|
|
442
|
+
env.add_directory(1, env.dir_keys_missing, State.keys_missing)
|
|
443
|
+
await env.run_sync_test()
|
|
444
|
+
# Add the missing keys to the first harvester's plot manager
|
|
445
|
+
env.harvesters[0].plot_manager.farmer_public_keys.append(G1Element())
|
|
446
|
+
env.harvesters[0].plot_manager.pool_public_keys.append(G1Element())
|
|
447
|
+
# And validate they become valid now
|
|
448
|
+
env.expected[0].add_valid(env.dir_keys_missing.plot_info_list())
|
|
449
|
+
env.expected[0].remove_keys_missing(env.dir_keys_missing.path_list())
|
|
450
|
+
await env.run_sync_test()
|
|
451
|
+
# Drop the valid plots from one harvester and the keys missing plots from the other harvester
|
|
452
|
+
env.remove_directory(0, env.dir_keys_missing)
|
|
453
|
+
env.remove_directory(1, env.dir_keys_missing, State.keys_missing)
|
|
454
|
+
await env.run_sync_test()
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
@pytest.mark.anyio
|
|
458
|
+
async def test_sync_duplicates(environment: Environment) -> None:
|
|
459
|
+
env: Environment = environment
|
|
460
|
+
# dir_4 and then dir_duplicates contain the same plots. Load dir_4 first to make sure the plots seen as duplicates
|
|
461
|
+
# are from dir_duplicates.
|
|
462
|
+
env.add_directory(0, env.dir_4)
|
|
463
|
+
await env.run_sync_test()
|
|
464
|
+
env.add_directory(0, env.dir_duplicates, State.duplicates)
|
|
465
|
+
env.add_directory(1, env.dir_2)
|
|
466
|
+
await env.run_sync_test()
|
|
467
|
+
# Run again two times to make sure we still get the same results in repeated refresh intervals
|
|
468
|
+
await env.run_sync_test()
|
|
469
|
+
await env.run_sync_test()
|
|
470
|
+
# Drop all but 1 duplicates and test sync in-between
|
|
471
|
+
assert len(env.dir_duplicates) > 2
|
|
472
|
+
for _ in range(len(env.dir_duplicates) - 2):
|
|
473
|
+
drop_plot = env.dir_duplicates.path_list()[0]
|
|
474
|
+
drop_plot.unlink()
|
|
475
|
+
env.dir_duplicates.drop(drop_plot)
|
|
476
|
+
env.expected[0].remove_duplicates([drop_plot])
|
|
477
|
+
await env.run_sync_test()
|
|
478
|
+
assert len(env.dir_duplicates) == 2
|
|
479
|
+
# Removing dir_4 now leads to the plots in dir_duplicates to become loaded instead
|
|
480
|
+
env.remove_directory(0, env.dir_4)
|
|
481
|
+
env.expected[0].remove_duplicates(env.dir_duplicates.path_list())
|
|
482
|
+
env.expected[0].add_valid(env.dir_duplicates.plot_info_list())
|
|
483
|
+
await env.run_sync_test()
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
async def add_and_validate_all_directories(env: Environment) -> None:
|
|
487
|
+
# Add all available directories to both harvesters and make sure they load and get synced
|
|
488
|
+
env.add_all_directories(0)
|
|
489
|
+
env.add_all_directories(1)
|
|
490
|
+
await env.run_sync_test()
|
|
491
|
+
env.add_directory(0, env.dir_duplicates, State.duplicates)
|
|
492
|
+
env.add_directory(1, env.dir_duplicates, State.duplicates)
|
|
493
|
+
await env.run_sync_test()
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
async def remove_and_validate_all_directories(env: Environment) -> None:
|
|
497
|
+
# Remove all available directories to both harvesters and make sure they are removed and get synced
|
|
498
|
+
env.remove_all_directories(0)
|
|
499
|
+
env.remove_all_directories(1)
|
|
500
|
+
await env.run_sync_test()
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
@pytest.mark.anyio
|
|
504
|
+
async def test_add_and_remove_all_directories(environment: Environment) -> None:
|
|
505
|
+
await add_and_validate_all_directories(environment)
|
|
506
|
+
await remove_and_validate_all_directories(environment)
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
@pytest.mark.anyio
|
|
510
|
+
async def test_harvester_restart(environment: Environment) -> None:
|
|
511
|
+
env: Environment = environment
|
|
512
|
+
# Load all directories for both harvesters
|
|
513
|
+
await add_and_validate_all_directories(env)
|
|
514
|
+
# Stop the harvester and make sure the receiver gets dropped on the farmer and refreshing gets stopped
|
|
515
|
+
await env.split_harvester_managers[0].exit()
|
|
516
|
+
assert len(env.farmer.plot_sync_receivers) == 1
|
|
517
|
+
assert not env.harvesters[0].plot_manager._refreshing_enabled
|
|
518
|
+
assert not env.harvesters[0].plot_manager.needs_refresh()
|
|
519
|
+
# Start the harvester, wait for the handshake and make sure the receiver comes back
|
|
520
|
+
async with start_harvester_service(env.harvester_services[0], env.farmer_service):
|
|
521
|
+
await time_out_assert(5, env.handshake_done, True, 0)
|
|
522
|
+
assert len(env.farmer.plot_sync_receivers) == 2
|
|
523
|
+
# Remove the duplicates dir to avoid conflicts with the original plots
|
|
524
|
+
env.remove_directory(0, env.dir_duplicates)
|
|
525
|
+
# Reset the expected data for harvester 0 and re-add all directories because of the restart
|
|
526
|
+
env.expected[0] = ExpectedResult()
|
|
527
|
+
env.add_all_directories(0)
|
|
528
|
+
# Run the refresh two times and make sure everything recovers and stays recovered after harvester restart
|
|
529
|
+
await env.run_sync_test()
|
|
530
|
+
env.add_directory(0, env.dir_duplicates, State.duplicates)
|
|
531
|
+
await env.run_sync_test()
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
@pytest.mark.anyio
|
|
535
|
+
async def test_farmer_restart(environment: Environment) -> None:
|
|
536
|
+
env: Environment = environment
|
|
537
|
+
# Load all directories for both harvesters
|
|
538
|
+
await add_and_validate_all_directories(env)
|
|
539
|
+
last_sync_ids: list[uint64] = []
|
|
540
|
+
for i in range(0, len(env.harvesters)):
|
|
541
|
+
last_sync_ids.append(env.harvesters[i].plot_sync_sender._last_sync_id)
|
|
542
|
+
# Stop the farmer and make sure both receivers get dropped and refreshing gets stopped on the harvesters
|
|
543
|
+
await env.split_farmer_service_manager.exit()
|
|
544
|
+
assert len(env.farmer.plot_sync_receivers) == 0
|
|
545
|
+
assert not env.harvesters[0].plot_manager._refreshing_enabled
|
|
546
|
+
assert not env.harvesters[1].plot_manager._refreshing_enabled
|
|
547
|
+
# Start the farmer, wait for the handshake and make sure the receivers come back
|
|
548
|
+
async with env.farmer_service.manage():
|
|
549
|
+
await time_out_assert(5, env.handshake_done, True, 0)
|
|
550
|
+
await time_out_assert(5, env.handshake_done, True, 1)
|
|
551
|
+
assert len(env.farmer.plot_sync_receivers) == 2
|
|
552
|
+
# Do not use run_sync_test here, to have a more realistic test scenario just
|
|
553
|
+
# wait for the harvesters to be synced. The handshake should trigger re-sync.
|
|
554
|
+
for i in range(0, len(env.harvesters)):
|
|
555
|
+
harvester: Harvester = env.harvesters[i]
|
|
556
|
+
assert harvester.server is not None
|
|
557
|
+
receiver = env.farmer.plot_sync_receivers[harvester.server.node_id]
|
|
558
|
+
await time_out_assert(20, synced, True, harvester.plot_sync_sender, receiver, last_sync_ids[i])
|
|
559
|
+
# Validate the sync
|
|
560
|
+
for harvester in env.harvesters:
|
|
561
|
+
plot_manager: PlotManager = harvester.plot_manager
|
|
562
|
+
assert harvester.server is not None
|
|
563
|
+
receiver = env.farmer.plot_sync_receivers[harvester.server.node_id]
|
|
564
|
+
expected = env.expected[env.harvesters.index(harvester)]
|
|
565
|
+
assert plot_manager.plot_count() == len(receiver.plots()) == expected.valid_count
|
|
566
|
+
assert len(plot_manager.failed_to_open_filenames) == len(receiver.invalid()) == expected.invalid_count
|
|
567
|
+
assert len(plot_manager.no_key_filenames) == len(receiver.keys_missing()) == expected.keys_missing_count
|
|
568
|
+
assert len(plot_manager.get_duplicates()) == len(receiver.duplicates()) == expected.duplicates_count
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
@pytest.mark.anyio
|
|
572
|
+
async def test_sync_start_and_disconnect_while_sync_is_active(
|
|
573
|
+
farmer_one_harvester: tuple[list[HarvesterService], FarmerService, BlockTools],
|
|
574
|
+
) -> None:
|
|
575
|
+
harvesters, farmer_service, _ = farmer_one_harvester
|
|
576
|
+
harvester_service = harvesters[0]
|
|
577
|
+
harvester = harvester_service._node
|
|
578
|
+
farmer: Farmer = farmer_service._node
|
|
579
|
+
Constants.message_timeout = 3
|
|
580
|
+
|
|
581
|
+
async def receiver_available() -> bool:
|
|
582
|
+
return harvester.server.node_id in farmer.plot_sync_receivers
|
|
583
|
+
|
|
584
|
+
async def disconnecting_process(
|
|
585
|
+
self: Receiver, method: Callable[[_T_Streamable], Any], message_type: ProtocolMessageTypes, message: Any
|
|
586
|
+
) -> None:
|
|
587
|
+
if self.current_sync().state == State.loaded:
|
|
588
|
+
harvester.plot_manager.trigger_refresh()
|
|
589
|
+
await asyncio.sleep(2)
|
|
590
|
+
await self.connection().close()
|
|
591
|
+
return
|
|
592
|
+
await original_process(method, message_type, message)
|
|
593
|
+
|
|
594
|
+
# Wait for the receiver to show up
|
|
595
|
+
await time_out_assert(20, receiver_available)
|
|
596
|
+
receiver = farmer.plot_sync_receivers[harvester.server.node_id]
|
|
597
|
+
# And wait until the first sync from the harvester to the farmer is done
|
|
598
|
+
await time_out_assert(20, receiver.initial_sync, False)
|
|
599
|
+
# Replace the `Receiver._process` with `disconnecting_process` which triggers a plot manager refresh and disconnects
|
|
600
|
+
# the farmer from the harvester during an active sync.
|
|
601
|
+
original_process = receiver._process
|
|
602
|
+
receiver._process = functools.partial(disconnecting_process, receiver) # type: ignore[method-assign]
|
|
603
|
+
# Trigger the refresh which leads to a new sync_start being triggered during the active sync.
|
|
604
|
+
harvester.plot_manager.trigger_refresh()
|
|
605
|
+
await time_out_assert(20, harvester.plot_sync_sender.sync_active)
|
|
606
|
+
# Now wait until the receiver disappears from the farmer's plot_sync_receivers which means its disconnected.
|
|
607
|
+
await time_out_assert(20, receiver_available, False)
|
|
608
|
+
# Wait until the sync was aborted
|
|
609
|
+
await time_out_assert(20, harvester.plot_sync_sender.sync_active, False)
|
|
610
|
+
# And then wait for the harvester to reconnect and the receiver to re-appear.
|
|
611
|
+
await time_out_assert(20, receiver_available, True)
|
|
612
|
+
# Make sure the receiver object has been changed because of the disconnect
|
|
613
|
+
assert farmer.plot_sync_receivers[harvester.server.node_id] is not receiver
|
|
614
|
+
receiver = farmer.plot_sync_receivers[harvester.server.node_id]
|
|
615
|
+
current_last_sync_id = receiver.last_sync().sync_id
|
|
616
|
+
# Now start another sync and wait for it to be done to make sure everything still works fine
|
|
617
|
+
harvester.plot_manager.trigger_refresh()
|
|
618
|
+
await time_out_assert(20, synced, True, harvester.plot_sync_sender, receiver, current_last_sync_id)
|