chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/util/keychain.py
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
import sys
|
|
4
6
|
import unicodedata
|
|
7
|
+
from collections.abc import Iterator
|
|
5
8
|
from dataclasses import dataclass
|
|
6
9
|
from hashlib import pbkdf2_hmac
|
|
7
10
|
from pathlib import Path
|
|
8
|
-
from typing import Any,
|
|
11
|
+
from typing import Any, Literal, Optional, Union, overload
|
|
9
12
|
|
|
10
13
|
import importlib_resources
|
|
11
14
|
from bitstring import BitArray # pyright: reportMissingImports=false
|
|
12
15
|
from chia_rs import AugSchemeMPL, G1Element, PrivateKey # pyright: reportMissingImports=false
|
|
16
|
+
from chia_rs.sized_bytes import bytes32
|
|
17
|
+
from chia_rs.sized_ints import uint32
|
|
13
18
|
from typing_extensions import final
|
|
14
19
|
|
|
15
|
-
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
16
20
|
from chia.util.bech32m import bech32_decode, convertbits
|
|
17
21
|
from chia.util.byte_types import hexstr_to_bytes
|
|
18
22
|
from chia.util.errors import (
|
|
@@ -26,7 +30,6 @@ from chia.util.errors import (
|
|
|
26
30
|
)
|
|
27
31
|
from chia.util.file_keyring import Key
|
|
28
32
|
from chia.util.hash import std_hash
|
|
29
|
-
from chia.util.ints import uint32
|
|
30
33
|
from chia.util.keyring_wrapper import KeyringWrapper
|
|
31
34
|
from chia.util.streamable import Streamable, streamable
|
|
32
35
|
|
|
@@ -38,10 +41,10 @@ MIN_PASSPHRASE_LEN = 8
|
|
|
38
41
|
|
|
39
42
|
|
|
40
43
|
def supports_os_passphrase_storage() -> bool:
|
|
41
|
-
return sys.platform in
|
|
44
|
+
return sys.platform in {"darwin", "win32", "cygwin"}
|
|
42
45
|
|
|
43
46
|
|
|
44
|
-
def passphrase_requirements() ->
|
|
47
|
+
def passphrase_requirements() -> dict[str, Any]:
|
|
45
48
|
"""
|
|
46
49
|
Returns a dictionary specifying current passphrase requirements
|
|
47
50
|
"""
|
|
@@ -68,7 +71,7 @@ def generate_mnemonic() -> str:
|
|
|
68
71
|
|
|
69
72
|
|
|
70
73
|
def bytes_to_mnemonic(mnemonic_bytes: bytes) -> str:
|
|
71
|
-
if len(mnemonic_bytes) not in
|
|
74
|
+
if len(mnemonic_bytes) not in {16, 20, 24, 28, 32}:
|
|
72
75
|
raise ValueError(
|
|
73
76
|
f"Data length should be one of the following: [16, 20, 24, 28, 32], but it is {len(mnemonic_bytes)}."
|
|
74
77
|
)
|
|
@@ -93,8 +96,8 @@ def bytes_to_mnemonic(mnemonic_bytes: bytes) -> str:
|
|
|
93
96
|
|
|
94
97
|
|
|
95
98
|
def check_mnemonic_validity(mnemonic_str: str) -> bool:
|
|
96
|
-
mnemonic:
|
|
97
|
-
return len(mnemonic) in
|
|
99
|
+
mnemonic: list[str] = mnemonic_str.split(" ")
|
|
100
|
+
return len(mnemonic) in {12, 15, 18, 21, 24}
|
|
98
101
|
|
|
99
102
|
|
|
100
103
|
def mnemonic_from_short_words(mnemonic_str: str) -> str:
|
|
@@ -103,12 +106,12 @@ def mnemonic_from_short_words(mnemonic_str: str) -> str:
|
|
|
103
106
|
practice to only store the first 4 letters of each word in many offline storage solutions, also support looking
|
|
104
107
|
up words by the first 4 characters
|
|
105
108
|
"""
|
|
106
|
-
mnemonic:
|
|
107
|
-
if len(mnemonic) not in
|
|
109
|
+
mnemonic: list[str] = mnemonic_str.split(" ")
|
|
110
|
+
if len(mnemonic) not in {12, 15, 18, 21, 24}:
|
|
108
111
|
raise ValueError("Invalid mnemonic length")
|
|
109
112
|
|
|
110
113
|
four_char_dict = {word[:4]: word for word in bip39_word_list().splitlines()}
|
|
111
|
-
full_words:
|
|
114
|
+
full_words: list[str] = []
|
|
112
115
|
for word in mnemonic:
|
|
113
116
|
full_word = four_char_dict.get(word[:4])
|
|
114
117
|
if full_word is None:
|
|
@@ -120,7 +123,7 @@ def mnemonic_from_short_words(mnemonic_str: str) -> str:
|
|
|
120
123
|
|
|
121
124
|
def bytes_from_mnemonic(mnemonic_str: str) -> bytes:
|
|
122
125
|
full_mnemonic_str = mnemonic_from_short_words(mnemonic_str)
|
|
123
|
-
mnemonic:
|
|
126
|
+
mnemonic: list[str] = full_mnemonic_str.split(" ")
|
|
124
127
|
|
|
125
128
|
word_list = {word: i for i, word in enumerate(bip39_word_list().splitlines())}
|
|
126
129
|
bit_array = BitArray()
|
|
@@ -185,7 +188,7 @@ def get_private_key_user(user: str, index: int) -> str:
|
|
|
185
188
|
@streamable
|
|
186
189
|
@dataclass(frozen=True)
|
|
187
190
|
class KeyDataSecrets(Streamable):
|
|
188
|
-
mnemonic:
|
|
191
|
+
mnemonic: list[str]
|
|
189
192
|
entropy: bytes
|
|
190
193
|
private_key: PrivateKey
|
|
191
194
|
|
|
@@ -259,7 +262,7 @@ class KeyData(Streamable):
|
|
|
259
262
|
return cls.from_mnemonic(generate_mnemonic(), label)
|
|
260
263
|
|
|
261
264
|
@property
|
|
262
|
-
def mnemonic(self) ->
|
|
265
|
+
def mnemonic(self) -> list[str]:
|
|
263
266
|
if self.secrets is None:
|
|
264
267
|
raise KeychainSecretsMissing()
|
|
265
268
|
return self.secrets.mnemonic
|
|
@@ -434,7 +437,7 @@ class Keychain:
|
|
|
434
437
|
pass
|
|
435
438
|
return None
|
|
436
439
|
|
|
437
|
-
def get_first_private_key(self) -> Optional[
|
|
440
|
+
def get_first_private_key(self) -> Optional[tuple[PrivateKey, bytes]]:
|
|
438
441
|
"""
|
|
439
442
|
Returns the first key in the keychain that has one of the passed in passphrases.
|
|
440
443
|
"""
|
|
@@ -442,7 +445,7 @@ class Keychain:
|
|
|
442
445
|
return key_data.private_key, key_data.entropy
|
|
443
446
|
return None
|
|
444
447
|
|
|
445
|
-
def get_private_key_by_fingerprint(self, fingerprint: int) -> Optional[
|
|
448
|
+
def get_private_key_by_fingerprint(self, fingerprint: int) -> Optional[tuple[PrivateKey, bytes]]:
|
|
446
449
|
"""
|
|
447
450
|
Return first private key which have the given public key fingerprint.
|
|
448
451
|
"""
|
|
@@ -451,12 +454,12 @@ class Keychain:
|
|
|
451
454
|
return key_data.private_key, key_data.entropy
|
|
452
455
|
return None
|
|
453
456
|
|
|
454
|
-
def get_all_private_keys(self) ->
|
|
457
|
+
def get_all_private_keys(self) -> list[tuple[PrivateKey, bytes]]:
|
|
455
458
|
"""
|
|
456
459
|
Returns all private keys which can be retrieved, with the given passphrases.
|
|
457
460
|
A tuple of key, and entropy bytes (i.e. mnemonic) is returned for each key.
|
|
458
461
|
"""
|
|
459
|
-
all_keys:
|
|
462
|
+
all_keys: list[tuple[PrivateKey, bytes]] = []
|
|
460
463
|
for key_data in self._iterate_through_key_datas(skip_public_only=True):
|
|
461
464
|
all_keys.append((key_data.private_key, key_data.entropy))
|
|
462
465
|
return all_keys
|
|
@@ -470,21 +473,21 @@ class Keychain:
|
|
|
470
473
|
return key_data
|
|
471
474
|
raise KeychainFingerprintNotFound(fingerprint)
|
|
472
475
|
|
|
473
|
-
def get_keys(self, include_secrets: bool = False) ->
|
|
476
|
+
def get_keys(self, include_secrets: bool = False) -> list[KeyData]:
|
|
474
477
|
"""
|
|
475
478
|
Returns the KeyData of all keys which can be retrieved.
|
|
476
479
|
"""
|
|
477
|
-
all_keys:
|
|
480
|
+
all_keys: list[KeyData] = []
|
|
478
481
|
for key_data in self._iterate_through_key_datas(include_secrets=include_secrets, skip_public_only=False):
|
|
479
482
|
all_keys.append(key_data)
|
|
480
483
|
|
|
481
484
|
return all_keys
|
|
482
485
|
|
|
483
|
-
def get_all_public_keys(self) ->
|
|
486
|
+
def get_all_public_keys(self) -> list[G1Element]:
|
|
484
487
|
"""
|
|
485
488
|
Returns all public keys.
|
|
486
489
|
"""
|
|
487
|
-
all_keys:
|
|
490
|
+
all_keys: list[G1Element] = []
|
|
488
491
|
for key_data in self._iterate_through_key_datas(skip_public_only=False):
|
|
489
492
|
all_keys.append(key_data.public_key)
|
|
490
493
|
|
|
@@ -521,13 +524,13 @@ class Keychain:
|
|
|
521
524
|
pass
|
|
522
525
|
return removed
|
|
523
526
|
|
|
524
|
-
def delete_keys(self, keys_to_delete:
|
|
527
|
+
def delete_keys(self, keys_to_delete: list[tuple[PrivateKey, bytes]]) -> None:
|
|
525
528
|
"""
|
|
526
529
|
Deletes all keys in the list.
|
|
527
530
|
"""
|
|
528
531
|
remaining_fingerprints = {x[0].get_g1().get_fingerprint() for x in keys_to_delete}
|
|
529
532
|
remaining_removals = len(remaining_fingerprints)
|
|
530
|
-
while len(remaining_fingerprints):
|
|
533
|
+
while len(remaining_fingerprints) > 0:
|
|
531
534
|
key_to_delete = remaining_fingerprints.pop()
|
|
532
535
|
if self.delete_key_by_fingerprint(key_to_delete) > 0:
|
|
533
536
|
remaining_removals -= 1
|
chia/util/keyring_wrapper.py
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
5
|
+
import sys
|
|
6
|
+
import time
|
|
7
|
+
from getpass import getpass
|
|
3
8
|
from pathlib import Path
|
|
4
9
|
from sys import platform
|
|
5
|
-
from typing import ClassVar, Optional,
|
|
10
|
+
from typing import ClassVar, Optional, Union, overload
|
|
6
11
|
|
|
12
|
+
import colorama
|
|
7
13
|
from keyring.backends.macOS import Keyring as MacKeyring
|
|
8
14
|
from keyring.backends.Windows import WinVaultKeyring as WinKeyring
|
|
9
15
|
from keyring.errors import KeyringError, PasswordDeleteError
|
|
10
16
|
from typing_extensions import Literal
|
|
11
17
|
|
|
12
18
|
from chia.util.default_root import DEFAULT_KEYS_ROOT_PATH
|
|
19
|
+
from chia.util.errors import KeychainMaxUnlockAttempts
|
|
13
20
|
from chia.util.file_keyring import FileKeyring
|
|
14
21
|
|
|
15
22
|
# We want to protect the keyring, even if a user-specified master passphrase isn't provided
|
|
@@ -52,6 +59,62 @@ def warn_if_macos_errSecInteractionNotAllowed(error: KeyringError) -> bool:
|
|
|
52
59
|
return False
|
|
53
60
|
|
|
54
61
|
|
|
62
|
+
DEFAULT_PASSPHRASE_PROMPT = (
|
|
63
|
+
colorama.Fore.YELLOW + colorama.Style.BRIGHT + "(Unlock Keyring)" + colorama.Style.RESET_ALL + " Passphrase: "
|
|
64
|
+
)
|
|
65
|
+
FAILED_ATTEMPT_DELAY = 0.5
|
|
66
|
+
MAX_RETRIES = 3
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def prompt_for_passphrase(prompt: str) -> str:
|
|
70
|
+
if sys.platform == "win32" or sys.platform == "cygwin":
|
|
71
|
+
print(prompt, end="", flush=True)
|
|
72
|
+
prompt = ""
|
|
73
|
+
return getpass(prompt)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def obtain_current_passphrase(prompt: str = DEFAULT_PASSPHRASE_PROMPT, use_passphrase_cache: bool = False) -> str:
|
|
77
|
+
from chia.util.keyring_wrapper import KeyringWrapper
|
|
78
|
+
|
|
79
|
+
"""
|
|
80
|
+
Obtains the master passphrase for the keyring, optionally using the cached
|
|
81
|
+
value (if previously set). If the passphrase isn't already cached, the user is
|
|
82
|
+
prompted interactively to enter their passphrase a max of MAX_RETRIES times
|
|
83
|
+
before failing.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
if use_passphrase_cache:
|
|
87
|
+
passphrase, validated = KeyringWrapper.get_shared_instance().get_cached_master_passphrase()
|
|
88
|
+
if passphrase:
|
|
89
|
+
# If the cached passphrase was previously validated, we assume it's... valid
|
|
90
|
+
if validated:
|
|
91
|
+
return passphrase
|
|
92
|
+
|
|
93
|
+
# Cached passphrase needs to be validated
|
|
94
|
+
if KeyringWrapper.get_shared_instance().master_passphrase_is_valid(passphrase):
|
|
95
|
+
KeyringWrapper.get_shared_instance().set_cached_master_passphrase(passphrase, validated=True)
|
|
96
|
+
return passphrase
|
|
97
|
+
else:
|
|
98
|
+
# Cached passphrase is bad, clear the cache
|
|
99
|
+
KeyringWrapper.get_shared_instance().set_cached_master_passphrase(None)
|
|
100
|
+
|
|
101
|
+
# Prompt interactively with up to MAX_RETRIES attempts
|
|
102
|
+
for i in range(MAX_RETRIES):
|
|
103
|
+
colorama.init()
|
|
104
|
+
|
|
105
|
+
passphrase = prompt_for_passphrase(prompt)
|
|
106
|
+
|
|
107
|
+
if KeyringWrapper.get_shared_instance().master_passphrase_is_valid(passphrase):
|
|
108
|
+
# If using the passphrase cache, and the user inputted a passphrase, update the cache
|
|
109
|
+
if use_passphrase_cache:
|
|
110
|
+
KeyringWrapper.get_shared_instance().set_cached_master_passphrase(passphrase, validated=True)
|
|
111
|
+
return passphrase
|
|
112
|
+
|
|
113
|
+
time.sleep(FAILED_ATTEMPT_DELAY)
|
|
114
|
+
print("Incorrect passphrase\n")
|
|
115
|
+
raise KeychainMaxUnlockAttempts()
|
|
116
|
+
|
|
117
|
+
|
|
55
118
|
class KeyringWrapper:
|
|
56
119
|
"""
|
|
57
120
|
KeyringWrapper provides an abstraction that the Keychain class can use
|
|
@@ -141,7 +204,7 @@ class KeyringWrapper:
|
|
|
141
204
|
|
|
142
205
|
# Master passphrase support
|
|
143
206
|
|
|
144
|
-
def get_cached_master_passphrase(self) ->
|
|
207
|
+
def get_cached_master_passphrase(self) -> tuple[Optional[str], bool]:
|
|
145
208
|
"""
|
|
146
209
|
Returns a tuple including the currently cached passphrase and a bool
|
|
147
210
|
indicating whether the passphrase has been previously validated.
|
|
@@ -228,7 +291,6 @@ class KeyringWrapper:
|
|
|
228
291
|
except KeyringError as e:
|
|
229
292
|
if not warn_if_macos_errSecInteractionNotAllowed(e):
|
|
230
293
|
raise
|
|
231
|
-
return None
|
|
232
294
|
|
|
233
295
|
def remove_master_passphrase_from_credential_store(self) -> None:
|
|
234
296
|
passphrase_store: Optional[OSPassphraseStore] = get_os_passphrase_store()
|
|
@@ -247,7 +309,6 @@ class KeyringWrapper:
|
|
|
247
309
|
except KeyringError as e:
|
|
248
310
|
if not warn_if_macos_errSecInteractionNotAllowed(e):
|
|
249
311
|
raise
|
|
250
|
-
return None
|
|
251
312
|
|
|
252
313
|
def get_master_passphrase_from_credential_store(self) -> Optional[str]:
|
|
253
314
|
passphrase_store: Optional[OSPassphraseStore] = get_os_passphrase_store()
|
chia/util/limited_semaphore.py
CHANGED
chia/util/lock.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
from dataclasses import dataclass
|
|
4
6
|
from pathlib import Path
|
|
5
7
|
from types import TracebackType
|
|
6
|
-
from typing import Optional
|
|
8
|
+
from typing import Optional
|
|
7
9
|
|
|
8
10
|
from filelock import BaseFileLock, FileLock, Timeout
|
|
9
11
|
from typing_extensions import final
|
|
@@ -31,7 +33,7 @@ class Lockfile:
|
|
|
31
33
|
|
|
32
34
|
def __exit__(
|
|
33
35
|
self,
|
|
34
|
-
exc_type: Optional[
|
|
36
|
+
exc_type: Optional[type[BaseException]],
|
|
35
37
|
exc: Optional[BaseException],
|
|
36
38
|
traceback: Optional[TracebackType],
|
|
37
39
|
) -> None:
|
chia/util/log_exceptions.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
import logging
|
|
4
6
|
import traceback
|
|
7
|
+
from collections.abc import Iterator
|
|
5
8
|
from contextlib import contextmanager
|
|
6
|
-
from typing import
|
|
9
|
+
from typing import Union
|
|
7
10
|
|
|
8
11
|
|
|
9
12
|
@contextmanager
|
|
@@ -14,7 +17,7 @@ def log_exceptions(
|
|
|
14
17
|
message: str = "Caught exception",
|
|
15
18
|
level: int = logging.ERROR,
|
|
16
19
|
show_traceback: bool = True,
|
|
17
|
-
exceptions_to_process: Union[
|
|
20
|
+
exceptions_to_process: Union[type[BaseException], tuple[type[BaseException], ...]] = Exception,
|
|
18
21
|
) -> Iterator[None]:
|
|
19
22
|
try:
|
|
20
23
|
yield
|
chia/util/logging.py
CHANGED
chia/util/lru_cache.py
CHANGED
chia/util/math.py
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
# Package: utils
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
def clamp(n: int, smallest: int, largest: int) -> int:
|
|
7
7
|
return max(smallest, min(n, largest))
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
def make_monotonically_decreasing(seq:
|
|
11
|
-
out:
|
|
10
|
+
def make_monotonically_decreasing(seq: list[float]) -> list[float]:
|
|
11
|
+
out: list[float] = []
|
|
12
12
|
if len(seq) > 0:
|
|
13
13
|
min = seq[0]
|
|
14
14
|
for n in seq:
|
chia/util/network.py
CHANGED
|
@@ -5,51 +5,19 @@ import ipaddress
|
|
|
5
5
|
import logging
|
|
6
6
|
import socket
|
|
7
7
|
import ssl
|
|
8
|
+
from collections.abc import Iterable
|
|
8
9
|
from dataclasses import dataclass
|
|
9
|
-
from ipaddress import
|
|
10
|
-
from typing import Any,
|
|
10
|
+
from ipaddress import IPv4Network, IPv6Network, ip_address
|
|
11
|
+
from typing import Any, Literal, Optional, Union
|
|
11
12
|
|
|
12
13
|
from aiohttp import web
|
|
13
14
|
from aiohttp.log import web_logger
|
|
14
15
|
from typing_extensions import final
|
|
15
16
|
|
|
16
|
-
from chia.server.outbound_message import NodeType
|
|
17
17
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
18
18
|
from chia.util.ints import uint16
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@dataclass(frozen=True)
|
|
22
|
-
class IPAddress:
|
|
23
|
-
_inner: Union[IPv4Address, IPv6Address]
|
|
24
|
-
|
|
25
|
-
@classmethod
|
|
26
|
-
def create(cls, ip: str) -> IPAddress:
|
|
27
|
-
return cls(ip_address(ip))
|
|
28
|
-
|
|
29
|
-
def __int__(self) -> int:
|
|
30
|
-
return int(self._inner)
|
|
31
|
-
|
|
32
|
-
def __str__(self) -> str:
|
|
33
|
-
return str(self._inner)
|
|
34
|
-
|
|
35
|
-
def __repr__(self) -> str:
|
|
36
|
-
return repr(self._inner)
|
|
37
|
-
|
|
38
|
-
@property
|
|
39
|
-
def packed(self) -> bytes:
|
|
40
|
-
return self._inner.packed
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
def is_private(self) -> bool:
|
|
44
|
-
return self._inner.is_private
|
|
45
|
-
|
|
46
|
-
@property
|
|
47
|
-
def is_v4(self) -> bool:
|
|
48
|
-
return self._inner.version == 4
|
|
49
|
-
|
|
50
|
-
@property
|
|
51
|
-
def is_v6(self) -> bool:
|
|
52
|
-
return self._inner.version == 6
|
|
19
|
+
from chia.util.ip_address import IPAddress
|
|
20
|
+
from chia.util.task_referencer import create_referenced_task
|
|
53
21
|
|
|
54
22
|
|
|
55
23
|
@final
|
|
@@ -130,7 +98,7 @@ class WebServer:
|
|
|
130
98
|
await self.runner.cleanup()
|
|
131
99
|
|
|
132
100
|
def close(self) -> None:
|
|
133
|
-
self._close_task =
|
|
101
|
+
self._close_task = create_referenced_task(self._close())
|
|
134
102
|
|
|
135
103
|
async def await_closed(self) -> None:
|
|
136
104
|
if self._close_task is None:
|
|
@@ -146,7 +114,7 @@ def is_in_network(peer_host: str, networks: Iterable[Union[IPv4Network, IPv6Netw
|
|
|
146
114
|
return False
|
|
147
115
|
|
|
148
116
|
|
|
149
|
-
def is_trusted_cidr(peer_host: str, trusted_cidrs:
|
|
117
|
+
def is_trusted_cidr(peer_host: str, trusted_cidrs: list[str]) -> bool:
|
|
150
118
|
try:
|
|
151
119
|
ip_obj = ipaddress.ip_address(peer_host)
|
|
152
120
|
except ValueError:
|
|
@@ -161,41 +129,15 @@ def is_trusted_cidr(peer_host: str, trusted_cidrs: List[str]) -> bool:
|
|
|
161
129
|
|
|
162
130
|
|
|
163
131
|
def is_localhost(peer_host: str) -> bool:
|
|
164
|
-
return peer_host in
|
|
132
|
+
return peer_host in {"127.0.0.1", "localhost", "::1", "0:0:0:0:0:0:0:1"}
|
|
165
133
|
|
|
166
134
|
|
|
167
135
|
def is_trusted_peer(
|
|
168
|
-
host: str, node_id: bytes32, trusted_peers:
|
|
136
|
+
host: str, node_id: bytes32, trusted_peers: dict[str, Any], trusted_cidrs: list[str], testing: bool = False
|
|
169
137
|
) -> bool:
|
|
170
|
-
return
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
def class_for_type(type: NodeType) -> Any:
|
|
174
|
-
if type is NodeType.FULL_NODE:
|
|
175
|
-
from chia.full_node.full_node_api import FullNodeAPI
|
|
176
|
-
|
|
177
|
-
return FullNodeAPI
|
|
178
|
-
elif type is NodeType.WALLET:
|
|
179
|
-
from chia.wallet.wallet_node_api import WalletNodeAPI
|
|
180
|
-
|
|
181
|
-
return WalletNodeAPI
|
|
182
|
-
elif type is NodeType.INTRODUCER:
|
|
183
|
-
from chia.introducer.introducer_api import IntroducerAPI
|
|
184
|
-
|
|
185
|
-
return IntroducerAPI
|
|
186
|
-
elif type is NodeType.TIMELORD:
|
|
187
|
-
from chia.timelord.timelord_api import TimelordAPI
|
|
188
|
-
|
|
189
|
-
return TimelordAPI
|
|
190
|
-
elif type is NodeType.FARMER:
|
|
191
|
-
from chia.farmer.farmer_api import FarmerAPI
|
|
192
|
-
|
|
193
|
-
return FarmerAPI
|
|
194
|
-
elif type is NodeType.HARVESTER:
|
|
195
|
-
from chia.harvester.harvester_api import HarvesterAPI
|
|
196
|
-
|
|
197
|
-
return HarvesterAPI
|
|
198
|
-
raise ValueError("No class for type")
|
|
138
|
+
return (
|
|
139
|
+
(not testing and is_localhost(host)) or node_id.hex() in trusted_peers or is_trusted_cidr(host, trusted_cidrs)
|
|
140
|
+
)
|
|
199
141
|
|
|
200
142
|
|
|
201
143
|
async def resolve(host: str, *, prefer_ipv6: bool = False) -> IPAddress:
|
|
@@ -203,8 +145,8 @@ async def resolve(host: str, *, prefer_ipv6: bool = False) -> IPAddress:
|
|
|
203
145
|
return IPAddress.create(host)
|
|
204
146
|
except ValueError:
|
|
205
147
|
pass
|
|
206
|
-
addrset:
|
|
207
|
-
|
|
148
|
+
addrset: list[
|
|
149
|
+
tuple[socket.AddressFamily, socket.SocketKind, int, str, Union[tuple[str, int], tuple[str, int, int, int]]]
|
|
208
150
|
] = await asyncio.get_event_loop().getaddrinfo(host, None)
|
|
209
151
|
# The list returned by getaddrinfo is never empty, an exception is thrown or data is returned.
|
|
210
152
|
ips_v4 = []
|
|
@@ -224,7 +166,7 @@ async def resolve(host: str, *, prefer_ipv6: bool = False) -> IPAddress:
|
|
|
224
166
|
raise ValueError(f"failed to resolve {host} into an IP address")
|
|
225
167
|
|
|
226
168
|
|
|
227
|
-
def select_port(prefer_ipv6: bool, addresses:
|
|
169
|
+
def select_port(prefer_ipv6: bool, addresses: list[Any]) -> uint16:
|
|
228
170
|
selected_port: uint16
|
|
229
171
|
for address_string, port, *_ in addresses:
|
|
230
172
|
address = ip_address(address_string)
|
chia/util/paginator.py
CHANGED
chia/util/path.py
CHANGED
chia/util/permissions.py
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
import os
|
|
4
6
|
from pathlib import Path
|
|
5
|
-
from typing import Tuple
|
|
6
7
|
|
|
7
8
|
|
|
8
|
-
def verify_file_permissions(path: Path, mask: int) ->
|
|
9
|
+
def verify_file_permissions(path: Path, mask: int) -> tuple[bool, int]:
|
|
9
10
|
"""
|
|
10
11
|
Check that the file's permissions are properly restricted, as compared to the
|
|
11
12
|
permission mask
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Tuple
|
|
4
|
-
|
|
5
3
|
from chia.consensus.block_record import BlockRecord
|
|
6
4
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
7
5
|
from chia.util.ints import uint128
|
|
@@ -11,7 +9,7 @@ def get_prev_transaction_block(
|
|
|
11
9
|
curr: BlockRecord,
|
|
12
10
|
blocks: BlockRecordsProtocol,
|
|
13
11
|
total_iters_sp: uint128,
|
|
14
|
-
) ->
|
|
12
|
+
) -> tuple[bool, BlockRecord]:
|
|
15
13
|
prev_transaction_block = curr
|
|
16
14
|
while not curr.is_transaction_block:
|
|
17
15
|
curr = blocks.block_record(curr.prev_hash)
|
chia/util/priority_mutex.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
import asyncio
|
|
@@ -5,8 +7,9 @@ import collections
|
|
|
5
7
|
import contextlib
|
|
6
8
|
import dataclasses
|
|
7
9
|
import logging
|
|
10
|
+
from collections.abc import AsyncIterator
|
|
8
11
|
from enum import IntEnum
|
|
9
|
-
from typing import
|
|
12
|
+
from typing import Generic, Optional, TypeVar
|
|
10
13
|
|
|
11
14
|
from typing_extensions import final
|
|
12
15
|
|
|
@@ -45,11 +48,11 @@ class PriorityMutex(Generic[_T_Priority]):
|
|
|
45
48
|
```
|
|
46
49
|
"""
|
|
47
50
|
|
|
48
|
-
_deques:
|
|
51
|
+
_deques: dict[_T_Priority, collections.deque[_Element]]
|
|
49
52
|
_active: Optional[_Element] = None
|
|
50
53
|
|
|
51
54
|
@classmethod
|
|
52
|
-
def create(cls, priority_type:
|
|
55
|
+
def create(cls, priority_type: type[_T_Priority]) -> PriorityMutex[_T_Priority]:
|
|
53
56
|
return cls(
|
|
54
57
|
_deques={priority: collections.deque() for priority in sorted(priority_type)},
|
|
55
58
|
)
|
chia/util/profiler.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
import asyncio
|
|
@@ -5,9 +7,10 @@ import cProfile
|
|
|
5
7
|
import logging
|
|
6
8
|
import pathlib
|
|
7
9
|
import tracemalloc
|
|
10
|
+
from collections.abc import AsyncIterator
|
|
8
11
|
from contextlib import asynccontextmanager
|
|
9
12
|
from datetime import datetime
|
|
10
|
-
from typing import
|
|
13
|
+
from typing import Optional
|
|
11
14
|
|
|
12
15
|
from chia.util.path import path_from_root
|
|
13
16
|
|
|
@@ -132,7 +135,7 @@ if __name__ == "__main__":
|
|
|
132
135
|
output_file += f"-{last}"
|
|
133
136
|
|
|
134
137
|
print(f"generating call tree for slot(s) [{first}, {last}]")
|
|
135
|
-
check_call(["gprof2dot", "-f", "pstats", "-o", output_file + ".dot"
|
|
138
|
+
check_call(["gprof2dot", "-f", "pstats", "-o", output_file + ".dot", *files])
|
|
136
139
|
with open(output_file + ".png", "w+") as f:
|
|
137
140
|
check_call(["dot", "-T", "png", output_file + ".dot"], stdout=f)
|
|
138
141
|
print(f"output written to: {output_file}.png")
|
|
@@ -140,7 +143,7 @@ if __name__ == "__main__":
|
|
|
140
143
|
if len(sys.argv) == 2:
|
|
141
144
|
# this analyzes the CPU usage at all slots saved to the profiler directory
|
|
142
145
|
analyze_cpu_usage(profile_dir)
|
|
143
|
-
elif len(sys.argv) in
|
|
146
|
+
elif len(sys.argv) in {3, 4}:
|
|
144
147
|
# the additional arguments are interpreted as either one slot, or a
|
|
145
148
|
# slot range (first and last) to analyze
|
|
146
149
|
first = int(sys.argv[2])
|
|
@@ -174,7 +177,7 @@ async def mem_profile_task(root_path: pathlib.Path, service: str, log: logging.L
|
|
|
174
177
|
await asyncio.sleep(60)
|
|
175
178
|
snapshot = tracemalloc.take_snapshot()
|
|
176
179
|
snapshot.dump(str(profile_dir / f"heap-{counter:05d}.profile"))
|
|
177
|
-
log.info(f"Heap usage: {tracemalloc.get_traced_memory()[0]/1000000:0.3f} MB profile {counter:05d}")
|
|
180
|
+
log.info(f"Heap usage: {tracemalloc.get_traced_memory()[0] / 1000000:0.3f} MB profile {counter:05d}")
|
|
178
181
|
counter += 1
|
|
179
182
|
finally:
|
|
180
183
|
tracemalloc.stop()
|
chia/util/recursive_replace.py
CHANGED