chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
chia/daemon/server.py
CHANGED
|
@@ -10,15 +10,15 @@ import signal
|
|
|
10
10
|
import ssl
|
|
11
11
|
import subprocess
|
|
12
12
|
import sys
|
|
13
|
-
import time
|
|
14
13
|
import traceback
|
|
15
14
|
import uuid
|
|
15
|
+
from collections.abc import AsyncIterator
|
|
16
16
|
from concurrent.futures import ThreadPoolExecutor
|
|
17
17
|
from contextlib import asynccontextmanager
|
|
18
18
|
from enum import Enum
|
|
19
19
|
from pathlib import Path
|
|
20
20
|
from types import FrameType
|
|
21
|
-
from typing import Any,
|
|
21
|
+
from typing import Any, Optional, TextIO
|
|
22
22
|
|
|
23
23
|
from chia_rs import G1Element
|
|
24
24
|
from typing_extensions import Protocol
|
|
@@ -44,8 +44,10 @@ from chia.util.keychain import Keychain, KeyData, passphrase_requirements, suppo
|
|
|
44
44
|
from chia.util.lock import Lockfile, LockfileError
|
|
45
45
|
from chia.util.log_exceptions import log_exceptions
|
|
46
46
|
from chia.util.network import WebServer
|
|
47
|
+
from chia.util.safe_cancel_task import cancel_task_safe
|
|
47
48
|
from chia.util.service_groups import validate_service
|
|
48
49
|
from chia.util.setproctitle import setproctitle
|
|
50
|
+
from chia.util.task_referencer import create_referenced_task
|
|
49
51
|
from chia.util.ws_message import WsRpcMessage, create_payload, format_response
|
|
50
52
|
from chia.wallet.derive_keys import (
|
|
51
53
|
master_pk_to_wallet_pk_unhardened,
|
|
@@ -117,16 +119,16 @@ else:
|
|
|
117
119
|
return cmd_to_exec if cmd_to_exec is not None else service_name
|
|
118
120
|
|
|
119
121
|
|
|
120
|
-
async def ping() ->
|
|
122
|
+
async def ping() -> dict[str, Any]:
|
|
121
123
|
response = {"success": True, "value": "pong"}
|
|
122
124
|
return response
|
|
123
125
|
|
|
124
126
|
|
|
125
127
|
class Command(Protocol):
|
|
126
|
-
async def __call__(self, websocket: WebSocketResponse, request:
|
|
128
|
+
async def __call__(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]: ...
|
|
127
129
|
|
|
128
130
|
|
|
129
|
-
def _get_keys_by_fingerprints(fingerprints: Optional[
|
|
131
|
+
def _get_keys_by_fingerprints(fingerprints: Optional[list[uint32]]) -> tuple[list[KeyData], set[uint32]]:
|
|
130
132
|
all_keys = Keychain().get_keys(include_secrets=True)
|
|
131
133
|
missing_fingerprints = set()
|
|
132
134
|
|
|
@@ -153,7 +155,7 @@ class StatusMessage:
|
|
|
153
155
|
command: str
|
|
154
156
|
destination: str
|
|
155
157
|
origin: str
|
|
156
|
-
data:
|
|
158
|
+
data: dict[str, Any]
|
|
157
159
|
|
|
158
160
|
def create_payload(self) -> str:
|
|
159
161
|
return create_payload(command=self.command, data=self.data, origin=self.origin, destination=self.destination)
|
|
@@ -171,9 +173,9 @@ class WebSocketServer:
|
|
|
171
173
|
):
|
|
172
174
|
self.root_path = root_path
|
|
173
175
|
self.log = log
|
|
174
|
-
self.services:
|
|
175
|
-
self.plots_queue:
|
|
176
|
-
self.connections:
|
|
176
|
+
self.services: dict[str, list[subprocess.Popen]] = dict()
|
|
177
|
+
self.plots_queue: list[dict] = []
|
|
178
|
+
self.connections: dict[str, set[WebSocketResponse]] = dict() # service name : {WebSocketResponse}
|
|
177
179
|
self.ping_job: Optional[asyncio.Task] = None
|
|
178
180
|
self.net_config = load_config(root_path, "config.yaml")
|
|
179
181
|
self.self_hostname = self.net_config["self_hostname"]
|
|
@@ -211,7 +213,7 @@ class WebSocketServer:
|
|
|
211
213
|
ssl.OPENSSL_VERSION,
|
|
212
214
|
)
|
|
213
215
|
|
|
214
|
-
self.state_changed_task =
|
|
216
|
+
self.state_changed_task = create_referenced_task(self._process_state_changed_queue())
|
|
215
217
|
self.webserver = await WebServer.create(
|
|
216
218
|
hostname=self.self_hostname,
|
|
217
219
|
port=self.daemon_port,
|
|
@@ -240,22 +242,15 @@ class WebSocketServer:
|
|
|
240
242
|
self.log.info("Received signal %s (%s), shutting down.", signal_.name, signal_.value)
|
|
241
243
|
await self.stop()
|
|
242
244
|
|
|
243
|
-
def
|
|
244
|
-
if task is not None:
|
|
245
|
-
try:
|
|
246
|
-
task.cancel()
|
|
247
|
-
except Exception as e:
|
|
248
|
-
self.log.error(f"Error while canceling task.{e} {task}")
|
|
249
|
-
|
|
250
|
-
async def stop_command(self, websocket: WebSocketResponse, request: Dict[str, Any] = {}) -> Dict[str, Any]:
|
|
245
|
+
async def stop_command(self, websocket: WebSocketResponse, request: dict[str, Any] = {}) -> dict[str, Any]:
|
|
251
246
|
return await self.stop()
|
|
252
247
|
|
|
253
|
-
async def stop(self) ->
|
|
254
|
-
|
|
255
|
-
|
|
248
|
+
async def stop(self) -> dict[str, Any]:
|
|
249
|
+
cancel_task_safe(self.ping_job, self.log)
|
|
250
|
+
cancel_task_safe(self.state_changed_task, self.log)
|
|
256
251
|
service_names = list(self.services.keys())
|
|
257
252
|
stop_service_jobs = [
|
|
258
|
-
|
|
253
|
+
create_referenced_task(kill_service(self.root_path, self.services, s_n)) for s_n in service_names
|
|
259
254
|
]
|
|
260
255
|
if stop_service_jobs:
|
|
261
256
|
await asyncio.wait(stop_service_jobs)
|
|
@@ -330,7 +325,7 @@ class WebSocketServer:
|
|
|
330
325
|
|
|
331
326
|
return ws
|
|
332
327
|
|
|
333
|
-
async def send_all_responses(self, connections:
|
|
328
|
+
async def send_all_responses(self, connections: set[WebSocketResponse], response: str) -> None:
|
|
334
329
|
for connection in connections.copy():
|
|
335
330
|
try:
|
|
336
331
|
await connection.send_str(response)
|
|
@@ -348,7 +343,7 @@ class WebSocketServer:
|
|
|
348
343
|
|
|
349
344
|
await connection.close()
|
|
350
345
|
|
|
351
|
-
def remove_connection(self, websocket: WebSocketResponse) ->
|
|
346
|
+
def remove_connection(self, websocket: WebSocketResponse) -> list[str]:
|
|
352
347
|
"""Returns a list of service names from which the connection was removed"""
|
|
353
348
|
service_names = []
|
|
354
349
|
for service_name, connections in self.connections.items():
|
|
@@ -396,7 +391,7 @@ class WebSocketServer:
|
|
|
396
391
|
|
|
397
392
|
async def handle_message(
|
|
398
393
|
self, websocket: WebSocketResponse, message: WsRpcMessage
|
|
399
|
-
) -> Optional[
|
|
394
|
+
) -> Optional[tuple[str, set[WebSocketResponse]]]:
|
|
400
395
|
"""
|
|
401
396
|
This function gets called when new message is received via websocket.
|
|
402
397
|
"""
|
|
@@ -437,7 +432,7 @@ class WebSocketServer:
|
|
|
437
432
|
full_response = format_response(message, response)
|
|
438
433
|
return full_response, {websocket}
|
|
439
434
|
|
|
440
|
-
def get_command_mapping(self) ->
|
|
435
|
+
def get_command_mapping(self) -> dict[str, Command]:
|
|
441
436
|
"""
|
|
442
437
|
Returns a mapping of commands to their respective function calls.
|
|
443
438
|
"""
|
|
@@ -465,11 +460,11 @@ class WebSocketServer:
|
|
|
465
460
|
"get_network_info": self.get_network_info,
|
|
466
461
|
}
|
|
467
462
|
|
|
468
|
-
async def get_network_info(self, websocket: WebSocketResponse, request:
|
|
463
|
+
async def get_network_info(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
469
464
|
network_name = self.net_config["selected_network"]
|
|
470
465
|
address_prefix = self.net_config["network_overrides"]["config"][network_name]["address_prefix"]
|
|
471
466
|
genesis_challenge = self.net_config["network_overrides"]["constants"][network_name]["GENESIS_CHALLENGE"]
|
|
472
|
-
response:
|
|
467
|
+
response: dict[str, Any] = {
|
|
473
468
|
"success": True,
|
|
474
469
|
"network_name": network_name,
|
|
475
470
|
"network_prefix": address_prefix,
|
|
@@ -477,22 +472,22 @@ class WebSocketServer:
|
|
|
477
472
|
}
|
|
478
473
|
return response
|
|
479
474
|
|
|
480
|
-
async def is_keyring_locked(self, websocket: WebSocketResponse, request:
|
|
475
|
+
async def is_keyring_locked(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
481
476
|
locked: bool = Keychain.is_keyring_locked()
|
|
482
|
-
response:
|
|
477
|
+
response: dict[str, Any] = {"success": True, "is_keyring_locked": locked}
|
|
483
478
|
return response
|
|
484
479
|
|
|
485
|
-
async def keyring_status_command(self, websocket: WebSocketResponse, request:
|
|
480
|
+
async def keyring_status_command(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
486
481
|
return await self.keyring_status()
|
|
487
482
|
|
|
488
|
-
async def keyring_status(self) ->
|
|
483
|
+
async def keyring_status(self) -> dict[str, Any]:
|
|
489
484
|
can_save_passphrase: bool = supports_os_passphrase_storage()
|
|
490
485
|
user_passphrase_is_set: bool = Keychain.has_master_passphrase() and not using_default_passphrase()
|
|
491
486
|
locked: bool = Keychain.is_keyring_locked()
|
|
492
487
|
can_set_passphrase_hint: bool = True
|
|
493
488
|
passphrase_hint: str = Keychain.get_master_passphrase_hint() or ""
|
|
494
|
-
requirements:
|
|
495
|
-
response:
|
|
489
|
+
requirements: dict[str, Any] = passphrase_requirements()
|
|
490
|
+
response: dict[str, Any] = {
|
|
496
491
|
"success": True,
|
|
497
492
|
"is_keyring_locked": locked,
|
|
498
493
|
"can_save_passphrase": can_save_passphrase,
|
|
@@ -505,7 +500,7 @@ class WebSocketServer:
|
|
|
505
500
|
self.log.debug(f"Keyring status: {response}")
|
|
506
501
|
return response
|
|
507
502
|
|
|
508
|
-
async def unlock_keyring(self, websocket: WebSocketResponse, request:
|
|
503
|
+
async def unlock_keyring(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
509
504
|
success: bool = False
|
|
510
505
|
error: Optional[str] = None
|
|
511
506
|
key: Optional[str] = request.get("key", None)
|
|
@@ -534,14 +529,14 @@ class WebSocketServer:
|
|
|
534
529
|
tb = traceback.format_exc()
|
|
535
530
|
self.log.error(f"check_keys failed after unlocking keyring: {e} {tb}")
|
|
536
531
|
|
|
537
|
-
response:
|
|
532
|
+
response: dict[str, Any] = {"success": success, "error": error}
|
|
538
533
|
return response
|
|
539
534
|
|
|
540
535
|
async def validate_keyring_passphrase(
|
|
541
536
|
self,
|
|
542
537
|
websocket: WebSocketResponse,
|
|
543
|
-
request:
|
|
544
|
-
) ->
|
|
538
|
+
request: dict[str, Any],
|
|
539
|
+
) -> dict[str, Any]:
|
|
545
540
|
success: bool = False
|
|
546
541
|
error: Optional[str] = None
|
|
547
542
|
key: Optional[str] = request.get("key", None)
|
|
@@ -555,10 +550,10 @@ class WebSocketServer:
|
|
|
555
550
|
self.log.error(f"Keyring passphrase validation failed: {e} {tb}")
|
|
556
551
|
error = "validation exception"
|
|
557
552
|
|
|
558
|
-
response:
|
|
553
|
+
response: dict[str, Any] = {"success": success, "error": error}
|
|
559
554
|
return response
|
|
560
555
|
|
|
561
|
-
async def set_keyring_passphrase(self, websocket: WebSocketResponse, request:
|
|
556
|
+
async def set_keyring_passphrase(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
562
557
|
success: bool = False
|
|
563
558
|
error: Optional[str] = None
|
|
564
559
|
current_passphrase: Optional[str] = None
|
|
@@ -599,10 +594,10 @@ class WebSocketServer:
|
|
|
599
594
|
# Inform the GUI of keyring status changes
|
|
600
595
|
self.keyring_status_changed(await self.keyring_status(), "wallet_ui")
|
|
601
596
|
|
|
602
|
-
response:
|
|
597
|
+
response: dict[str, Any] = {"success": success, "error": error}
|
|
603
598
|
return response
|
|
604
599
|
|
|
605
|
-
async def remove_keyring_passphrase(self, websocket: WebSocketResponse, request:
|
|
600
|
+
async def remove_keyring_passphrase(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
606
601
|
success: bool = False
|
|
607
602
|
error: Optional[str] = None
|
|
608
603
|
current_passphrase: Optional[str] = None
|
|
@@ -626,28 +621,28 @@ class WebSocketServer:
|
|
|
626
621
|
# Inform the GUI of keyring status changes
|
|
627
622
|
self.keyring_status_changed(await self.keyring_status(), "wallet_ui")
|
|
628
623
|
|
|
629
|
-
response:
|
|
624
|
+
response: dict[str, Any] = {"success": success, "error": error}
|
|
630
625
|
return response
|
|
631
626
|
|
|
632
|
-
async def get_status(self, websocket: WebSocketResponse, request:
|
|
627
|
+
async def get_status(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
633
628
|
response = {"success": True, "genesis_initialized": True}
|
|
634
629
|
return response
|
|
635
630
|
|
|
636
|
-
async def get_version(self, websocket: WebSocketResponse, request:
|
|
631
|
+
async def get_version(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
637
632
|
response = {"success": True, "version": __version__}
|
|
638
633
|
return response
|
|
639
634
|
|
|
640
|
-
async def get_plotters(self, websocket: WebSocketResponse, request:
|
|
641
|
-
plotters:
|
|
642
|
-
response:
|
|
635
|
+
async def get_plotters(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
636
|
+
plotters: dict[str, Any] = get_available_plotters(self.root_path)
|
|
637
|
+
response: dict[str, Any] = {"success": True, "plotters": plotters}
|
|
643
638
|
return response
|
|
644
639
|
|
|
645
|
-
async def get_routes(self, websocket: WebSocketResponse, request:
|
|
640
|
+
async def get_routes(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
646
641
|
routes = list(self.get_command_mapping().keys())
|
|
647
|
-
response:
|
|
642
|
+
response: dict[str, Any] = {"success": True, "routes": routes}
|
|
648
643
|
return response
|
|
649
644
|
|
|
650
|
-
async def get_wallet_addresses(self, websocket: WebSocketResponse, request:
|
|
645
|
+
async def get_wallet_addresses(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
651
646
|
fingerprints = request.get("fingerprints", None)
|
|
652
647
|
keys, missing_fingerprints = _get_keys_by_fingerprints(fingerprints)
|
|
653
648
|
if len(missing_fingerprints) > 0:
|
|
@@ -684,16 +679,16 @@ class WebSocketServer:
|
|
|
684
679
|
|
|
685
680
|
wallet_addresses_by_fingerprint[key.fingerprint] = address_entries
|
|
686
681
|
|
|
687
|
-
response:
|
|
682
|
+
response: dict[str, Any] = {"success": True, "wallet_addresses": wallet_addresses_by_fingerprint}
|
|
688
683
|
return response
|
|
689
684
|
|
|
690
|
-
async def get_keys_for_plotting(self, websocket: WebSocketResponse, request:
|
|
685
|
+
async def get_keys_for_plotting(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
691
686
|
fingerprints = request.get("fingerprints", None)
|
|
692
687
|
keys, missing_fingerprints = _get_keys_by_fingerprints(fingerprints)
|
|
693
688
|
if len(missing_fingerprints) > 0:
|
|
694
689
|
return {"success": False, "error": f"key(s) not found for fingerprint(s) {missing_fingerprints}"}
|
|
695
690
|
|
|
696
|
-
keys_for_plot:
|
|
691
|
+
keys_for_plot: dict[uint32, Any] = {}
|
|
697
692
|
for key in keys:
|
|
698
693
|
if key.secrets is None:
|
|
699
694
|
continue
|
|
@@ -704,13 +699,13 @@ class WebSocketServer:
|
|
|
704
699
|
"farmer_public_key": bytes(farmer_public_key).hex(),
|
|
705
700
|
"pool_public_key": bytes(pool_public_key).hex(),
|
|
706
701
|
}
|
|
707
|
-
response:
|
|
702
|
+
response: dict[str, Any] = {
|
|
708
703
|
"success": True,
|
|
709
704
|
"keys": keys_for_plot,
|
|
710
705
|
}
|
|
711
706
|
return response
|
|
712
707
|
|
|
713
|
-
def plot_queue_to_payload(self, plot_queue_item, send_full_log: bool) ->
|
|
708
|
+
def plot_queue_to_payload(self, plot_queue_item, send_full_log: bool) -> dict[str, Any]:
|
|
714
709
|
error = plot_queue_item.get("error")
|
|
715
710
|
has_error = error is not None
|
|
716
711
|
|
|
@@ -737,7 +732,7 @@ class WebSocketServer:
|
|
|
737
732
|
}
|
|
738
733
|
return message
|
|
739
734
|
|
|
740
|
-
def extract_plot_queue(self, id=None) ->
|
|
735
|
+
def extract_plot_queue(self, id=None) -> list[dict]:
|
|
741
736
|
send_full_log = id is None
|
|
742
737
|
data = []
|
|
743
738
|
for item in self.plots_queue:
|
|
@@ -778,14 +773,14 @@ class WebSocketServer:
|
|
|
778
773
|
websockets.remove(websocket)
|
|
779
774
|
await websocket.close()
|
|
780
775
|
|
|
781
|
-
def state_changed(self, service: str, message:
|
|
776
|
+
def state_changed(self, service: str, message: dict[str, Any]) -> None:
|
|
782
777
|
self.state_changed_msg_queue.put_nowait(
|
|
783
778
|
StatusMessage(
|
|
784
779
|
service=service, command="state_changed", destination="wallet_ui", origin=service, data=message
|
|
785
780
|
)
|
|
786
781
|
)
|
|
787
782
|
|
|
788
|
-
def keyring_status_changed(self, keyring_status:
|
|
783
|
+
def keyring_status_changed(self, keyring_status: dict[str, Any], destination: str) -> None:
|
|
789
784
|
self.state_changed_msg_queue.put_nowait(
|
|
790
785
|
StatusMessage(
|
|
791
786
|
service="wallet_ui",
|
|
@@ -799,7 +794,7 @@ class WebSocketServer:
|
|
|
799
794
|
async def _watch_file_changes(self, config, fp: TextIO, loop: asyncio.AbstractEventLoop):
|
|
800
795
|
id: str = config["id"]
|
|
801
796
|
plotter: str = config["plotter"]
|
|
802
|
-
final_words:
|
|
797
|
+
final_words: list[str] = []
|
|
803
798
|
|
|
804
799
|
if plotter == "chiapos":
|
|
805
800
|
final_words = ["Renamed final file"]
|
|
@@ -824,7 +819,7 @@ class WebSocketServer:
|
|
|
824
819
|
if config["state"] is not PlotState.RUNNING:
|
|
825
820
|
return None
|
|
826
821
|
|
|
827
|
-
if new_data not in
|
|
822
|
+
if new_data not in {None, ""}:
|
|
828
823
|
config["log"] = new_data if config["log"] is None else config["log"] + new_data
|
|
829
824
|
config["log_new"] = new_data
|
|
830
825
|
self.state_changed(service_plotter, self.prepare_plot_state_message(PlotEvent.LOG_CHANGED, id))
|
|
@@ -834,14 +829,14 @@ class WebSocketServer:
|
|
|
834
829
|
if word in new_data:
|
|
835
830
|
return None
|
|
836
831
|
else:
|
|
837
|
-
|
|
832
|
+
await asyncio.sleep(0.5)
|
|
838
833
|
|
|
839
834
|
async def _track_plotting_progress(self, config, loop: asyncio.AbstractEventLoop):
|
|
840
835
|
file_path = config["out_file"]
|
|
841
836
|
with open(file_path) as fp:
|
|
842
837
|
await self._watch_file_changes(config, fp, loop)
|
|
843
838
|
|
|
844
|
-
def _common_plotting_command_args(self, request: Any, ignoreCount: bool) ->
|
|
839
|
+
def _common_plotting_command_args(self, request: Any, ignoreCount: bool) -> list[str]:
|
|
845
840
|
n = 1 if ignoreCount else request["n"] # Plot count
|
|
846
841
|
d = request["d"] # Final directory
|
|
847
842
|
r = request["r"] # Threads
|
|
@@ -849,7 +844,7 @@ class WebSocketServer:
|
|
|
849
844
|
p = request.get("p") # Pool pubkey
|
|
850
845
|
c = request.get("c") # Pool contract address
|
|
851
846
|
|
|
852
|
-
command_args:
|
|
847
|
+
command_args: list[str] = ["-n", str(n), "-d", d, "-r", str(r)]
|
|
853
848
|
|
|
854
849
|
if f is not None:
|
|
855
850
|
command_args.append("-f")
|
|
@@ -863,7 +858,7 @@ class WebSocketServer:
|
|
|
863
858
|
|
|
864
859
|
return command_args
|
|
865
860
|
|
|
866
|
-
def _chiapos_plotting_command_args(self, request: Any, ignoreCount: bool) ->
|
|
861
|
+
def _chiapos_plotting_command_args(self, request: Any, ignoreCount: bool) -> list[str]:
|
|
867
862
|
k = request["k"] # Plot size
|
|
868
863
|
t = request["t"] # Temp directory
|
|
869
864
|
t2 = request.get("t2") # Temp2 directory
|
|
@@ -874,7 +869,7 @@ class WebSocketServer:
|
|
|
874
869
|
x = request["x"] # Exclude final directory
|
|
875
870
|
override_k = request["overrideK"] # Force plot sizes < k32
|
|
876
871
|
|
|
877
|
-
command_args:
|
|
872
|
+
command_args: list[str] = ["-k", str(k), "-t", t, "-b", str(b), "-u", str(u)]
|
|
878
873
|
|
|
879
874
|
if t2 is not None:
|
|
880
875
|
command_args.append("-2")
|
|
@@ -891,12 +886,12 @@ class WebSocketServer:
|
|
|
891
886
|
|
|
892
887
|
return command_args
|
|
893
888
|
|
|
894
|
-
def _bladebit_plotting_command_args(self, request: Any, ignoreCount: bool) ->
|
|
889
|
+
def _bladebit_plotting_command_args(self, request: Any, ignoreCount: bool) -> list[str]:
|
|
895
890
|
plot_type = request["plot_type"]
|
|
896
|
-
if plot_type not in
|
|
891
|
+
if plot_type not in {"ramplot", "diskplot", "cudaplot"}:
|
|
897
892
|
raise ValueError(f"Unknown plot_type: {plot_type}")
|
|
898
893
|
|
|
899
|
-
command_args:
|
|
894
|
+
command_args: list[str] = []
|
|
900
895
|
|
|
901
896
|
# Common options among diskplot, ramplot, cudaplot
|
|
902
897
|
w = request.get("w", False) # Warm start
|
|
@@ -991,7 +986,7 @@ class WebSocketServer:
|
|
|
991
986
|
|
|
992
987
|
return command_args
|
|
993
988
|
|
|
994
|
-
def _madmax_plotting_command_args(self, request: Any, ignoreCount: bool, index: int) ->
|
|
989
|
+
def _madmax_plotting_command_args(self, request: Any, ignoreCount: bool, index: int) -> list[str]:
|
|
995
990
|
k = request["k"] # Plot size
|
|
996
991
|
t = request["t"] # Temp directory
|
|
997
992
|
t2 = request["t2"] # Temp2 directory
|
|
@@ -1000,7 +995,7 @@ class WebSocketServer:
|
|
|
1000
995
|
K = request.get("K", 1) # Thread multiplier for phase 2
|
|
1001
996
|
G = request.get("G", False) # Alternate tmpdir/tmp2dir
|
|
1002
997
|
|
|
1003
|
-
command_args:
|
|
998
|
+
command_args: list[str] = []
|
|
1004
999
|
command_args.append(f"-k{k}")
|
|
1005
1000
|
command_args.append(f"-u{u}")
|
|
1006
1001
|
command_args.append(f"-v{v}")
|
|
@@ -1017,15 +1012,15 @@ class WebSocketServer:
|
|
|
1017
1012
|
|
|
1018
1013
|
return command_args
|
|
1019
1014
|
|
|
1020
|
-
def _build_plotting_command_args(self, request: Any, ignoreCount: bool, index: int) ->
|
|
1015
|
+
def _build_plotting_command_args(self, request: Any, ignoreCount: bool, index: int) -> list[str]:
|
|
1021
1016
|
plotter: str = request.get("plotter", "chiapos")
|
|
1022
|
-
command_args:
|
|
1017
|
+
command_args: list[str] = ["chia", "plotters", plotter]
|
|
1023
1018
|
|
|
1024
1019
|
if plotter == "bladebit":
|
|
1025
1020
|
# plotter command must be either
|
|
1026
1021
|
# 'chia plotters bladebit ramplot' or 'chia plotters bladebit diskplot'
|
|
1027
1022
|
plot_type = request["plot_type"]
|
|
1028
|
-
assert plot_type
|
|
1023
|
+
assert plot_type in {"diskplot", "ramplot", "cudaplot"}
|
|
1029
1024
|
command_args.append(plot_type)
|
|
1030
1025
|
|
|
1031
1026
|
command_args.extend(self._common_plotting_command_args(request, ignoreCount))
|
|
@@ -1062,9 +1057,9 @@ class WebSocketServer:
|
|
|
1062
1057
|
break
|
|
1063
1058
|
|
|
1064
1059
|
if next_plot_id is not None:
|
|
1065
|
-
|
|
1060
|
+
create_referenced_task(self._start_plotting(next_plot_id, loop, queue))
|
|
1066
1061
|
|
|
1067
|
-
def _post_process_plotting_job(self, job:
|
|
1062
|
+
def _post_process_plotting_job(self, job: dict[str, Any]):
|
|
1068
1063
|
id: str = job["id"]
|
|
1069
1064
|
final_dir: str = job["final_dir"]
|
|
1070
1065
|
exclude_final_dir: bool = job["exclude_final_dir"]
|
|
@@ -1104,7 +1099,7 @@ class WebSocketServer:
|
|
|
1104
1099
|
|
|
1105
1100
|
self.log.debug(f"command_args before launch_plotter are {command_args}")
|
|
1106
1101
|
self.log.debug(f"self.root_path before launch_plotter is {self.root_path}")
|
|
1107
|
-
process,
|
|
1102
|
+
process, _pid_path = launch_plotter(self.root_path, service_name, command_args, id)
|
|
1108
1103
|
|
|
1109
1104
|
current_process = process
|
|
1110
1105
|
|
|
@@ -1137,11 +1132,14 @@ class WebSocketServer:
|
|
|
1137
1132
|
|
|
1138
1133
|
finally:
|
|
1139
1134
|
if current_process is not None:
|
|
1140
|
-
|
|
1135
|
+
try:
|
|
1136
|
+
self.services[service_name].remove(current_process)
|
|
1137
|
+
except KeyError:
|
|
1138
|
+
pass
|
|
1141
1139
|
current_process.wait() # prevent zombies
|
|
1142
1140
|
self._run_next_serial_plotting(loop, queue)
|
|
1143
1141
|
|
|
1144
|
-
async def start_plotting(self, websocket: WebSocketResponse, request:
|
|
1142
|
+
async def start_plotting(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
1145
1143
|
service_name = request["service"]
|
|
1146
1144
|
|
|
1147
1145
|
plotter = request.get("plotter", "chiapos")
|
|
@@ -1162,7 +1160,7 @@ class WebSocketServer:
|
|
|
1162
1160
|
}
|
|
1163
1161
|
return response
|
|
1164
1162
|
|
|
1165
|
-
ids:
|
|
1163
|
+
ids: list[str] = []
|
|
1166
1164
|
for k in range(count):
|
|
1167
1165
|
id = str(uuid.uuid4())
|
|
1168
1166
|
ids.append(id)
|
|
@@ -1197,7 +1195,8 @@ class WebSocketServer:
|
|
|
1197
1195
|
log.info(f"Plotting will start in {config['delay']} seconds")
|
|
1198
1196
|
# TODO: loop gets passed down a lot, review for potential removal
|
|
1199
1197
|
loop = asyncio.get_running_loop()
|
|
1200
|
-
|
|
1198
|
+
# TODO: stop dropping tasks on the floor
|
|
1199
|
+
create_referenced_task(self._start_plotting(id, loop, queue))
|
|
1201
1200
|
else:
|
|
1202
1201
|
log.info("Plotting will start automatically when previous plotting finish")
|
|
1203
1202
|
|
|
@@ -1209,7 +1208,7 @@ class WebSocketServer:
|
|
|
1209
1208
|
|
|
1210
1209
|
return response
|
|
1211
1210
|
|
|
1212
|
-
async def stop_plotting(self, websocket: WebSocketResponse, request:
|
|
1211
|
+
async def stop_plotting(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
1213
1212
|
id = request["id"]
|
|
1214
1213
|
config = self._get_plots_queue_item(id)
|
|
1215
1214
|
if config is None:
|
|
@@ -1251,7 +1250,7 @@ class WebSocketServer:
|
|
|
1251
1250
|
self.state_changed(service_plotter, self.prepare_plot_state_message(PlotEvent.STATE_CHANGED, id))
|
|
1252
1251
|
return {"success": False}
|
|
1253
1252
|
|
|
1254
|
-
async def start_service(self, websocket: WebSocketResponse, request:
|
|
1253
|
+
async def start_service(self, websocket: WebSocketResponse, request: dict[str, Any]):
|
|
1255
1254
|
service_command = request["service"]
|
|
1256
1255
|
|
|
1257
1256
|
error = None
|
|
@@ -1285,7 +1284,7 @@ class WebSocketServer:
|
|
|
1285
1284
|
exe_command = service_command
|
|
1286
1285
|
if testing is True:
|
|
1287
1286
|
exe_command = f"{service_command} --testing=true"
|
|
1288
|
-
process,
|
|
1287
|
+
process, _pid_path = launch_service(self.root_path, exe_command)
|
|
1289
1288
|
self.services[service_command] = [process]
|
|
1290
1289
|
success = True
|
|
1291
1290
|
except (subprocess.SubprocessError, OSError):
|
|
@@ -1295,14 +1294,14 @@ class WebSocketServer:
|
|
|
1295
1294
|
response = {"success": success, "service": service_command, "error": error}
|
|
1296
1295
|
return response
|
|
1297
1296
|
|
|
1298
|
-
async def stop_service(self, websocket: WebSocketResponse, request:
|
|
1297
|
+
async def stop_service(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
1299
1298
|
service_name = request["service"]
|
|
1300
1299
|
result = await kill_service(self.root_path, self.services, service_name)
|
|
1301
1300
|
response = {"success": result, "service_name": service_name}
|
|
1302
1301
|
return response
|
|
1303
1302
|
|
|
1304
1303
|
def is_service_running(self, service_name: str) -> bool:
|
|
1305
|
-
processes:
|
|
1304
|
+
processes: list[subprocess.Popen]
|
|
1306
1305
|
if service_name == service_plotter:
|
|
1307
1306
|
processes = self.services.get(service_name, [])
|
|
1308
1307
|
is_running = len(processes) > 0
|
|
@@ -1317,19 +1316,19 @@ class WebSocketServer:
|
|
|
1317
1316
|
is_running = len(service_connections) > 0
|
|
1318
1317
|
return is_running
|
|
1319
1318
|
|
|
1320
|
-
async def running_services_command(self, websocket: WebSocketResponse, request:
|
|
1319
|
+
async def running_services_command(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
1321
1320
|
return await self.running_services()
|
|
1322
1321
|
|
|
1323
|
-
async def running_services(self) ->
|
|
1322
|
+
async def running_services(self) -> dict[str, Any]:
|
|
1324
1323
|
services = list({*self.services.keys(), *self.connections.keys()})
|
|
1325
1324
|
running_services = [service_name for service_name in services if self.is_service_running(service_name)]
|
|
1326
1325
|
|
|
1327
1326
|
return {"success": True, "running_services": running_services}
|
|
1328
1327
|
|
|
1329
|
-
async def is_running_command(self, websocket: WebSocketResponse, request:
|
|
1328
|
+
async def is_running_command(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
1330
1329
|
return await self.is_running(request=request)
|
|
1331
1330
|
|
|
1332
|
-
async def is_running(self, request:
|
|
1331
|
+
async def is_running(self, request: dict[str, Any]) -> dict[str, Any]:
|
|
1333
1332
|
service_name = request["service"]
|
|
1334
1333
|
is_running = self.is_service_running(service_name)
|
|
1335
1334
|
return {"success": True, "service_name": service_name, "is_running": is_running}
|
|
@@ -1340,7 +1339,7 @@ class WebSocketServer:
|
|
|
1340
1339
|
await self.webserver.await_closed()
|
|
1341
1340
|
log.info("chia daemon exiting")
|
|
1342
1341
|
|
|
1343
|
-
async def register_service(self, websocket: WebSocketResponse, request:
|
|
1342
|
+
async def register_service(self, websocket: WebSocketResponse, request: dict[str, Any]) -> dict[str, Any]:
|
|
1344
1343
|
self.log.info(f"Register service {request}")
|
|
1345
1344
|
service = request.get("service")
|
|
1346
1345
|
if service is None:
|
|
@@ -1350,7 +1349,7 @@ class WebSocketServer:
|
|
|
1350
1349
|
self.connections[service] = set()
|
|
1351
1350
|
self.connections[service].add(websocket)
|
|
1352
1351
|
|
|
1353
|
-
response:
|
|
1352
|
+
response: dict[str, Any] = {"success": True}
|
|
1354
1353
|
if service == service_plotter:
|
|
1355
1354
|
response = {
|
|
1356
1355
|
"success": True,
|
|
@@ -1359,7 +1358,7 @@ class WebSocketServer:
|
|
|
1359
1358
|
}
|
|
1360
1359
|
else:
|
|
1361
1360
|
if self.ping_job is None:
|
|
1362
|
-
self.ping_job =
|
|
1361
|
+
self.ping_job = create_referenced_task(self.ping_task())
|
|
1363
1362
|
self.log.info(f"registered for service {service}")
|
|
1364
1363
|
log.info(f"{response}")
|
|
1365
1364
|
return response
|
|
@@ -1394,8 +1393,8 @@ def plotter_log_path(root_path: Path, id: str):
|
|
|
1394
1393
|
|
|
1395
1394
|
|
|
1396
1395
|
def launch_plotter(
|
|
1397
|
-
root_path: Path, service_name: str, service_array:
|
|
1398
|
-
) ->
|
|
1396
|
+
root_path: Path, service_name: str, service_array: list[str], id: str
|
|
1397
|
+
) -> tuple[subprocess.Popen, Path]:
|
|
1399
1398
|
# we need to pass on the possibly altered CHIA_ROOT
|
|
1400
1399
|
os.environ["CHIA_ROOT"] = str(root_path)
|
|
1401
1400
|
service_executable = executable_for_service(service_array[0])
|
|
@@ -1438,7 +1437,7 @@ def launch_plotter(
|
|
|
1438
1437
|
return process, pid_path
|
|
1439
1438
|
|
|
1440
1439
|
|
|
1441
|
-
def launch_service(root_path: Path, service_command) ->
|
|
1440
|
+
def launch_service(root_path: Path, service_command) -> tuple[subprocess.Popen, Path]:
|
|
1442
1441
|
"""
|
|
1443
1442
|
Launch a child process.
|
|
1444
1443
|
"""
|
|
@@ -1482,7 +1481,7 @@ def launch_service(root_path: Path, service_command) -> Tuple[subprocess.Popen,
|
|
|
1482
1481
|
|
|
1483
1482
|
|
|
1484
1483
|
async def kill_processes(
|
|
1485
|
-
processes:
|
|
1484
|
+
processes: list[subprocess.Popen],
|
|
1486
1485
|
root_path: Path,
|
|
1487
1486
|
service_name: str,
|
|
1488
1487
|
id: str,
|
|
@@ -1526,7 +1525,7 @@ async def kill_processes(
|
|
|
1526
1525
|
|
|
1527
1526
|
|
|
1528
1527
|
async def kill_service(
|
|
1529
|
-
root_path: Path, services:
|
|
1528
|
+
root_path: Path, services: dict[str, list[subprocess.Popen]], service_name: str, delay_before_kill: int = 15
|
|
1530
1529
|
) -> bool:
|
|
1531
1530
|
processes = services.get(service_name)
|
|
1532
1531
|
if processes is None:
|
|
@@ -1536,7 +1535,7 @@ async def kill_service(
|
|
|
1536
1535
|
return result
|
|
1537
1536
|
|
|
1538
1537
|
|
|
1539
|
-
def is_running(services:
|
|
1538
|
+
def is_running(services: dict[str, subprocess.Popen], service_name: str) -> bool:
|
|
1540
1539
|
process = services.get(service_name)
|
|
1541
1540
|
return process is not None and process.poll() is None
|
|
1542
1541
|
|
|
@@ -1547,23 +1546,12 @@ async def async_run_daemon(root_path: Path, wait_for_unlock: bool = False) -> in
|
|
|
1547
1546
|
chia_init(root_path, should_check_keys=(not wait_for_unlock))
|
|
1548
1547
|
config = load_config(root_path, "config.yaml")
|
|
1549
1548
|
setproctitle("chia_daemon")
|
|
1550
|
-
initialize_service_logging("daemon", config)
|
|
1549
|
+
initialize_service_logging("daemon", config, root_path=root_path)
|
|
1551
1550
|
crt_path = root_path / config["daemon_ssl"]["private_crt"]
|
|
1552
1551
|
key_path = root_path / config["daemon_ssl"]["private_key"]
|
|
1553
1552
|
ca_crt_path = root_path / config["private_ssl_ca"]["crt"]
|
|
1554
1553
|
ca_key_path = root_path / config["private_ssl_ca"]["key"]
|
|
1555
1554
|
sys.stdout.flush()
|
|
1556
|
-
json_msg = dict_to_json_str(
|
|
1557
|
-
{
|
|
1558
|
-
"message": "cert_path",
|
|
1559
|
-
"success": True,
|
|
1560
|
-
"cert": f"{crt_path}",
|
|
1561
|
-
"key": f"{key_path}",
|
|
1562
|
-
"ca_crt": f"{ca_crt_path}",
|
|
1563
|
-
}
|
|
1564
|
-
)
|
|
1565
|
-
sys.stdout.write("\n" + json_msg + "\n")
|
|
1566
|
-
sys.stdout.flush()
|
|
1567
1555
|
try:
|
|
1568
1556
|
with Lockfile.create(daemon_launch_lock_path(root_path), timeout=1):
|
|
1569
1557
|
log.info(f"chia-blockchain version: {chia_short_version()}")
|
|
@@ -1605,11 +1593,13 @@ def run_daemon(root_path: Path, wait_for_unlock: bool = False) -> int:
|
|
|
1605
1593
|
|
|
1606
1594
|
|
|
1607
1595
|
def main() -> int:
|
|
1608
|
-
from chia.util.default_root import
|
|
1596
|
+
from chia.util.default_root import resolve_root_path
|
|
1609
1597
|
from chia.util.keychain import Keychain
|
|
1610
1598
|
|
|
1599
|
+
root_path = resolve_root_path(override=None)
|
|
1600
|
+
|
|
1611
1601
|
wait_for_unlock = "--wait-for-unlock" in sys.argv[1:] and Keychain.is_keyring_locked()
|
|
1612
|
-
return run_daemon(
|
|
1602
|
+
return run_daemon(root_path, wait_for_unlock)
|
|
1613
1603
|
|
|
1614
1604
|
|
|
1615
1605
|
if __name__ == "__main__":
|