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/server/signal_handlers.py
CHANGED
|
@@ -6,11 +6,14 @@ import dataclasses
|
|
|
6
6
|
import functools
|
|
7
7
|
import signal
|
|
8
8
|
import sys
|
|
9
|
+
from collections.abc import AsyncIterator
|
|
9
10
|
from types import FrameType
|
|
10
|
-
from typing import
|
|
11
|
+
from typing import Optional, final
|
|
11
12
|
|
|
12
13
|
from typing_extensions import Protocol
|
|
13
14
|
|
|
15
|
+
from chia.util.task_referencer import create_referenced_task
|
|
16
|
+
|
|
14
17
|
|
|
15
18
|
class Handler(Protocol):
|
|
16
19
|
def __call__(
|
|
@@ -33,7 +36,7 @@ class AsyncHandler(Protocol):
|
|
|
33
36
|
@final
|
|
34
37
|
@dataclasses.dataclass
|
|
35
38
|
class SignalHandlers:
|
|
36
|
-
tasks:
|
|
39
|
+
tasks: list[asyncio.Task[None]] = dataclasses.field(default_factory=list)
|
|
37
40
|
|
|
38
41
|
@classmethod
|
|
39
42
|
@contextlib.asynccontextmanager
|
|
@@ -58,7 +61,7 @@ class SignalHandlers:
|
|
|
58
61
|
) -> None:
|
|
59
62
|
self.remove_done_handlers()
|
|
60
63
|
|
|
61
|
-
task =
|
|
64
|
+
task = create_referenced_task(
|
|
62
65
|
handler(signal_=signal_, stack_frame=stack_frame, loop=loop),
|
|
63
66
|
)
|
|
64
67
|
self.tasks.append(task)
|
chia/server/ssl_context.py
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
def public_ssl_paths(path: Path, config:
|
|
7
|
+
def public_ssl_paths(path: Path, config: dict[str, Any]) -> tuple[Path, Path]:
|
|
8
8
|
return (
|
|
9
9
|
path / config["ssl"]["public_crt"],
|
|
10
10
|
path / config["ssl"]["public_key"],
|
|
11
11
|
)
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def private_ssl_paths(path: Path, config:
|
|
14
|
+
def private_ssl_paths(path: Path, config: dict[str, Any]) -> tuple[Path, Path]:
|
|
15
15
|
return (
|
|
16
16
|
path / config["ssl"]["private_crt"],
|
|
17
17
|
path / config["ssl"]["private_key"],
|
|
18
18
|
)
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
def private_ssl_ca_paths(path: Path, config:
|
|
21
|
+
def private_ssl_ca_paths(path: Path, config: dict[str, Any]) -> tuple[Path, Path]:
|
|
22
22
|
return (
|
|
23
23
|
path / config["private_ssl_ca"]["crt"],
|
|
24
24
|
path / config["private_ssl_ca"]["key"],
|
|
25
25
|
)
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def chia_ssl_ca_paths(path: Path, config:
|
|
28
|
+
def chia_ssl_ca_paths(path: Path, config: dict[str, Any]) -> tuple[Path, Path]:
|
|
29
29
|
return (
|
|
30
30
|
path / config["chia_ssl_ca"]["crt"],
|
|
31
31
|
path / config["chia_ssl_ca"]["key"],
|
chia/server/start_data_layer.py
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
+
import os
|
|
4
5
|
import pathlib
|
|
5
6
|
import sys
|
|
6
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Optional, cast
|
|
7
8
|
|
|
9
|
+
from chia.apis import ApiProtocolRegistry
|
|
8
10
|
from chia.data_layer.data_layer import DataLayer
|
|
9
11
|
from chia.data_layer.data_layer_api import DataLayerAPI
|
|
10
12
|
from chia.data_layer.data_layer_util import PluginRemote
|
|
@@ -18,22 +20,24 @@ from chia.ssl.create_ssl import create_all_ssl
|
|
|
18
20
|
from chia.types.aliases import DataLayerService, WalletService
|
|
19
21
|
from chia.util.chia_logging import initialize_logging
|
|
20
22
|
from chia.util.config import load_config, load_config_cli
|
|
21
|
-
from chia.util.default_root import
|
|
23
|
+
from chia.util.default_root import resolve_root_path
|
|
22
24
|
from chia.util.ints import uint16
|
|
25
|
+
from chia.util.task_timing import maybe_manage_task_instrumentation
|
|
23
26
|
|
|
24
27
|
# See: https://bugs.python.org/issue29288
|
|
25
28
|
"".encode("idna")
|
|
26
29
|
|
|
27
30
|
SERVICE_NAME = "data_layer"
|
|
31
|
+
|
|
28
32
|
log = logging.getLogger(__name__)
|
|
29
33
|
|
|
30
34
|
|
|
31
35
|
# TODO: Review need for config and if retained then hint it properly.
|
|
32
36
|
def create_data_layer_service(
|
|
33
37
|
root_path: pathlib.Path,
|
|
34
|
-
config:
|
|
35
|
-
downloaders:
|
|
36
|
-
uploaders:
|
|
38
|
+
config: dict[str, Any],
|
|
39
|
+
downloaders: list[PluginRemote],
|
|
40
|
+
uploaders: list[PluginRemote], # dont add FilesystemUploader to this, it is the default uploader
|
|
37
41
|
wallet_service: Optional[WalletService] = None,
|
|
38
42
|
connect_to_daemon: bool = True,
|
|
39
43
|
) -> DataLayerService:
|
|
@@ -41,7 +45,11 @@ def create_data_layer_service(
|
|
|
41
45
|
uploaders = []
|
|
42
46
|
if downloaders is None:
|
|
43
47
|
downloaders = []
|
|
48
|
+
|
|
44
49
|
service_config = config[SERVICE_NAME]
|
|
50
|
+
|
|
51
|
+
network_id = service_config["selected_network"]
|
|
52
|
+
|
|
45
53
|
self_hostname = config["self_hostname"]
|
|
46
54
|
wallet_rpc_port = service_config["wallet_peer"]["port"]
|
|
47
55
|
if wallet_service is None:
|
|
@@ -52,26 +60,26 @@ def create_data_layer_service(
|
|
|
52
60
|
wallet_config = wallet_service.config
|
|
53
61
|
wallet_rpc_init = WalletRpcClient.create(self_hostname, uint16(wallet_rpc_port), wallet_root_path, wallet_config)
|
|
54
62
|
|
|
55
|
-
|
|
63
|
+
# dont add Fil)
|
|
64
|
+
node = DataLayer.create(
|
|
56
65
|
config=service_config,
|
|
57
66
|
root_path=root_path,
|
|
58
67
|
wallet_rpc_init=wallet_rpc_init,
|
|
59
68
|
downloaders=downloaders,
|
|
60
69
|
uploaders=uploaders,
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
rpc_port = service_config.get("rpc_port")
|
|
70
|
+
)
|
|
71
|
+
peer_api = DataLayerAPI(node)
|
|
72
|
+
|
|
65
73
|
rpc_info: Optional[RpcInfo[DataLayerRpcApi]] = None
|
|
66
|
-
if
|
|
74
|
+
if service_config.get("start_rpc_server", True):
|
|
67
75
|
rpc_info = (DataLayerRpcApi, cast(int, service_config["rpc_port"]))
|
|
68
76
|
|
|
69
77
|
return Service(
|
|
70
78
|
root_path=root_path,
|
|
71
79
|
config=config,
|
|
72
|
-
node=
|
|
80
|
+
node=node,
|
|
73
81
|
# TODO: not for peers...
|
|
74
|
-
peer_api=
|
|
82
|
+
peer_api=peer_api,
|
|
75
83
|
node_type=NodeType.DATA_LAYER,
|
|
76
84
|
advertised_port=None,
|
|
77
85
|
service_name=SERVICE_NAME,
|
|
@@ -79,34 +87,35 @@ def create_data_layer_service(
|
|
|
79
87
|
max_request_body_size=service_config.get("rpc_server_max_request_body_size", 26214400),
|
|
80
88
|
rpc_info=rpc_info,
|
|
81
89
|
connect_to_daemon=connect_to_daemon,
|
|
90
|
+
class_for_type=ApiProtocolRegistry,
|
|
82
91
|
)
|
|
83
92
|
|
|
84
93
|
|
|
85
|
-
async def async_main() -> int:
|
|
94
|
+
async def async_main(root_path: pathlib.Path) -> int:
|
|
86
95
|
# TODO: refactor to avoid the double load
|
|
87
|
-
config = load_config(
|
|
88
|
-
service_config = load_config_cli(
|
|
96
|
+
config = load_config(root_path, "config.yaml", fill_missing_services=True)
|
|
97
|
+
service_config = load_config_cli(root_path, "config.yaml", SERVICE_NAME, fill_missing_services=True)
|
|
89
98
|
config[SERVICE_NAME] = service_config
|
|
90
99
|
initialize_logging(
|
|
91
100
|
service_name=SERVICE_NAME,
|
|
92
101
|
logging_config=service_config["logging"],
|
|
93
|
-
root_path=
|
|
102
|
+
root_path=root_path,
|
|
94
103
|
)
|
|
95
104
|
|
|
96
105
|
create_all_ssl(
|
|
97
|
-
root_path=
|
|
106
|
+
root_path=root_path,
|
|
98
107
|
private_node_names=["data_layer"],
|
|
99
108
|
public_node_names=["data_layer"],
|
|
100
109
|
overwrite=False,
|
|
101
110
|
)
|
|
102
111
|
|
|
103
112
|
plugins_config = config["data_layer"].get("plugins", {})
|
|
104
|
-
service_dir =
|
|
113
|
+
service_dir = root_path / SERVICE_NAME
|
|
105
114
|
|
|
106
115
|
old_uploaders = config["data_layer"].get("uploaders", [])
|
|
107
116
|
new_uploaders = plugins_config.get("uploaders", [])
|
|
108
117
|
conf_file_uploaders = await load_plugin_configurations(service_dir, "uploaders", log)
|
|
109
|
-
uploaders:
|
|
118
|
+
uploaders: list[PluginRemote] = [
|
|
110
119
|
*(PluginRemote(url=url) for url in old_uploaders),
|
|
111
120
|
*(PluginRemote.unmarshal(marshalled=marshalled) for marshalled in new_uploaders),
|
|
112
121
|
*conf_file_uploaders,
|
|
@@ -115,13 +124,13 @@ async def async_main() -> int:
|
|
|
115
124
|
old_downloaders = config["data_layer"].get("downloaders", [])
|
|
116
125
|
new_downloaders = plugins_config.get("downloaders", [])
|
|
117
126
|
conf_file_uploaders = await load_plugin_configurations(service_dir, "downloaders", log)
|
|
118
|
-
downloaders:
|
|
127
|
+
downloaders: list[PluginRemote] = [
|
|
119
128
|
*(PluginRemote(url=url) for url in old_downloaders),
|
|
120
129
|
*(PluginRemote.unmarshal(marshalled=marshalled) for marshalled in new_downloaders),
|
|
121
130
|
*conf_file_uploaders,
|
|
122
131
|
]
|
|
123
132
|
|
|
124
|
-
service = create_data_layer_service(
|
|
133
|
+
service = create_data_layer_service(root_path, config, downloaders, uploaders)
|
|
125
134
|
async with SignalHandlers.manage() as signal_handlers:
|
|
126
135
|
await service.setup_process_global_state(signal_handlers=signal_handlers)
|
|
127
136
|
await service.run()
|
|
@@ -130,7 +139,12 @@ async def async_main() -> int:
|
|
|
130
139
|
|
|
131
140
|
|
|
132
141
|
def main() -> int:
|
|
133
|
-
|
|
142
|
+
root_path = resolve_root_path(override=None)
|
|
143
|
+
|
|
144
|
+
with maybe_manage_task_instrumentation(
|
|
145
|
+
enable=os.environ.get(f"CHIA_INSTRUMENT_{SERVICE_NAME.upper()}") is not None
|
|
146
|
+
):
|
|
147
|
+
return async_run(coro=async_main(root_path=root_path))
|
|
134
148
|
|
|
135
149
|
|
|
136
150
|
if __name__ == "__main__":
|
chia/server/start_farmer.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
import pathlib
|
|
4
5
|
import sys
|
|
5
|
-
from typing import Any,
|
|
6
|
+
from typing import Any, Optional
|
|
6
7
|
|
|
8
|
+
from chia.apis import ApiProtocolRegistry
|
|
7
9
|
from chia.consensus.constants import ConsensusConstants, replace_str_to_bytes
|
|
8
10
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS, update_testnet_overrides
|
|
9
11
|
from chia.farmer.farmer import Farmer
|
|
@@ -15,8 +17,9 @@ from chia.server.start_service import RpcInfo, Service, async_run
|
|
|
15
17
|
from chia.types.aliases import FarmerService
|
|
16
18
|
from chia.util.chia_logging import initialize_service_logging
|
|
17
19
|
from chia.util.config import get_unresolved_peer_infos, load_config, load_config_cli
|
|
18
|
-
from chia.util.default_root import
|
|
20
|
+
from chia.util.default_root import resolve_root_path
|
|
19
21
|
from chia.util.keychain import Keychain
|
|
22
|
+
from chia.util.task_timing import maybe_manage_task_instrumentation
|
|
20
23
|
|
|
21
24
|
# See: https://bugs.python.org/issue29288
|
|
22
25
|
"".encode("idna")
|
|
@@ -26,8 +29,8 @@ SERVICE_NAME = "farmer"
|
|
|
26
29
|
|
|
27
30
|
def create_farmer_service(
|
|
28
31
|
root_path: pathlib.Path,
|
|
29
|
-
config:
|
|
30
|
-
config_pool:
|
|
32
|
+
config: dict[str, Any],
|
|
33
|
+
config_pool: dict[str, Any],
|
|
31
34
|
consensus_constants: ConsensusConstants,
|
|
32
35
|
keychain: Optional[Keychain] = None,
|
|
33
36
|
connect_to_daemon: bool = True,
|
|
@@ -39,38 +42,42 @@ def create_farmer_service(
|
|
|
39
42
|
update_testnet_overrides(network_id, overrides)
|
|
40
43
|
updated_constants = replace_str_to_bytes(consensus_constants, **overrides)
|
|
41
44
|
|
|
42
|
-
|
|
45
|
+
node = Farmer(
|
|
43
46
|
root_path, service_config, config_pool, consensus_constants=updated_constants, local_keychain=keychain
|
|
44
47
|
)
|
|
45
|
-
peer_api = FarmerAPI(
|
|
48
|
+
peer_api = FarmerAPI(node)
|
|
49
|
+
|
|
46
50
|
rpc_info: Optional[RpcInfo[FarmerRpcApi]] = None
|
|
47
|
-
if service_config
|
|
51
|
+
if service_config.get("start_rpc_server", True):
|
|
48
52
|
rpc_info = (FarmerRpcApi, service_config["rpc_port"])
|
|
53
|
+
|
|
49
54
|
return Service(
|
|
50
55
|
root_path=root_path,
|
|
51
56
|
config=config,
|
|
52
|
-
node=
|
|
57
|
+
node=node,
|
|
53
58
|
peer_api=peer_api,
|
|
54
59
|
node_type=NodeType.FARMER,
|
|
55
60
|
advertised_port=service_config["port"],
|
|
56
61
|
service_name=SERVICE_NAME,
|
|
57
62
|
connect_peers=get_unresolved_peer_infos(service_config, NodeType.FULL_NODE),
|
|
58
|
-
on_connect_callback=
|
|
63
|
+
on_connect_callback=node.on_connect,
|
|
59
64
|
network_id=network_id,
|
|
60
65
|
rpc_info=rpc_info,
|
|
61
66
|
connect_to_daemon=connect_to_daemon,
|
|
67
|
+
class_for_type=ApiProtocolRegistry,
|
|
62
68
|
)
|
|
63
69
|
|
|
64
70
|
|
|
65
|
-
async def async_main() -> int:
|
|
71
|
+
async def async_main(root_path: pathlib.Path) -> int:
|
|
66
72
|
# TODO: refactor to avoid the double load
|
|
67
|
-
config = load_config(
|
|
68
|
-
service_config = load_config_cli(
|
|
73
|
+
config = load_config(root_path, "config.yaml")
|
|
74
|
+
service_config = load_config_cli(root_path, "config.yaml", SERVICE_NAME)
|
|
69
75
|
config[SERVICE_NAME] = service_config
|
|
70
|
-
config_pool = load_config_cli(
|
|
76
|
+
config_pool = load_config_cli(root_path, "config.yaml", "pool")
|
|
71
77
|
config["pool"] = config_pool
|
|
72
|
-
initialize_service_logging(service_name=SERVICE_NAME, config=config)
|
|
73
|
-
|
|
78
|
+
initialize_service_logging(service_name=SERVICE_NAME, config=config, root_path=root_path)
|
|
79
|
+
|
|
80
|
+
service = create_farmer_service(root_path, config, config_pool, DEFAULT_CONSTANTS)
|
|
74
81
|
async with SignalHandlers.manage() as signal_handlers:
|
|
75
82
|
await service.setup_process_global_state(signal_handlers=signal_handlers)
|
|
76
83
|
await service.run()
|
|
@@ -79,7 +86,12 @@ async def async_main() -> int:
|
|
|
79
86
|
|
|
80
87
|
|
|
81
88
|
def main() -> int:
|
|
82
|
-
|
|
89
|
+
root_path = resolve_root_path(override=None)
|
|
90
|
+
|
|
91
|
+
with maybe_manage_task_instrumentation(
|
|
92
|
+
enable=os.environ.get(f"CHIA_INSTRUMENT_{SERVICE_NAME.upper()}") is not None
|
|
93
|
+
):
|
|
94
|
+
return async_run(coro=async_main(root_path=root_path))
|
|
83
95
|
|
|
84
96
|
|
|
85
97
|
if __name__ == "__main__":
|
chia/server/start_full_node.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import logging
|
|
4
3
|
import os
|
|
5
4
|
import pathlib
|
|
6
5
|
import sys
|
|
7
6
|
from multiprocessing import freeze_support
|
|
8
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Optional
|
|
9
8
|
|
|
9
|
+
from chia.apis import ApiProtocolRegistry
|
|
10
10
|
from chia.consensus.constants import ConsensusConstants, replace_str_to_bytes
|
|
11
11
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS, update_testnet_overrides
|
|
12
12
|
from chia.full_node.full_node import FullNode
|
|
@@ -18,7 +18,7 @@ from chia.server.start_service import RpcInfo, Service, async_run
|
|
|
18
18
|
from chia.types.aliases import FullNodeService
|
|
19
19
|
from chia.util.chia_logging import initialize_service_logging
|
|
20
20
|
from chia.util.config import get_unresolved_peer_infos, load_config, load_config_cli
|
|
21
|
-
from chia.util.default_root import
|
|
21
|
+
from chia.util.default_root import resolve_root_path
|
|
22
22
|
from chia.util.ints import uint16
|
|
23
23
|
from chia.util.task_timing import maybe_manage_task_instrumentation
|
|
24
24
|
|
|
@@ -26,60 +26,63 @@ from chia.util.task_timing import maybe_manage_task_instrumentation
|
|
|
26
26
|
"".encode("idna")
|
|
27
27
|
|
|
28
28
|
SERVICE_NAME = "full_node"
|
|
29
|
-
log = logging.getLogger(__name__)
|
|
30
29
|
|
|
31
30
|
|
|
32
31
|
async def create_full_node_service(
|
|
33
32
|
root_path: pathlib.Path,
|
|
34
|
-
config:
|
|
33
|
+
config: dict[str, Any],
|
|
35
34
|
consensus_constants: ConsensusConstants,
|
|
36
35
|
connect_to_daemon: bool = True,
|
|
37
|
-
override_capabilities: Optional[
|
|
36
|
+
override_capabilities: Optional[list[tuple[uint16, str]]] = None,
|
|
38
37
|
) -> FullNodeService:
|
|
39
38
|
service_config = config[SERVICE_NAME]
|
|
40
39
|
|
|
41
|
-
|
|
40
|
+
network_id = service_config["selected_network"]
|
|
41
|
+
upnp_list = []
|
|
42
|
+
if service_config["enable_upnp"]:
|
|
43
|
+
upnp_list = [service_config["port"]]
|
|
44
|
+
|
|
45
|
+
node = await FullNode.create(
|
|
42
46
|
service_config,
|
|
43
47
|
root_path=root_path,
|
|
44
48
|
consensus_constants=consensus_constants,
|
|
45
49
|
)
|
|
46
|
-
|
|
50
|
+
peer_api = FullNodeAPI(node)
|
|
47
51
|
|
|
48
|
-
upnp_list = []
|
|
49
|
-
if service_config["enable_upnp"]:
|
|
50
|
-
upnp_list = [service_config["port"]]
|
|
51
|
-
network_id = service_config["selected_network"]
|
|
52
52
|
rpc_info: Optional[RpcInfo[FullNodeRpcApi]] = None
|
|
53
|
-
if service_config
|
|
53
|
+
if service_config.get("start_rpc_server", True):
|
|
54
54
|
rpc_info = (FullNodeRpcApi, service_config["rpc_port"])
|
|
55
|
+
|
|
55
56
|
return Service(
|
|
56
57
|
root_path=root_path,
|
|
57
58
|
config=config,
|
|
58
|
-
node=
|
|
59
|
-
peer_api=
|
|
59
|
+
node=node,
|
|
60
|
+
peer_api=peer_api,
|
|
60
61
|
node_type=NodeType.FULL_NODE,
|
|
61
62
|
advertised_port=service_config["port"],
|
|
62
63
|
service_name=SERVICE_NAME,
|
|
63
64
|
upnp_ports=upnp_list,
|
|
64
65
|
connect_peers=get_unresolved_peer_infos(service_config, NodeType.FULL_NODE),
|
|
65
|
-
on_connect_callback=
|
|
66
|
+
on_connect_callback=node.on_connect,
|
|
66
67
|
network_id=network_id,
|
|
67
68
|
rpc_info=rpc_info,
|
|
68
69
|
connect_to_daemon=connect_to_daemon,
|
|
69
70
|
override_capabilities=override_capabilities,
|
|
71
|
+
class_for_type=ApiProtocolRegistry,
|
|
70
72
|
)
|
|
71
73
|
|
|
72
74
|
|
|
73
|
-
async def async_main(service_config:
|
|
75
|
+
async def async_main(service_config: dict[str, Any], root_path: pathlib.Path) -> int:
|
|
74
76
|
# TODO: refactor to avoid the double load
|
|
75
|
-
config = load_config(
|
|
77
|
+
config = load_config(root_path, "config.yaml")
|
|
76
78
|
config[SERVICE_NAME] = service_config
|
|
77
79
|
network_id = service_config["selected_network"]
|
|
78
80
|
overrides = service_config["network_overrides"]["constants"][network_id]
|
|
79
81
|
update_testnet_overrides(network_id, overrides)
|
|
80
82
|
updated_constants = replace_str_to_bytes(DEFAULT_CONSTANTS, **overrides)
|
|
81
|
-
initialize_service_logging(service_name=SERVICE_NAME, config=config)
|
|
82
|
-
|
|
83
|
+
initialize_service_logging(service_name=SERVICE_NAME, config=config, root_path=root_path)
|
|
84
|
+
|
|
85
|
+
service = await create_full_node_service(root_path, config, updated_constants)
|
|
83
86
|
async with SignalHandlers.manage() as signal_handlers:
|
|
84
87
|
await service.setup_process_global_state(signal_handlers=signal_handlers)
|
|
85
88
|
await service.run()
|
|
@@ -89,9 +92,12 @@ async def async_main(service_config: Dict[str, Any]) -> int:
|
|
|
89
92
|
|
|
90
93
|
def main() -> int:
|
|
91
94
|
freeze_support()
|
|
95
|
+
root_path = resolve_root_path(override=None)
|
|
92
96
|
|
|
93
|
-
with maybe_manage_task_instrumentation(
|
|
94
|
-
|
|
97
|
+
with maybe_manage_task_instrumentation(
|
|
98
|
+
enable=os.environ.get(f"CHIA_INSTRUMENT_{SERVICE_NAME.upper()}") is not None
|
|
99
|
+
):
|
|
100
|
+
service_config = load_config_cli(root_path, "config.yaml", SERVICE_NAME)
|
|
95
101
|
target_peer_count = service_config.get("target_peer_count", 40) - service_config.get(
|
|
96
102
|
"target_outbound_peer_count", 8
|
|
97
103
|
)
|
|
@@ -99,7 +105,7 @@ def main() -> int:
|
|
|
99
105
|
target_peer_count = None
|
|
100
106
|
if not service_config.get("use_chia_loop_policy", True):
|
|
101
107
|
target_peer_count = None
|
|
102
|
-
return async_run(coro=async_main(service_config), connection_limit=target_peer_count)
|
|
108
|
+
return async_run(coro=async_main(service_config, root_path=root_path), connection_limit=target_peer_count)
|
|
103
109
|
|
|
104
110
|
|
|
105
111
|
if __name__ == "__main__":
|
chia/server/start_harvester.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
import pathlib
|
|
4
5
|
import sys
|
|
5
|
-
from typing import Any,
|
|
6
|
+
from typing import Any, Optional
|
|
6
7
|
|
|
8
|
+
from chia.apis import ApiProtocolRegistry
|
|
7
9
|
from chia.consensus.constants import ConsensusConstants, replace_str_to_bytes
|
|
8
10
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
9
11
|
from chia.harvester.harvester import Harvester
|
|
@@ -16,7 +18,8 @@ from chia.types.aliases import HarvesterService
|
|
|
16
18
|
from chia.types.peer_info import UnresolvedPeerInfo
|
|
17
19
|
from chia.util.chia_logging import initialize_service_logging
|
|
18
20
|
from chia.util.config import get_unresolved_peer_infos, load_config, load_config_cli
|
|
19
|
-
from chia.util.default_root import
|
|
21
|
+
from chia.util.default_root import resolve_root_path
|
|
22
|
+
from chia.util.task_timing import maybe_manage_task_instrumentation
|
|
20
23
|
|
|
21
24
|
# See: https://bugs.python.org/issue29288
|
|
22
25
|
"".encode("idna")
|
|
@@ -26,26 +29,29 @@ SERVICE_NAME = "harvester"
|
|
|
26
29
|
|
|
27
30
|
def create_harvester_service(
|
|
28
31
|
root_path: pathlib.Path,
|
|
29
|
-
config:
|
|
32
|
+
config: dict[str, Any],
|
|
30
33
|
consensus_constants: ConsensusConstants,
|
|
31
|
-
farmer_peers:
|
|
34
|
+
farmer_peers: set[UnresolvedPeerInfo],
|
|
32
35
|
connect_to_daemon: bool = True,
|
|
33
36
|
) -> HarvesterService:
|
|
34
37
|
service_config = config[SERVICE_NAME]
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
network_id = service_config["selected_network"]
|
|
40
|
+
overrides = service_config["network_overrides"]["constants"][network_id]
|
|
37
41
|
updated_constants = replace_str_to_bytes(consensus_constants, **overrides)
|
|
38
42
|
|
|
39
|
-
|
|
40
|
-
peer_api = HarvesterAPI(
|
|
43
|
+
node = Harvester(root_path, service_config, updated_constants)
|
|
44
|
+
peer_api = HarvesterAPI(node)
|
|
41
45
|
network_id = service_config["selected_network"]
|
|
46
|
+
|
|
42
47
|
rpc_info: Optional[RpcInfo[HarvesterRpcApi]] = None
|
|
43
|
-
if service_config
|
|
48
|
+
if service_config.get("start_rpc_server", True):
|
|
44
49
|
rpc_info = (HarvesterRpcApi, service_config["rpc_port"])
|
|
50
|
+
|
|
45
51
|
return Service(
|
|
46
52
|
root_path=root_path,
|
|
47
53
|
config=config,
|
|
48
|
-
node=
|
|
54
|
+
node=node,
|
|
49
55
|
peer_api=peer_api,
|
|
50
56
|
node_type=NodeType.HARVESTER,
|
|
51
57
|
advertised_port=None,
|
|
@@ -54,17 +60,19 @@ def create_harvester_service(
|
|
|
54
60
|
network_id=network_id,
|
|
55
61
|
rpc_info=rpc_info,
|
|
56
62
|
connect_to_daemon=connect_to_daemon,
|
|
63
|
+
class_for_type=ApiProtocolRegistry,
|
|
57
64
|
)
|
|
58
65
|
|
|
59
66
|
|
|
60
|
-
async def async_main() -> int:
|
|
67
|
+
async def async_main(root_path: pathlib.Path) -> int:
|
|
61
68
|
# TODO: refactor to avoid the double load
|
|
62
|
-
config = load_config(
|
|
63
|
-
service_config = load_config_cli(
|
|
69
|
+
config = load_config(root_path, "config.yaml")
|
|
70
|
+
service_config = load_config_cli(root_path, "config.yaml", SERVICE_NAME)
|
|
64
71
|
config[SERVICE_NAME] = service_config
|
|
65
|
-
initialize_service_logging(service_name=SERVICE_NAME, config=config)
|
|
72
|
+
initialize_service_logging(service_name=SERVICE_NAME, config=config, root_path=root_path)
|
|
66
73
|
farmer_peers = get_unresolved_peer_infos(service_config, NodeType.FARMER)
|
|
67
|
-
|
|
74
|
+
|
|
75
|
+
service = create_harvester_service(root_path, config, DEFAULT_CONSTANTS, farmer_peers)
|
|
68
76
|
async with SignalHandlers.manage() as signal_handlers:
|
|
69
77
|
await service.setup_process_global_state(signal_handlers=signal_handlers)
|
|
70
78
|
await service.run()
|
|
@@ -73,7 +81,12 @@ async def async_main() -> int:
|
|
|
73
81
|
|
|
74
82
|
|
|
75
83
|
def main() -> int:
|
|
76
|
-
|
|
84
|
+
root_path = resolve_root_path(override=None)
|
|
85
|
+
|
|
86
|
+
with maybe_manage_task_instrumentation(
|
|
87
|
+
enable=os.environ.get(f"CHIA_INSTRUMENT_{SERVICE_NAME.upper()}") is not None
|
|
88
|
+
):
|
|
89
|
+
return async_run(coro=async_main(root_path=root_path))
|
|
77
90
|
|
|
78
91
|
|
|
79
92
|
if __name__ == "__main__":
|
chia/server/start_introducer.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
import pathlib
|
|
4
5
|
import sys
|
|
5
|
-
from typing import Any,
|
|
6
|
+
from typing import Any, Optional
|
|
6
7
|
|
|
8
|
+
from chia.apis import ApiProtocolRegistry
|
|
7
9
|
from chia.introducer.introducer import Introducer
|
|
8
10
|
from chia.introducer.introducer_api import IntroducerAPI
|
|
9
11
|
from chia.server.outbound_message import NodeType
|
|
@@ -12,7 +14,8 @@ from chia.server.start_service import Service, async_run
|
|
|
12
14
|
from chia.types.aliases import IntroducerService
|
|
13
15
|
from chia.util.chia_logging import initialize_service_logging
|
|
14
16
|
from chia.util.config import load_config, load_config_cli
|
|
15
|
-
from chia.util.default_root import
|
|
17
|
+
from chia.util.default_root import resolve_root_path
|
|
18
|
+
from chia.util.task_timing import maybe_manage_task_instrumentation
|
|
16
19
|
|
|
17
20
|
# See: https://bugs.python.org/issue29288
|
|
18
21
|
"".encode("idna")
|
|
@@ -22,38 +25,42 @@ SERVICE_NAME = "introducer"
|
|
|
22
25
|
|
|
23
26
|
def create_introducer_service(
|
|
24
27
|
root_path: pathlib.Path,
|
|
25
|
-
config:
|
|
28
|
+
config: dict[str, Any],
|
|
26
29
|
advertised_port: Optional[int] = None,
|
|
27
30
|
connect_to_daemon: bool = True,
|
|
28
31
|
) -> IntroducerService:
|
|
29
32
|
service_config = config[SERVICE_NAME]
|
|
30
33
|
|
|
34
|
+
network_id = service_config["selected_network"]
|
|
35
|
+
|
|
31
36
|
if advertised_port is None:
|
|
32
37
|
advertised_port = service_config["port"]
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
node = Introducer(service_config["max_peers_to_send"], service_config["recent_peer_threshold"])
|
|
40
|
+
peer_api = IntroducerAPI(node)
|
|
41
|
+
|
|
37
42
|
return Service(
|
|
38
43
|
root_path=root_path,
|
|
39
44
|
config=config,
|
|
40
|
-
node=
|
|
41
|
-
peer_api=
|
|
45
|
+
node=node,
|
|
46
|
+
peer_api=peer_api,
|
|
42
47
|
node_type=NodeType.INTRODUCER,
|
|
48
|
+
advertised_port=advertised_port,
|
|
43
49
|
service_name=SERVICE_NAME,
|
|
44
50
|
network_id=network_id,
|
|
45
|
-
advertised_port=advertised_port,
|
|
46
51
|
connect_to_daemon=connect_to_daemon,
|
|
52
|
+
class_for_type=ApiProtocolRegistry,
|
|
47
53
|
)
|
|
48
54
|
|
|
49
55
|
|
|
50
|
-
async def async_main() -> int:
|
|
56
|
+
async def async_main(root_path: pathlib.Path) -> int:
|
|
51
57
|
# TODO: refactor to avoid the double load
|
|
52
|
-
config = load_config(
|
|
53
|
-
service_config = load_config_cli(
|
|
58
|
+
config = load_config(root_path, "config.yaml")
|
|
59
|
+
service_config = load_config_cli(root_path, "config.yaml", SERVICE_NAME)
|
|
54
60
|
config[SERVICE_NAME] = service_config
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
initialize_service_logging(service_name=SERVICE_NAME, config=config, root_path=root_path)
|
|
62
|
+
|
|
63
|
+
service = create_introducer_service(root_path, config)
|
|
57
64
|
async with SignalHandlers.manage() as signal_handlers:
|
|
58
65
|
await service.setup_process_global_state(signal_handlers=signal_handlers)
|
|
59
66
|
await service.run()
|
|
@@ -62,7 +69,12 @@ async def async_main() -> int:
|
|
|
62
69
|
|
|
63
70
|
|
|
64
71
|
def main() -> int:
|
|
65
|
-
|
|
72
|
+
root_path = resolve_root_path(override=None)
|
|
73
|
+
|
|
74
|
+
with maybe_manage_task_instrumentation(
|
|
75
|
+
enable=os.environ.get(f"CHIA_INSTRUMENT_{SERVICE_NAME.upper()}") is not None
|
|
76
|
+
):
|
|
77
|
+
return async_run(coro=async_main(root_path=root_path))
|
|
66
78
|
|
|
67
79
|
|
|
68
80
|
if __name__ == "__main__":
|