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/harvester/harvester_api.py
CHANGED
|
@@ -4,7 +4,7 @@ import asyncio
|
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import TYPE_CHECKING, ClassVar, Optional, cast
|
|
8
8
|
|
|
9
9
|
from chia_rs import AugSchemeMPL, G1Element, G2Element
|
|
10
10
|
|
|
@@ -15,6 +15,7 @@ from chia.protocols import harvester_protocol
|
|
|
15
15
|
from chia.protocols.farmer_protocol import FarmingInfo
|
|
16
16
|
from chia.protocols.harvester_protocol import Plot, PlotSyncResponse
|
|
17
17
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
18
|
+
from chia.server.api_protocol import ApiMetadata
|
|
18
19
|
from chia.server.outbound_message import Message, make_msg
|
|
19
20
|
from chia.server.ws_connection import WSChiaConnection
|
|
20
21
|
from chia.types.blockchain_format.proof_of_space import (
|
|
@@ -24,14 +25,19 @@ from chia.types.blockchain_format.proof_of_space import (
|
|
|
24
25
|
passes_plot_filter,
|
|
25
26
|
)
|
|
26
27
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
27
|
-
from chia.util.api_decorators import api_request
|
|
28
28
|
from chia.util.ints import uint8, uint32, uint64
|
|
29
29
|
from chia.wallet.derive_keys import master_sk_to_local_sk
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class HarvesterAPI:
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from chia.server.api_protocol import ApiProtocol
|
|
35
|
+
|
|
36
|
+
_protocol_check: ClassVar[ApiProtocol] = cast("HarvesterAPI", None)
|
|
37
|
+
|
|
33
38
|
log: logging.Logger
|
|
34
39
|
harvester: Harvester
|
|
40
|
+
metadata: ClassVar[ApiMetadata] = ApiMetadata()
|
|
35
41
|
|
|
36
42
|
def __init__(self, harvester: Harvester):
|
|
37
43
|
self.log = logging.getLogger(__name__)
|
|
@@ -40,7 +46,7 @@ class HarvesterAPI:
|
|
|
40
46
|
def ready(self) -> bool:
|
|
41
47
|
return True
|
|
42
48
|
|
|
43
|
-
@
|
|
49
|
+
@metadata.request(peer_required=True)
|
|
44
50
|
async def harvester_handshake(
|
|
45
51
|
self, harvester_handshake: harvester_protocol.HarvesterHandshake, peer: WSChiaConnection
|
|
46
52
|
) -> None:
|
|
@@ -56,7 +62,7 @@ class HarvesterAPI:
|
|
|
56
62
|
await self.harvester.plot_sync_sender.start()
|
|
57
63
|
self.harvester.plot_manager.start_refreshing()
|
|
58
64
|
|
|
59
|
-
@
|
|
65
|
+
@metadata.request(peer_required=True)
|
|
60
66
|
async def new_signage_point_harvester(
|
|
61
67
|
self, new_challenge: harvester_protocol.NewSignagePointHarvester, peer: WSChiaConnection
|
|
62
68
|
) -> None:
|
|
@@ -87,7 +93,7 @@ class HarvesterAPI:
|
|
|
87
93
|
|
|
88
94
|
loop = asyncio.get_running_loop()
|
|
89
95
|
|
|
90
|
-
def blocking_lookup(filename: Path, plot_info: PlotInfo) ->
|
|
96
|
+
def blocking_lookup(filename: Path, plot_info: PlotInfo) -> list[tuple[bytes32, ProofOfSpace]]:
|
|
91
97
|
# Uses the DiskProver object to lookup qualities. This is a blocking call,
|
|
92
98
|
# so it should be run in a thread pool.
|
|
93
99
|
try:
|
|
@@ -123,7 +129,7 @@ class HarvesterAPI:
|
|
|
123
129
|
)
|
|
124
130
|
return []
|
|
125
131
|
|
|
126
|
-
responses:
|
|
132
|
+
responses: list[tuple[bytes32, ProofOfSpace]] = []
|
|
127
133
|
if quality_strings is not None:
|
|
128
134
|
difficulty = new_challenge.difficulty
|
|
129
135
|
sub_slot_iters = new_challenge.sub_slot_iters
|
|
@@ -205,12 +211,12 @@ class HarvesterAPI:
|
|
|
205
211
|
|
|
206
212
|
async def lookup_challenge(
|
|
207
213
|
filename: Path, plot_info: PlotInfo
|
|
208
|
-
) ->
|
|
214
|
+
) -> tuple[Path, list[harvester_protocol.NewProofOfSpace]]:
|
|
209
215
|
# Executes a DiskProverLookup in a thread pool, and returns responses
|
|
210
|
-
all_responses:
|
|
216
|
+
all_responses: list[harvester_protocol.NewProofOfSpace] = []
|
|
211
217
|
if self.harvester._shut_down:
|
|
212
218
|
return filename, []
|
|
213
|
-
proofs_of_space_and_q:
|
|
219
|
+
proofs_of_space_and_q: list[tuple[bytes32, ProofOfSpace]] = await loop.run_in_executor(
|
|
214
220
|
self.harvester.executor, blocking_lookup, filename, plot_info
|
|
215
221
|
)
|
|
216
222
|
for quality_str, proof_of_space in proofs_of_space_and_q:
|
|
@@ -296,7 +302,7 @@ class HarvesterAPI:
|
|
|
296
302
|
},
|
|
297
303
|
)
|
|
298
304
|
|
|
299
|
-
@
|
|
305
|
+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_signatures])
|
|
300
306
|
async def request_signatures(self, request: harvester_protocol.RequestSignatures) -> Optional[Message]:
|
|
301
307
|
"""
|
|
302
308
|
The farmer requests a signature on the header hash, for one of the proofs that we found.
|
|
@@ -329,7 +335,7 @@ class HarvesterAPI:
|
|
|
329
335
|
|
|
330
336
|
# This is only a partial signature. When combined with the farmer's half, it will
|
|
331
337
|
# form a complete PrependSignature.
|
|
332
|
-
message_signatures:
|
|
338
|
+
message_signatures: list[tuple[bytes32, G2Element]] = []
|
|
333
339
|
for message in request.messages:
|
|
334
340
|
signature: G2Element = AugSchemeMPL.sign(local_sk, message, agg_pk)
|
|
335
341
|
message_signatures.append((message, signature))
|
|
@@ -347,7 +353,7 @@ class HarvesterAPI:
|
|
|
347
353
|
|
|
348
354
|
return make_msg(ProtocolMessageTypes.respond_signatures, response)
|
|
349
355
|
|
|
350
|
-
@
|
|
356
|
+
@metadata.request()
|
|
351
357
|
async def request_plots(self, _: harvester_protocol.RequestPlots) -> Message:
|
|
352
358
|
plots_response = []
|
|
353
359
|
plots, failed_to_open_filenames, no_key_filenames = self.harvester.get_plots()
|
|
@@ -369,6 +375,6 @@ class HarvesterAPI:
|
|
|
369
375
|
response = harvester_protocol.RespondPlots(plots_response, failed_to_open_filenames, no_key_filenames)
|
|
370
376
|
return make_msg(ProtocolMessageTypes.respond_plots, response)
|
|
371
377
|
|
|
372
|
-
@
|
|
378
|
+
@metadata.request()
|
|
373
379
|
async def plot_sync_response(self, response: PlotSyncResponse) -> None:
|
|
374
380
|
self.harvester.plot_sync_sender.set_response(response)
|
chia/introducer/introducer.py
CHANGED
|
@@ -4,7 +4,8 @@ import asyncio
|
|
|
4
4
|
import contextlib
|
|
5
5
|
import logging
|
|
6
6
|
import time
|
|
7
|
-
from
|
|
7
|
+
from collections.abc import AsyncIterator
|
|
8
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
8
9
|
|
|
9
10
|
from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
|
|
10
11
|
from chia.server.introducer_peers import VettedPeer
|
|
@@ -12,6 +13,7 @@ from chia.server.outbound_message import NodeType
|
|
|
12
13
|
from chia.server.server import ChiaServer
|
|
13
14
|
from chia.server.ws_connection import WSChiaConnection
|
|
14
15
|
from chia.util.ints import uint64
|
|
16
|
+
from chia.util.task_referencer import create_referenced_task
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
class Introducer:
|
|
@@ -38,7 +40,7 @@ class Introducer:
|
|
|
38
40
|
|
|
39
41
|
@contextlib.asynccontextmanager
|
|
40
42
|
async def manage(self) -> AsyncIterator[None]:
|
|
41
|
-
self._vetting_task =
|
|
43
|
+
self._vetting_task = create_referenced_task(self._vetting_loop())
|
|
42
44
|
try:
|
|
43
45
|
yield
|
|
44
46
|
finally:
|
|
@@ -53,7 +55,7 @@ class Introducer:
|
|
|
53
55
|
# TODO: fill this out?
|
|
54
56
|
pass
|
|
55
57
|
|
|
56
|
-
def get_connections(self, request_node_type: Optional[NodeType]) ->
|
|
58
|
+
def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
57
59
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
58
60
|
|
|
59
61
|
def set_server(self, server: ChiaServer):
|
|
@@ -99,13 +101,13 @@ class Introducer:
|
|
|
99
101
|
peer.last_attempt = uint64(time.time())
|
|
100
102
|
|
|
101
103
|
self.log.info(f"Vetting peer {peer.host} {peer.port}")
|
|
102
|
-
|
|
104
|
+
_r, w = await asyncio.wait_for(
|
|
103
105
|
asyncio.open_connection(peer.host, int(peer.port)),
|
|
104
106
|
timeout=3,
|
|
105
107
|
)
|
|
106
108
|
w.close()
|
|
107
109
|
except Exception as e:
|
|
108
|
-
self.log.warning(f"Could not vet {peer}, removing. {type(e)}{
|
|
110
|
+
self.log.warning(f"Could not vet {peer}, removing. {type(e)}{e!s}")
|
|
109
111
|
peer.vetted = min(peer.vetted - 1, -1)
|
|
110
112
|
|
|
111
113
|
# if we have failed 6 times in a row, remove the peer
|
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Optional
|
|
4
|
+
from typing import TYPE_CHECKING, ClassVar, Optional, cast
|
|
5
5
|
|
|
6
6
|
from chia.introducer.introducer import Introducer
|
|
7
7
|
from chia.protocols.introducer_protocol import RequestPeersIntroducer, RespondPeersIntroducer
|
|
8
8
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
9
9
|
from chia.rpc.rpc_server import StateChangedProtocol
|
|
10
|
+
from chia.server.api_protocol import ApiMetadata
|
|
10
11
|
from chia.server.outbound_message import Message, make_msg
|
|
11
12
|
from chia.server.ws_connection import WSChiaConnection
|
|
12
13
|
from chia.types.peer_info import TimestampedPeerInfo
|
|
13
|
-
from chia.util.api_decorators import api_request
|
|
14
14
|
from chia.util.ints import uint64
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class IntroducerAPI:
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from chia.server.api_protocol import ApiProtocol
|
|
20
|
+
|
|
21
|
+
_protocol_check: ClassVar[ApiProtocol] = cast("IntroducerAPI", None)
|
|
22
|
+
|
|
18
23
|
log: logging.Logger
|
|
19
24
|
introducer: Introducer
|
|
25
|
+
metadata: ClassVar[ApiMetadata] = ApiMetadata()
|
|
20
26
|
|
|
21
27
|
def __init__(self, introducer) -> None:
|
|
22
28
|
self.log = logging.getLogger(__name__)
|
|
@@ -28,7 +34,7 @@ class IntroducerAPI:
|
|
|
28
34
|
def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
|
|
29
35
|
pass
|
|
30
36
|
|
|
31
|
-
@
|
|
37
|
+
@metadata.request(peer_required=True)
|
|
32
38
|
async def request_peers_introducer(
|
|
33
39
|
self,
|
|
34
40
|
request: RequestPeersIntroducer,
|
chia/legacy/keyring.py
CHANGED
|
@@ -6,7 +6,7 @@ helper it's required to install the `legacy_keyring` extra dependency which can
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
8
|
import sys
|
|
9
|
-
from typing import Callable,
|
|
9
|
+
from typing import Callable, Union, cast
|
|
10
10
|
|
|
11
11
|
import click
|
|
12
12
|
from chia_rs import G1Element
|
|
@@ -23,7 +23,6 @@ except ImportError:
|
|
|
23
23
|
CryptFileKeyring = None
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
from chia.cmds.cmds_util import prompt_yes_no
|
|
27
26
|
from chia.util.errors import KeychainUserNotFound
|
|
28
27
|
from chia.util.keychain import MAX_KEYS, KeyData, KeyDataSecrets, get_private_key_user
|
|
29
28
|
|
|
@@ -85,8 +84,8 @@ def get_key_data(keyring: LegacyKeyring, index: int) -> KeyData:
|
|
|
85
84
|
)
|
|
86
85
|
|
|
87
86
|
|
|
88
|
-
def get_keys(keyring: LegacyKeyring) ->
|
|
89
|
-
keys:
|
|
87
|
+
def get_keys(keyring: LegacyKeyring) -> list[KeyData]:
|
|
88
|
+
keys: list[KeyData] = []
|
|
90
89
|
for index in range(MAX_KEYS):
|
|
91
90
|
try:
|
|
92
91
|
keys.append(get_key_data(keyring, index))
|
|
@@ -144,7 +143,9 @@ def clear() -> None:
|
|
|
144
143
|
|
|
145
144
|
print_keys(keyring)
|
|
146
145
|
|
|
147
|
-
if not
|
|
146
|
+
if not click.confirm(
|
|
147
|
+
"\nDo you really want to remove all the keys from the legacy keyring? This can't be undone.", default=None
|
|
148
|
+
):
|
|
148
149
|
raise click.ClickException("Aborted!")
|
|
149
150
|
|
|
150
151
|
remove_keys(keyring)
|
chia/plot_sync/delta.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Union
|
|
5
5
|
|
|
6
6
|
from chia.protocols.harvester_protocol import Plot
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
@dataclass
|
|
10
10
|
class DeltaType:
|
|
11
|
-
additions: Union[
|
|
12
|
-
removals:
|
|
11
|
+
additions: Union[dict[str, Plot], list[str]]
|
|
12
|
+
removals: list[str]
|
|
13
13
|
|
|
14
14
|
def __str__(self) -> str:
|
|
15
15
|
return f"+{len(self.additions)}/-{len(self.removals)}"
|
|
@@ -24,17 +24,17 @@ class DeltaType:
|
|
|
24
24
|
|
|
25
25
|
@dataclass
|
|
26
26
|
class PlotListDelta(DeltaType):
|
|
27
|
-
additions:
|
|
28
|
-
removals:
|
|
27
|
+
additions: dict[str, Plot] = field(default_factory=dict)
|
|
28
|
+
removals: list[str] = field(default_factory=list)
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
@dataclass
|
|
32
32
|
class PathListDelta(DeltaType):
|
|
33
|
-
additions:
|
|
34
|
-
removals:
|
|
33
|
+
additions: list[str] = field(default_factory=list)
|
|
34
|
+
removals: list[str] = field(default_factory=list)
|
|
35
35
|
|
|
36
36
|
@staticmethod
|
|
37
|
-
def from_lists(old:
|
|
37
|
+
def from_lists(old: list[str], new: list[str]) -> PathListDelta:
|
|
38
38
|
return PathListDelta([x for x in new if x not in old], [x for x in old if x not in new])
|
|
39
39
|
|
|
40
40
|
|
chia/plot_sync/receiver.py
CHANGED
|
@@ -2,8 +2,9 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import time
|
|
5
|
+
from collections.abc import Awaitable, Collection, Sequence
|
|
5
6
|
from dataclasses import dataclass, field
|
|
6
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Callable, Optional, Union
|
|
7
8
|
|
|
8
9
|
from typing_extensions import Protocol
|
|
9
10
|
|
|
@@ -82,10 +83,10 @@ class Receiver:
|
|
|
82
83
|
_connection: WSChiaConnection
|
|
83
84
|
_current_sync: Sync
|
|
84
85
|
_last_sync: Sync
|
|
85
|
-
_plots:
|
|
86
|
-
_invalid:
|
|
87
|
-
_keys_missing:
|
|
88
|
-
_duplicates:
|
|
86
|
+
_plots: dict[str, Plot]
|
|
87
|
+
_invalid: list[str]
|
|
88
|
+
_keys_missing: list[str]
|
|
89
|
+
_duplicates: list[str]
|
|
89
90
|
_total_plot_size: int
|
|
90
91
|
_total_effective_plot_size: int
|
|
91
92
|
_update_callback: ReceiverUpdateCallback
|
|
@@ -138,16 +139,16 @@ class Receiver:
|
|
|
138
139
|
def initial_sync(self) -> bool:
|
|
139
140
|
return self._last_sync.sync_id == 0
|
|
140
141
|
|
|
141
|
-
def plots(self) ->
|
|
142
|
+
def plots(self) -> dict[str, Plot]:
|
|
142
143
|
return self._plots
|
|
143
144
|
|
|
144
|
-
def invalid(self) ->
|
|
145
|
+
def invalid(self) -> list[str]:
|
|
145
146
|
return self._invalid
|
|
146
147
|
|
|
147
|
-
def keys_missing(self) ->
|
|
148
|
+
def keys_missing(self) -> list[str]:
|
|
148
149
|
return self._keys_missing
|
|
149
150
|
|
|
150
|
-
def duplicates(self) ->
|
|
151
|
+
def duplicates(self) -> list[str]:
|
|
151
152
|
return self._duplicates
|
|
152
153
|
|
|
153
154
|
def total_plot_size(self) -> int:
|
|
@@ -245,7 +246,7 @@ class Receiver:
|
|
|
245
246
|
state: State,
|
|
246
247
|
next_state: State,
|
|
247
248
|
target: Collection[str],
|
|
248
|
-
delta:
|
|
249
|
+
delta: list[str],
|
|
249
250
|
paths: PlotSyncPathList,
|
|
250
251
|
is_removal: bool = False,
|
|
251
252
|
) -> None:
|
|
@@ -359,7 +360,7 @@ class Receiver:
|
|
|
359
360
|
async def sync_done(self, data: PlotSyncDone) -> None:
|
|
360
361
|
await self._process(self._sync_done, ProtocolMessageTypes.plot_sync_done, data)
|
|
361
362
|
|
|
362
|
-
def to_dict(self, counts_only: bool = False) ->
|
|
363
|
+
def to_dict(self, counts_only: bool = False) -> dict[str, Any]:
|
|
363
364
|
syncing = None
|
|
364
365
|
if self._current_sync.in_progress():
|
|
365
366
|
syncing = {
|
chia/plot_sync/sender.py
CHANGED
|
@@ -4,9 +4,10 @@ import asyncio
|
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
6
|
import traceback
|
|
7
|
+
from collections.abc import Iterable
|
|
7
8
|
from dataclasses import dataclass
|
|
8
9
|
from pathlib import Path
|
|
9
|
-
from typing import Any, Generic,
|
|
10
|
+
from typing import Any, Generic, Optional, TypeVar
|
|
10
11
|
|
|
11
12
|
from typing_extensions import Protocol
|
|
12
13
|
|
|
@@ -28,12 +29,13 @@ from chia.server.outbound_message import NodeType, make_msg
|
|
|
28
29
|
from chia.server.ws_connection import WSChiaConnection
|
|
29
30
|
from chia.util.batches import to_batches
|
|
30
31
|
from chia.util.ints import int16, uint32, uint64
|
|
32
|
+
from chia.util.task_referencer import create_referenced_task
|
|
31
33
|
|
|
32
34
|
log = logging.getLogger(__name__)
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
def _convert_plot_info_list(plot_infos:
|
|
36
|
-
converted:
|
|
37
|
+
def _convert_plot_info_list(plot_infos: list[PlotInfo]) -> list[Plot]:
|
|
38
|
+
converted: list[Plot] = []
|
|
37
39
|
for plot_info in plot_infos:
|
|
38
40
|
converted.append(
|
|
39
41
|
Plot(
|
|
@@ -66,10 +68,10 @@ class MessageGenerator(Generic[T]):
|
|
|
66
68
|
sync_id: uint64
|
|
67
69
|
message_type: ProtocolMessageTypes
|
|
68
70
|
message_id: uint64
|
|
69
|
-
payload_type:
|
|
71
|
+
payload_type: type[T]
|
|
70
72
|
args: Iterable[object]
|
|
71
73
|
|
|
72
|
-
def generate(self) ->
|
|
74
|
+
def generate(self) -> tuple[PlotSyncIdentifier, T]:
|
|
73
75
|
identifier = PlotSyncIdentifier(uint64(int(time.time())), self.sync_id, self.message_id)
|
|
74
76
|
payload = self.payload_type(identifier, *self.args)
|
|
75
77
|
return identifier, payload
|
|
@@ -93,7 +95,7 @@ class Sender:
|
|
|
93
95
|
_connection: Optional[WSChiaConnection]
|
|
94
96
|
_sync_id: uint64
|
|
95
97
|
_next_message_id: uint64
|
|
96
|
-
_messages:
|
|
98
|
+
_messages: list[MessageGenerator[PayloadType]]
|
|
97
99
|
_last_sync_id: uint64
|
|
98
100
|
_stop_requested = False
|
|
99
101
|
_task: Optional[asyncio.Task[None]]
|
|
@@ -119,7 +121,7 @@ class Sender:
|
|
|
119
121
|
if self._task is not None and self._stop_requested:
|
|
120
122
|
await self.await_closed()
|
|
121
123
|
if self._task is None:
|
|
122
|
-
self._task =
|
|
124
|
+
self._task = create_referenced_task(self._run())
|
|
123
125
|
if not self._plot_manager.initial_refresh() or self._sync_id != 0:
|
|
124
126
|
self._reset()
|
|
125
127
|
else:
|
|
@@ -161,7 +163,8 @@ class Sender:
|
|
|
161
163
|
async def _wait_for_response(self) -> bool:
|
|
162
164
|
start = time.time()
|
|
163
165
|
assert self._response is not None
|
|
164
|
-
|
|
166
|
+
# TODO: switch to event driven code
|
|
167
|
+
while time.time() - start < Constants.message_timeout and self._response.message is None: # noqa: ASYNC110
|
|
165
168
|
await asyncio.sleep(0.1)
|
|
166
169
|
return self._response.message is not None
|
|
167
170
|
|
|
@@ -249,7 +252,7 @@ class Sender:
|
|
|
249
252
|
|
|
250
253
|
return True
|
|
251
254
|
|
|
252
|
-
def _add_list_batched(self, message_type: ProtocolMessageTypes, payload_type: Any, data:
|
|
255
|
+
def _add_list_batched(self, message_type: ProtocolMessageTypes, payload_type: Any, data: list[Any]) -> None:
|
|
253
256
|
if len(data) == 0:
|
|
254
257
|
self._add_message(message_type, payload_type, [], True)
|
|
255
258
|
return
|
|
@@ -266,7 +269,7 @@ class Sender:
|
|
|
266
269
|
sync_id = int(time.time())
|
|
267
270
|
# Make sure we have unique sync-id's even if we restart refreshing within a second (i.e. in tests)
|
|
268
271
|
if sync_id == self._last_sync_id:
|
|
269
|
-
sync_id
|
|
272
|
+
sync_id += 1
|
|
270
273
|
log.debug(f"sync_start {sync_id}")
|
|
271
274
|
self._sync_id = uint64(sync_id)
|
|
272
275
|
self._add_message(
|
|
@@ -278,13 +281,13 @@ class Sender:
|
|
|
278
281
|
self._harvesting_mode,
|
|
279
282
|
)
|
|
280
283
|
|
|
281
|
-
def process_batch(self, loaded:
|
|
284
|
+
def process_batch(self, loaded: list[PlotInfo], remaining: int) -> None:
|
|
282
285
|
log.debug(f"process_batch {self}: loaded {len(loaded)}, remaining {remaining}")
|
|
283
286
|
if len(loaded) > 0 or remaining == 0:
|
|
284
287
|
converted = _convert_plot_info_list(loaded)
|
|
285
288
|
self._add_message(ProtocolMessageTypes.plot_sync_loaded, PlotSyncPlotList, converted, remaining == 0)
|
|
286
289
|
|
|
287
|
-
def sync_done(self, removed:
|
|
290
|
+
def sync_done(self, removed: list[Path], duration: float) -> None:
|
|
288
291
|
log.debug(f"sync_done {self}: removed {len(removed)}, duration {duration}")
|
|
289
292
|
removed_list = [str(x) for x in removed]
|
|
290
293
|
self._add_list_batched(
|
chia/plotters/bladebit.py
CHANGED
|
@@ -7,7 +7,7 @@ import os
|
|
|
7
7
|
import sys
|
|
8
8
|
import traceback
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Literal, Optional, Union
|
|
11
11
|
|
|
12
12
|
from chia.plotters.plotters_util import get_venv_bin, reset_loop_policy_for_windows, run_command, run_plotter
|
|
13
13
|
from chia.plotting.create_plots import resolve_plot_keys
|
|
@@ -20,10 +20,10 @@ BLADEBIT_PLOTTER_DIR = "bladebit"
|
|
|
20
20
|
|
|
21
21
|
def is_bladebit_supported() -> bool:
|
|
22
22
|
# bladebit >= 2.0.0 now supports macOS
|
|
23
|
-
return sys.platform.startswith("linux") or sys.platform in
|
|
23
|
+
return sys.platform.startswith("linux") or sys.platform in {"win32", "cygwin", "darwin"}
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def meets_memory_requirement(plotters_root_path: Path) ->
|
|
26
|
+
def meets_memory_requirement(plotters_root_path: Path) -> tuple[bool, Optional[str]]:
|
|
27
27
|
have_enough_memory: bool = False
|
|
28
28
|
warning_string: Optional[str] = None
|
|
29
29
|
|
|
@@ -40,7 +40,7 @@ def meets_memory_requirement(plotters_root_path: Path) -> Tuple[bool, Optional[s
|
|
|
40
40
|
if proc.returncode != 0:
|
|
41
41
|
return have_enough_memory, proc.stderr.strip()
|
|
42
42
|
|
|
43
|
-
memory_info:
|
|
43
|
+
memory_info: dict[str, int] = json.loads(proc.stdout)
|
|
44
44
|
total_bytes: int = memory_info.get("total", -1)
|
|
45
45
|
required_bytes: int = memory_info.get("required", 0)
|
|
46
46
|
have_enough_memory = total_bytes >= required_bytes
|
|
@@ -83,8 +83,8 @@ def get_bladebit_package_path() -> Path:
|
|
|
83
83
|
|
|
84
84
|
def get_bladebit_exec_path(with_cuda: bool = False) -> str:
|
|
85
85
|
if with_cuda:
|
|
86
|
-
return "bladebit_cuda.exe" if sys.platform in
|
|
87
|
-
return "bladebit.exe" if sys.platform in
|
|
86
|
+
return "bladebit_cuda.exe" if sys.platform in {"win32", "cygwin"} else "bladebit_cuda"
|
|
87
|
+
return "bladebit.exe" if sys.platform in {"win32", "cygwin"} else "bladebit"
|
|
88
88
|
|
|
89
89
|
|
|
90
90
|
def get_bladebit_exec_venv_path(with_cuda: bool = False) -> Optional[Path]:
|
|
@@ -97,7 +97,7 @@ def get_bladebit_exec_venv_path(with_cuda: bool = False) -> Optional[Path]:
|
|
|
97
97
|
|
|
98
98
|
def get_bladebit_exec_src_path(plotters_root_path: Path, with_cuda: bool = False) -> Path:
|
|
99
99
|
bladebit_src_dir = get_bladebit_src_path(plotters_root_path)
|
|
100
|
-
build_dir = "build/Release" if sys.platform in
|
|
100
|
+
build_dir = "build/Release" if sys.platform in {"win32", "cygwin"} else "build"
|
|
101
101
|
bladebit_exec = get_bladebit_exec_path(with_cuda)
|
|
102
102
|
return bladebit_src_dir / build_dir / bladebit_exec
|
|
103
103
|
|
|
@@ -131,7 +131,7 @@ def get_bladebit_executable_path(plotters_root_path: Path) -> Path:
|
|
|
131
131
|
|
|
132
132
|
def get_bladebit_version(
|
|
133
133
|
plotters_root_path: Path,
|
|
134
|
-
) -> Union[
|
|
134
|
+
) -> Union[tuple[Literal[False], str], tuple[None, str], tuple[Literal[True], list[str]]]:
|
|
135
135
|
bladebit_executable_path = get_bladebit_executable_path(plotters_root_path)
|
|
136
136
|
if not bladebit_executable_path.exists():
|
|
137
137
|
# (found=False, "")
|
|
@@ -157,8 +157,8 @@ def get_bladebit_version(
|
|
|
157
157
|
return None, str(e)
|
|
158
158
|
|
|
159
159
|
|
|
160
|
-
def get_bladebit_install_info(plotters_root_path: Path) -> Optional[
|
|
161
|
-
info:
|
|
160
|
+
def get_bladebit_install_info(plotters_root_path: Path) -> Optional[dict[str, Any]]:
|
|
161
|
+
info: dict[str, Any] = {"display_name": "BladeBit Plotter"}
|
|
162
162
|
installed: bool = False
|
|
163
163
|
supported: bool = is_bladebit_supported()
|
|
164
164
|
cuda_available: bool = is_cudaplot_available(plotters_root_path)
|
|
@@ -272,7 +272,7 @@ def plot_bladebit(args, chia_root_path, root_path):
|
|
|
272
272
|
print("Bladebit was not found.")
|
|
273
273
|
return
|
|
274
274
|
|
|
275
|
-
if sys.platform in
|
|
275
|
+
if sys.platform in {"win32", "cygwin"}:
|
|
276
276
|
reset_loop_policy_for_windows()
|
|
277
277
|
|
|
278
278
|
plot_keys = asyncio.run(
|
|
@@ -286,7 +286,7 @@ def plot_bladebit(args, chia_root_path, root_path):
|
|
|
286
286
|
args.connect_to_daemon,
|
|
287
287
|
)
|
|
288
288
|
)
|
|
289
|
-
if args.plot_type
|
|
289
|
+
if args.plot_type in {"ramplot", "diskplot", "cudaplot"}:
|
|
290
290
|
plot_type = args.plot_type
|
|
291
291
|
else:
|
|
292
292
|
plot_type = "diskplot"
|
chia/plotters/chiapos.py
CHANGED
|
@@ -10,7 +10,7 @@ import importlib.metadata
|
|
|
10
10
|
import logging
|
|
11
11
|
from argparse import Namespace
|
|
12
12
|
from pathlib import Path
|
|
13
|
-
from typing import Any,
|
|
13
|
+
from typing import Any, Optional
|
|
14
14
|
|
|
15
15
|
from chia.plotting.create_plots import create_plots, resolve_plot_keys
|
|
16
16
|
from chia.plotting.util import Params, add_plot_directory, validate_plot_size
|
|
@@ -18,7 +18,7 @@ from chia.plotting.util import Params, add_plot_directory, validate_plot_size
|
|
|
18
18
|
log = logging.getLogger(__name__)
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
def get_chiapos_install_info() -> Optional[
|
|
21
|
+
def get_chiapos_install_info() -> Optional[dict[str, Any]]:
|
|
22
22
|
chiapos_version = importlib.metadata.version("chiapos")
|
|
23
23
|
return {"display_name": "Chia Proof of Space", "version": chiapos_version, "installed": True}
|
|
24
24
|
|
chia/plotters/madmax.py
CHANGED
|
@@ -6,7 +6,7 @@ import os
|
|
|
6
6
|
import sys
|
|
7
7
|
import traceback
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any,
|
|
9
|
+
from typing import Any, Optional
|
|
10
10
|
|
|
11
11
|
from chia.plotters.plotters_util import get_venv_bin, reset_loop_policy_for_windows, run_command, run_plotter
|
|
12
12
|
from chia.plotting.create_plots import resolve_plot_keys
|
|
@@ -18,7 +18,7 @@ MADMAX_PLOTTER_DIR = "madmax-plotter"
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def is_madmax_supported() -> bool:
|
|
21
|
-
return sys.platform.startswith("linux") or sys.platform in
|
|
21
|
+
return sys.platform.startswith("linux") or sys.platform in {"darwin", "win32", "cygwin"}
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def get_madmax_src_path(plotters_root_path: Path) -> Path:
|
|
@@ -39,7 +39,7 @@ def get_madmax_exec_venv_path(ksize: int = 32) -> Optional[Path]:
|
|
|
39
39
|
madmax_exec = "chia_plot"
|
|
40
40
|
if ksize > 32:
|
|
41
41
|
madmax_exec += "_k34" # Use the chia_plot_k34 executable for k-sizes > 32
|
|
42
|
-
if sys.platform in
|
|
42
|
+
if sys.platform in {"win32", "cygwin"}:
|
|
43
43
|
madmax_exec += ".exe"
|
|
44
44
|
return venv_bin_path / madmax_exec
|
|
45
45
|
|
|
@@ -49,7 +49,7 @@ def get_madmax_exec_src_path(plotters_root_path: Path, ksize: int = 32) -> Path:
|
|
|
49
49
|
madmax_exec = "chia_plot"
|
|
50
50
|
if ksize > 32:
|
|
51
51
|
madmax_exec += "_k34" # Use the chia_plot_k34 executable for k-sizes > 32
|
|
52
|
-
if sys.platform in
|
|
52
|
+
if sys.platform in {"win32", "cygwin"}:
|
|
53
53
|
madmax_exec += ".exe"
|
|
54
54
|
return madmax_src_dir / madmax_exec
|
|
55
55
|
|
|
@@ -59,7 +59,7 @@ def get_madmax_exec_package_path(ksize: int = 32) -> Path:
|
|
|
59
59
|
madmax_exec: str = "chia_plot"
|
|
60
60
|
if ksize > 32:
|
|
61
61
|
madmax_exec += "_k34" # Use the chia_plot_k34 executable for k-sizes > 32
|
|
62
|
-
if sys.platform in
|
|
62
|
+
if sys.platform in {"win32", "cygwin"}:
|
|
63
63
|
madmax_exec += ".exe"
|
|
64
64
|
return madmax_dir / madmax_exec
|
|
65
65
|
|
|
@@ -100,8 +100,8 @@ def get_madmax_version(plotters_root_path: Path):
|
|
|
100
100
|
return None, f"Failed to determine madmax version: {e} {tb}"
|
|
101
101
|
|
|
102
102
|
|
|
103
|
-
def get_madmax_install_info(plotters_root_path: Path) -> Optional[
|
|
104
|
-
info:
|
|
103
|
+
def get_madmax_install_info(plotters_root_path: Path) -> Optional[dict[str, Any]]:
|
|
104
|
+
info: dict[str, Any] = {"display_name": "madMAx Plotter"}
|
|
105
105
|
installed: bool = False
|
|
106
106
|
supported: bool = is_madmax_supported()
|
|
107
107
|
|
|
@@ -160,7 +160,7 @@ def plot_madmax(args, chia_root_path: Path, plotters_root_path: Path):
|
|
|
160
160
|
|
|
161
161
|
# madMAx has a ulimit -n requirement > 296:
|
|
162
162
|
# "Cannot open at least 296 files, please raise maximum open file limit in OS."
|
|
163
|
-
|
|
163
|
+
_soft_limit, hard_limit = resource.getrlimit(resource.RLIMIT_NOFILE)
|
|
164
164
|
# Set soft limit to max (hard limit)
|
|
165
165
|
resource.setrlimit(resource.RLIMIT_NOFILE, (hard_limit, hard_limit))
|
|
166
166
|
else:
|
chia/plotters/plotters.py
CHANGED
|
@@ -5,7 +5,7 @@ import binascii
|
|
|
5
5
|
import os
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import Any,
|
|
8
|
+
from typing import Any, Optional
|
|
9
9
|
|
|
10
10
|
from chia.plotters.bladebit import get_bladebit_install_info, plot_bladebit
|
|
11
11
|
from chia.plotters.chiapos import get_chiapos_install_info, plot_chia
|
|
@@ -547,12 +547,12 @@ def call_plotters(root_path: Path, args):
|
|
|
547
547
|
show_plotters_version(chia_root_path)
|
|
548
548
|
|
|
549
549
|
|
|
550
|
-
def get_available_plotters(root_path) ->
|
|
550
|
+
def get_available_plotters(root_path) -> dict[str, Any]:
|
|
551
551
|
plotters_root_path: Path = get_plotters_root_path(root_path)
|
|
552
|
-
plotters:
|
|
553
|
-
chiapos: Optional[
|
|
554
|
-
bladebit: Optional[
|
|
555
|
-
madmax: Optional[
|
|
552
|
+
plotters: dict[str, Any] = {}
|
|
553
|
+
chiapos: Optional[dict[str, Any]] = get_chiapos_install_info()
|
|
554
|
+
bladebit: Optional[dict[str, Any]] = get_bladebit_install_info(plotters_root_path)
|
|
555
|
+
madmax: Optional[dict[str, Any]] = get_madmax_install_info(plotters_root_path)
|
|
556
556
|
|
|
557
557
|
if chiapos is not None:
|
|
558
558
|
plotters["chiapos"] = chiapos
|