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/seeder/start_crawler.py
CHANGED
|
@@ -4,8 +4,9 @@ import logging
|
|
|
4
4
|
import pathlib
|
|
5
5
|
import sys
|
|
6
6
|
from multiprocessing import freeze_support
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Optional
|
|
8
8
|
|
|
9
|
+
from chia.apis import ApiProtocolRegistry
|
|
9
10
|
from chia.consensus.constants import ConsensusConstants, replace_str_to_bytes
|
|
10
11
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
11
12
|
from chia.rpc.crawler_rpc_api import CrawlerRpcApi
|
|
@@ -17,7 +18,7 @@ from chia.server.start_service import RpcInfo, Service, async_run
|
|
|
17
18
|
from chia.types.aliases import CrawlerService
|
|
18
19
|
from chia.util.chia_logging import initialize_service_logging
|
|
19
20
|
from chia.util.config import load_config, load_config_cli
|
|
20
|
-
from chia.util.default_root import
|
|
21
|
+
from chia.util.default_root import resolve_root_path
|
|
21
22
|
|
|
22
23
|
# See: https://bugs.python.org/issue29288
|
|
23
24
|
"".encode("idna")
|
|
@@ -28,7 +29,7 @@ log = logging.getLogger(__name__)
|
|
|
28
29
|
|
|
29
30
|
def create_full_node_crawler_service(
|
|
30
31
|
root_path: pathlib.Path,
|
|
31
|
-
config:
|
|
32
|
+
config: dict[str, Any],
|
|
32
33
|
consensus_constants: ConsensusConstants,
|
|
33
34
|
connect_to_daemon: bool = True,
|
|
34
35
|
start_crawler_loop: bool = True,
|
|
@@ -60,18 +61,19 @@ def create_full_node_crawler_service(
|
|
|
60
61
|
network_id=network_id,
|
|
61
62
|
rpc_info=rpc_info,
|
|
62
63
|
connect_to_daemon=connect_to_daemon,
|
|
64
|
+
class_for_type=ApiProtocolRegistry,
|
|
63
65
|
)
|
|
64
66
|
|
|
65
67
|
|
|
66
|
-
async def async_main() -> int:
|
|
68
|
+
async def async_main(root_path: pathlib.Path) -> int:
|
|
67
69
|
# TODO: refactor to avoid the double load
|
|
68
|
-
config = load_config(
|
|
69
|
-
service_config = load_config_cli(
|
|
70
|
+
config = load_config(root_path, "config.yaml")
|
|
71
|
+
service_config = load_config_cli(root_path, "config.yaml", SERVICE_NAME)
|
|
70
72
|
config[SERVICE_NAME] = service_config
|
|
71
73
|
overrides = service_config["network_overrides"]["constants"][service_config["selected_network"]]
|
|
72
74
|
updated_constants = replace_str_to_bytes(DEFAULT_CONSTANTS, **overrides)
|
|
73
|
-
initialize_service_logging(service_name=SERVICE_NAME, config=config)
|
|
74
|
-
service = create_full_node_crawler_service(
|
|
75
|
+
initialize_service_logging(service_name=SERVICE_NAME, config=config, root_path=root_path)
|
|
76
|
+
service = create_full_node_crawler_service(root_path, config, updated_constants)
|
|
75
77
|
async with SignalHandlers.manage() as signal_handlers:
|
|
76
78
|
await service.setup_process_global_state(signal_handlers=signal_handlers)
|
|
77
79
|
await service.run()
|
|
@@ -81,7 +83,9 @@ async def async_main() -> int:
|
|
|
81
83
|
|
|
82
84
|
def main() -> int:
|
|
83
85
|
freeze_support()
|
|
84
|
-
|
|
86
|
+
root_path = resolve_root_path(override=None)
|
|
87
|
+
|
|
88
|
+
return async_run(async_main(root_path=root_path))
|
|
85
89
|
|
|
86
90
|
|
|
87
91
|
if __name__ == "__main__":
|
chia/server/address_manager.py
CHANGED
|
@@ -6,7 +6,7 @@ import time
|
|
|
6
6
|
from asyncio import Lock
|
|
7
7
|
from random import choice, randrange
|
|
8
8
|
from secrets import randbits
|
|
9
|
-
from typing import
|
|
9
|
+
from typing import Optional
|
|
10
10
|
|
|
11
11
|
from chia.types.peer_info import PeerInfo, TimestampedPeerInfo
|
|
12
12
|
from chia.util.hash import std_hash
|
|
@@ -81,7 +81,7 @@ class ExtendedPeerInfo:
|
|
|
81
81
|
bytes(std_hash(key.to_bytes(32, byteorder="big") + self.peer_info.get_key())[:8]),
|
|
82
82
|
byteorder="big",
|
|
83
83
|
)
|
|
84
|
-
hash1
|
|
84
|
+
hash1 %= TRIED_BUCKETS_PER_GROUP
|
|
85
85
|
hash2 = int.from_bytes(
|
|
86
86
|
bytes(std_hash(key.to_bytes(32, byteorder="big") + self.peer_info.get_group() + bytes([hash1]))[:8]),
|
|
87
87
|
byteorder="big",
|
|
@@ -96,7 +96,7 @@ class ExtendedPeerInfo:
|
|
|
96
96
|
bytes(std_hash(key.to_bytes(32, byteorder="big") + self.peer_info.get_group() + src_peer.get_group())[:8]),
|
|
97
97
|
byteorder="big",
|
|
98
98
|
)
|
|
99
|
-
hash1
|
|
99
|
+
hash1 %= NEW_BUCKETS_PER_SOURCE_GROUP
|
|
100
100
|
hash2 = int.from_bytes(
|
|
101
101
|
bytes(std_hash(key.to_bytes(32, byteorder="big") + src_peer.get_group() + bytes([hash1]))[:8]),
|
|
102
102
|
byteorder="big",
|
|
@@ -162,17 +162,17 @@ class ExtendedPeerInfo:
|
|
|
162
162
|
class AddressManager:
|
|
163
163
|
id_count: int
|
|
164
164
|
key: int
|
|
165
|
-
random_pos:
|
|
166
|
-
tried_matrix:
|
|
167
|
-
new_matrix:
|
|
165
|
+
random_pos: list[int]
|
|
166
|
+
tried_matrix: list[list[int]]
|
|
167
|
+
new_matrix: list[list[int]]
|
|
168
168
|
tried_count: int
|
|
169
169
|
new_count: int
|
|
170
|
-
map_addr:
|
|
171
|
-
map_info:
|
|
170
|
+
map_addr: dict[str, int]
|
|
171
|
+
map_info: dict[int, ExtendedPeerInfo]
|
|
172
172
|
last_good: int
|
|
173
|
-
tried_collisions:
|
|
174
|
-
used_new_matrix_positions:
|
|
175
|
-
used_tried_matrix_positions:
|
|
173
|
+
tried_collisions: list[int]
|
|
174
|
+
used_new_matrix_positions: set[tuple[int, int]]
|
|
175
|
+
used_tried_matrix_positions: set[tuple[int, int]]
|
|
176
176
|
allow_private_subnets: bool
|
|
177
177
|
|
|
178
178
|
def __init__(self) -> None:
|
|
@@ -230,7 +230,7 @@ class AddressManager:
|
|
|
230
230
|
if self.tried_matrix[bucket][pos] != -1:
|
|
231
231
|
self.used_tried_matrix_positions.add((bucket, pos))
|
|
232
232
|
|
|
233
|
-
def create_(self, addr: TimestampedPeerInfo, addr_src: Optional[PeerInfo]) ->
|
|
233
|
+
def create_(self, addr: TimestampedPeerInfo, addr_src: Optional[PeerInfo]) -> tuple[ExtendedPeerInfo, int]:
|
|
234
234
|
self.id_count += 1
|
|
235
235
|
node_id = self.id_count
|
|
236
236
|
self.map_info[node_id] = ExtendedPeerInfo(addr, addr_src)
|
|
@@ -239,7 +239,7 @@ class AddressManager:
|
|
|
239
239
|
self.random_pos.append(node_id)
|
|
240
240
|
return (self.map_info[node_id], node_id)
|
|
241
241
|
|
|
242
|
-
def find_(self, addr: PeerInfo) ->
|
|
242
|
+
def find_(self, addr: PeerInfo) -> tuple[Optional[ExtendedPeerInfo], Optional[int]]:
|
|
243
243
|
if addr.host not in self.map_addr:
|
|
244
244
|
return (None, None)
|
|
245
245
|
node_id = self.map_addr[addr.host]
|
|
@@ -445,7 +445,7 @@ class AddressManager:
|
|
|
445
445
|
if not new_only and self.tried_count > 0 and (self.new_count == 0 or randrange(2) == 0):
|
|
446
446
|
chance = 1.0
|
|
447
447
|
start = time.time()
|
|
448
|
-
cached_tried_matrix_positions:
|
|
448
|
+
cached_tried_matrix_positions: list[tuple[int, int]] = []
|
|
449
449
|
if len(self.used_tried_matrix_positions) < math.sqrt(TRIED_BUCKET_COUNT * BUCKET_SIZE):
|
|
450
450
|
cached_tried_matrix_positions = list(self.used_tried_matrix_positions)
|
|
451
451
|
while True:
|
|
@@ -475,7 +475,7 @@ class AddressManager:
|
|
|
475
475
|
else:
|
|
476
476
|
chance = 1.0
|
|
477
477
|
start = time.time()
|
|
478
|
-
cached_new_matrix_positions:
|
|
478
|
+
cached_new_matrix_positions: list[tuple[int, int]] = []
|
|
479
479
|
if len(self.used_new_matrix_positions) < math.sqrt(NEW_BUCKET_COUNT * BUCKET_SIZE):
|
|
480
480
|
cached_new_matrix_positions = list(self.used_new_matrix_positions)
|
|
481
481
|
while True:
|
|
@@ -542,8 +542,8 @@ class AddressManager:
|
|
|
542
542
|
old_id = self.tried_matrix[tried_bucket][tried_bucket_pos]
|
|
543
543
|
return self.map_info[old_id]
|
|
544
544
|
|
|
545
|
-
def get_peers_(self) ->
|
|
546
|
-
addr:
|
|
545
|
+
def get_peers_(self) -> list[TimestampedPeerInfo]:
|
|
546
|
+
addr: list[TimestampedPeerInfo] = []
|
|
547
547
|
num_nodes = min(1000, math.ceil(23 * len(self.random_pos) / 100))
|
|
548
548
|
for n in range(len(self.random_pos)):
|
|
549
549
|
if len(addr) >= num_nodes:
|
|
@@ -596,7 +596,7 @@ class AddressManager:
|
|
|
596
596
|
|
|
597
597
|
async def add_to_new_table(
|
|
598
598
|
self,
|
|
599
|
-
addresses:
|
|
599
|
+
addresses: list[TimestampedPeerInfo],
|
|
600
600
|
source: Optional[PeerInfo] = None,
|
|
601
601
|
penalty: int = 0,
|
|
602
602
|
) -> bool:
|
|
@@ -647,7 +647,7 @@ class AddressManager:
|
|
|
647
647
|
return self.select_peer_(new_only)
|
|
648
648
|
|
|
649
649
|
# Return a bunch of addresses, selected at random.
|
|
650
|
-
async def get_peers(self) ->
|
|
650
|
+
async def get_peers(self) -> list[TimestampedPeerInfo]:
|
|
651
651
|
async with self.lock:
|
|
652
652
|
return self.get_peers_()
|
|
653
653
|
|
|
@@ -5,7 +5,7 @@ import logging
|
|
|
5
5
|
from dataclasses import dataclass
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from timeit import default_timer as timer
|
|
8
|
-
from typing import Any,
|
|
8
|
+
from typing import Any, Optional
|
|
9
9
|
|
|
10
10
|
import aiofiles
|
|
11
11
|
|
|
@@ -30,19 +30,19 @@ class PeerDataSerialization(Streamable):
|
|
|
30
30
|
Serializable property bag for the peer data that was previously stored in sqlite.
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
|
-
metadata:
|
|
34
|
-
nodes:
|
|
35
|
-
new_table:
|
|
33
|
+
metadata: list[tuple[str, str]]
|
|
34
|
+
nodes: list[tuple[uint64, str]]
|
|
35
|
+
new_table: list[tuple[uint64, uint64]]
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
async def makePeerDataSerialization(
|
|
39
|
-
metadata:
|
|
39
|
+
metadata: list[tuple[str, Any]], nodes: list[tuple[int, ExtendedPeerInfo]], new_table: list[tuple[int, int]]
|
|
40
40
|
) -> bytes:
|
|
41
41
|
"""
|
|
42
42
|
Create a PeerDataSerialization, adapting the provided collections
|
|
43
43
|
"""
|
|
44
|
-
transformed_nodes:
|
|
45
|
-
transformed_new_table:
|
|
44
|
+
transformed_nodes: list[tuple[uint64, str]] = []
|
|
45
|
+
transformed_new_table: list[tuple[uint64, uint64]] = []
|
|
46
46
|
|
|
47
47
|
for index, [node_id, peer_info] in enumerate(nodes):
|
|
48
48
|
transformed_nodes.append((uint64(node_id), peer_info.to_string()))
|
|
@@ -101,10 +101,10 @@ class AddressManagerStore:
|
|
|
101
101
|
"""
|
|
102
102
|
Serialize the address manager's peer data to a file.
|
|
103
103
|
"""
|
|
104
|
-
metadata:
|
|
105
|
-
nodes:
|
|
106
|
-
new_table_entries:
|
|
107
|
-
unique_ids:
|
|
104
|
+
metadata: list[tuple[str, str]] = []
|
|
105
|
+
nodes: list[tuple[int, ExtendedPeerInfo]] = []
|
|
106
|
+
new_table_entries: list[tuple[int, int]] = []
|
|
107
|
+
unique_ids: dict[int, int] = {}
|
|
108
108
|
count_ids: int = 0
|
|
109
109
|
|
|
110
110
|
log.info("Serializing peer data")
|
|
@@ -157,11 +157,11 @@ class AddressManagerStore:
|
|
|
157
157
|
log.exception(f"Unable to deserialize peers from {peers_file_path}")
|
|
158
158
|
|
|
159
159
|
if peer_data is not None:
|
|
160
|
-
metadata:
|
|
161
|
-
nodes:
|
|
160
|
+
metadata: dict[str, str] = {key: value for key, value in peer_data.metadata}
|
|
161
|
+
nodes: list[tuple[int, ExtendedPeerInfo]] = [
|
|
162
162
|
(node_id, ExtendedPeerInfo.from_string(info_str)) for node_id, info_str in peer_data.nodes
|
|
163
163
|
]
|
|
164
|
-
new_table_entries:
|
|
164
|
+
new_table_entries: list[tuple[int, int]] = [(node_id, bucket) for node_id, bucket in peer_data.new_table]
|
|
165
165
|
log.debug(f"Deserializing peer data took {timer() - start_time} seconds")
|
|
166
166
|
|
|
167
167
|
address_manager.key = int(metadata["key"])
|
|
@@ -226,9 +226,9 @@ class AddressManagerStore:
|
|
|
226
226
|
async def _write_peers(
|
|
227
227
|
cls,
|
|
228
228
|
peers_file_path: Path,
|
|
229
|
-
metadata:
|
|
230
|
-
nodes:
|
|
231
|
-
new_table:
|
|
229
|
+
metadata: list[tuple[str, Any]],
|
|
230
|
+
nodes: list[tuple[int, ExtendedPeerInfo]],
|
|
231
|
+
new_table: list[tuple[int, int]],
|
|
232
232
|
) -> None:
|
|
233
233
|
"""
|
|
234
234
|
Serializes the given peer data and writes it to the peers file.
|
chia/server/api_protocol.py
CHANGED
|
@@ -1,11 +1,116 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import functools
|
|
4
|
+
import logging
|
|
5
|
+
from collections.abc import Awaitable
|
|
6
|
+
from dataclasses import dataclass, field
|
|
3
7
|
from logging import Logger
|
|
8
|
+
from typing import Callable, ClassVar, Optional, TypeVar, Union, final, get_type_hints
|
|
4
9
|
|
|
5
|
-
from typing_extensions import Protocol
|
|
10
|
+
from typing_extensions import Concatenate, ParamSpec, Protocol
|
|
11
|
+
|
|
12
|
+
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
13
|
+
from chia.server.outbound_message import Message
|
|
14
|
+
from chia.util.streamable import Streamable
|
|
6
15
|
|
|
7
16
|
|
|
8
17
|
class ApiProtocol(Protocol):
|
|
9
18
|
log: Logger
|
|
19
|
+
metadata: ClassVar[ApiMetadata]
|
|
10
20
|
|
|
11
21
|
def ready(self) -> bool: ...
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
log = logging.getLogger(__name__)
|
|
25
|
+
P = ParamSpec("P")
|
|
26
|
+
R = TypeVar("R", bound=Awaitable[Optional[Message]])
|
|
27
|
+
S = TypeVar("S", bound=Streamable)
|
|
28
|
+
Self = TypeVar("Self")
|
|
29
|
+
api_attribute_name = "_chia_api"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class ApiRequest:
|
|
34
|
+
request_type: ProtocolMessageTypes
|
|
35
|
+
message_class: type[Streamable]
|
|
36
|
+
method: Callable[..., Awaitable[Optional[Message]]]
|
|
37
|
+
peer_required: bool = False
|
|
38
|
+
bytes_required: bool = False
|
|
39
|
+
execute_task: bool = False
|
|
40
|
+
reply_types: list[ProtocolMessageTypes] = field(default_factory=list)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@final
|
|
44
|
+
@dataclass
|
|
45
|
+
class ApiMetadata:
|
|
46
|
+
message_type_to_request: dict[ProtocolMessageTypes, ApiRequest] = field(default_factory=dict)
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def copy(cls, original: ApiMetadata) -> ApiMetadata:
|
|
50
|
+
return cls(message_type_to_request=dict(original.message_type_to_request))
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def from_bound_method(cls, method: Callable[..., Awaitable[Optional[Message]]]) -> ApiRequest:
|
|
54
|
+
self: ApiMetadata = getattr(method, api_attribute_name)
|
|
55
|
+
message_type = ProtocolMessageTypes[method.__name__]
|
|
56
|
+
return self.message_type_to_request[message_type]
|
|
57
|
+
|
|
58
|
+
# TODO: This hinting does not express that the returned callable *_bytes parameter
|
|
59
|
+
# corresponding to the first parameter name will be filled in by the wrapper.
|
|
60
|
+
def request(
|
|
61
|
+
self,
|
|
62
|
+
peer_required: bool = False,
|
|
63
|
+
bytes_required: bool = False,
|
|
64
|
+
execute_task: bool = False,
|
|
65
|
+
reply_types: Optional[list[ProtocolMessageTypes]] = None,
|
|
66
|
+
request_type: Optional[ProtocolMessageTypes] = None,
|
|
67
|
+
) -> Callable[[Callable[Concatenate[Self, S, P], R]], Callable[Concatenate[Self, Union[bytes, S], P], R]]:
|
|
68
|
+
non_optional_reply_types: list[ProtocolMessageTypes]
|
|
69
|
+
if reply_types is None:
|
|
70
|
+
non_optional_reply_types = []
|
|
71
|
+
else:
|
|
72
|
+
non_optional_reply_types = reply_types
|
|
73
|
+
|
|
74
|
+
def inner(f: Callable[Concatenate[Self, S, P], R]) -> Callable[Concatenate[Self, Union[bytes, S], P], R]:
|
|
75
|
+
@functools.wraps(f)
|
|
76
|
+
def wrapper(self: Self, original: Union[bytes, S], *args: P.args, **kwargs: P.kwargs) -> R:
|
|
77
|
+
arg: S
|
|
78
|
+
if isinstance(original, bytes):
|
|
79
|
+
if request.bytes_required:
|
|
80
|
+
kwargs[message_name_bytes] = original
|
|
81
|
+
arg = message_class.from_bytes(original)
|
|
82
|
+
else:
|
|
83
|
+
arg = original
|
|
84
|
+
if request.bytes_required:
|
|
85
|
+
kwargs[message_name_bytes] = bytes(original)
|
|
86
|
+
|
|
87
|
+
return f(self, arg, *args, **kwargs)
|
|
88
|
+
|
|
89
|
+
setattr(wrapper, api_attribute_name, self)
|
|
90
|
+
message_name, message_class = next(
|
|
91
|
+
(name, hint) for name, hint in get_type_hints(f).items() if name not in {"self", "peer", "return"}
|
|
92
|
+
)
|
|
93
|
+
message_name_bytes = f"{message_name}_bytes"
|
|
94
|
+
|
|
95
|
+
nonlocal request_type
|
|
96
|
+
if request_type is None:
|
|
97
|
+
request_type = ProtocolMessageTypes[f.__name__]
|
|
98
|
+
|
|
99
|
+
request = ApiRequest(
|
|
100
|
+
request_type=request_type,
|
|
101
|
+
peer_required=peer_required,
|
|
102
|
+
bytes_required=bytes_required,
|
|
103
|
+
execute_task=execute_task,
|
|
104
|
+
reply_types=non_optional_reply_types,
|
|
105
|
+
message_class=message_class,
|
|
106
|
+
method=wrapper,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
if request_type in self.message_type_to_request:
|
|
110
|
+
raise Exception(f"request type already registered: {request_type}")
|
|
111
|
+
|
|
112
|
+
self.message_type_to_request[request_type] = request
|
|
113
|
+
|
|
114
|
+
return wrapper
|
|
115
|
+
|
|
116
|
+
return inner
|
chia/server/capabilities.py
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Iterable
|
|
4
4
|
|
|
5
5
|
from chia.protocols.shared_protocol import Capability
|
|
6
6
|
from chia.util.ints import uint16
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def known_active_capabilities(values: Iterable[
|
|
9
|
+
def known_active_capabilities(values: Iterable[tuple[uint16, str]]) -> list[Capability]:
|
|
10
10
|
# NOTE: order is not guaranteed
|
|
11
11
|
# TODO: what if there's a claim for both supporting and not?
|
|
12
12
|
# presently it considers it supported
|
|
13
|
-
filtered:
|
|
13
|
+
filtered: set[Capability] = set()
|
|
14
14
|
for value, state in values:
|
|
15
15
|
if state != "1":
|
|
16
16
|
continue
|
chia/server/chia_policy.py
CHANGED
|
@@ -11,7 +11,8 @@ if sys.platform == "win32":
|
|
|
11
11
|
import _overlapped
|
|
12
12
|
import _winapi
|
|
13
13
|
|
|
14
|
-
from
|
|
14
|
+
from collections.abc import Iterable
|
|
15
|
+
from typing import TYPE_CHECKING, Any, Callable, Optional, Union
|
|
15
16
|
|
|
16
17
|
from typing_extensions import Protocol, TypeAlias
|
|
17
18
|
|
|
@@ -30,7 +31,7 @@ if TYPE_CHECKING:
|
|
|
30
31
|
# https://github.com/python/typeshed/pull/5718/files
|
|
31
32
|
def __call__(self) -> asyncio.protocols.BaseProtocol: ...
|
|
32
33
|
|
|
33
|
-
_SSLContext: TypeAlias = Union[bool,
|
|
34
|
+
_SSLContext: TypeAlias = Union[bool, ssl.SSLContext, None]
|
|
34
35
|
|
|
35
36
|
# https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/base_events.py#L389
|
|
36
37
|
# https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/base_events.pyi#L64
|
|
@@ -83,7 +84,7 @@ if TYPE_CHECKING:
|
|
|
83
84
|
self,
|
|
84
85
|
ov: _overlapped.Overlapped,
|
|
85
86
|
obj: socket.socket,
|
|
86
|
-
callback: Callable[[object, socket.socket, _overlapped.Overlapped],
|
|
87
|
+
callback: Callable[[object, socket.socket, _overlapped.Overlapped], tuple[socket.socket, object]],
|
|
87
88
|
) -> _OverlappedFuture: ...
|
|
88
89
|
|
|
89
90
|
def _get_accept_socket(self, family: socket.AddressFamily) -> socket.socket: ...
|
|
@@ -251,30 +252,30 @@ if sys.platform == "win32":
|
|
|
251
252
|
def disable_connections(self) -> None:
|
|
252
253
|
self.allow_connections = False
|
|
253
254
|
|
|
254
|
-
async def _chia_accept_loop(self, listener: socket.socket) ->
|
|
255
|
+
async def _chia_accept_loop(self, listener: socket.socket) -> tuple[socket.socket, tuple[object, ...]]:
|
|
255
256
|
while True:
|
|
256
|
-
# TODO: switch to
|
|
257
|
-
while not self.allow_connections:
|
|
257
|
+
# TODO: switch to event drive code
|
|
258
|
+
while not self.allow_connections: # noqa: ASYNC110
|
|
258
259
|
await asyncio.sleep(0.01)
|
|
259
260
|
|
|
260
261
|
try:
|
|
261
262
|
return await self._chia_accept(listener)
|
|
262
263
|
except OSError as exc:
|
|
263
|
-
if exc.winerror not in
|
|
264
|
+
if exc.winerror not in {
|
|
264
265
|
_winapi.ERROR_NETNAME_DELETED,
|
|
265
266
|
_winapi.ERROR_OPERATION_ABORTED,
|
|
266
|
-
|
|
267
|
+
}:
|
|
267
268
|
raise
|
|
268
269
|
|
|
269
|
-
def _chia_accept(self, listener: socket.socket) -> asyncio.Future[
|
|
270
|
+
def _chia_accept(self, listener: socket.socket) -> asyncio.Future[tuple[socket.socket, tuple[object, ...]]]:
|
|
270
271
|
self._register_with_iocp(listener)
|
|
271
|
-
conn = self._get_accept_socket(listener.family)
|
|
272
|
+
conn = self._get_accept_socket(listener.family)
|
|
272
273
|
ov = _overlapped.Overlapped(_winapi.NULL)
|
|
273
274
|
ov.AcceptEx(listener.fileno(), conn.fileno())
|
|
274
275
|
|
|
275
276
|
def finish_accept(
|
|
276
277
|
trans: object, key: socket.socket, ov: _overlapped.Overlapped
|
|
277
|
-
) ->
|
|
278
|
+
) -> tuple[socket.socket, object]:
|
|
278
279
|
ov.getresult()
|
|
279
280
|
# Use SO_UPDATE_ACCEPT_CONTEXT so getsockname() etc work.
|
|
280
281
|
buf = struct.pack("@P", listener.fileno())
|
|
@@ -291,18 +292,18 @@ if sys.platform == "win32":
|
|
|
291
292
|
raise
|
|
292
293
|
except OSError as exc:
|
|
293
294
|
# https://github.com/python/cpython/issues/93821#issuecomment-1157945855
|
|
294
|
-
if exc.winerror not in
|
|
295
|
+
if exc.winerror not in {
|
|
295
296
|
_winapi.ERROR_NETNAME_DELETED,
|
|
296
297
|
_winapi.ERROR_OPERATION_ABORTED,
|
|
297
|
-
|
|
298
|
+
}:
|
|
298
299
|
raise
|
|
299
300
|
|
|
300
|
-
future = self._register(ov, listener, finish_accept)
|
|
301
|
+
future = self._register(ov, listener, finish_accept)
|
|
301
302
|
coro = accept_coro(self, future, conn)
|
|
302
|
-
asyncio.ensure_future(coro, loop=self._loop)
|
|
303
|
+
asyncio.ensure_future(coro, loop=self._loop) # noqa: RUF006
|
|
303
304
|
return future
|
|
304
305
|
|
|
305
|
-
def accept(self, listener: socket.socket) -> asyncio.Future[
|
|
306
|
+
def accept(self, listener: socket.socket) -> asyncio.Future[tuple[socket.socket, tuple[object, ...]]]:
|
|
306
307
|
coro = self._chia_accept_loop(listener)
|
|
307
308
|
return asyncio.ensure_future(coro)
|
|
308
309
|
|
chia/server/introducer_peers.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import random
|
|
4
4
|
import time
|
|
5
5
|
from dataclasses import dataclass
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional
|
|
7
7
|
|
|
8
8
|
from chia.types.peer_info import PeerInfo
|
|
9
9
|
from chia.util.ints import uint16, uint64
|
|
@@ -40,7 +40,7 @@ class IntroducerPeers:
|
|
|
40
40
|
"""
|
|
41
41
|
|
|
42
42
|
def __init__(self) -> None:
|
|
43
|
-
self._peers:
|
|
43
|
+
self._peers: set[VettedPeer] = set()
|
|
44
44
|
|
|
45
45
|
def add(self, peer: Optional[PeerInfo]) -> bool:
|
|
46
46
|
if peer is None or not peer.port:
|
|
@@ -66,7 +66,7 @@ class IntroducerPeers:
|
|
|
66
66
|
|
|
67
67
|
def get_peers(
|
|
68
68
|
self, max_peers: int = 0, randomize: bool = False, recent_threshold: float = 9999999
|
|
69
|
-
) ->
|
|
69
|
+
) -> list[VettedPeer]:
|
|
70
70
|
target_peers = [peer for peer in self._peers if time.time() - float(peer.time_added) < recent_threshold]
|
|
71
71
|
if not max_peers or max_peers > len(target_peers):
|
|
72
72
|
max_peers = len(target_peers)
|