chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_blockchain_transactions.py +5 -2
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +66 -31
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +273 -70
- chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
- chia/_tests/core/mempool/test_mempool.py +54 -50
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +988 -854
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +9 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +16 -15
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +374 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- 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/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +19 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +50 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +239 -223
- chia/full_node/full_node_api.py +197 -152
- chia/full_node/full_node_rpc_api.py +34 -32
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hard_fork_utils.py +44 -0
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +120 -36
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +4 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +24 -10
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +142 -106
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
chia/server/api_protocol.py
CHANGED
|
@@ -2,12 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import functools
|
|
4
4
|
import logging
|
|
5
|
-
from collections.abc import Awaitable
|
|
5
|
+
from collections.abc import Awaitable, Callable
|
|
6
6
|
from dataclasses import dataclass, field
|
|
7
7
|
from logging import Logger
|
|
8
|
-
from typing import
|
|
8
|
+
from typing import ClassVar, Concatenate, TypeVar, final, get_type_hints
|
|
9
9
|
|
|
10
|
-
from typing_extensions import
|
|
10
|
+
from typing_extensions import ParamSpec, Protocol
|
|
11
11
|
|
|
12
12
|
from chia.protocols.outbound_message import Message
|
|
13
13
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
@@ -23,7 +23,7 @@ class ApiProtocol(Protocol):
|
|
|
23
23
|
|
|
24
24
|
log = logging.getLogger(__name__)
|
|
25
25
|
P = ParamSpec("P")
|
|
26
|
-
R = TypeVar("R", bound=Awaitable[
|
|
26
|
+
R = TypeVar("R", bound=Awaitable[Message | None])
|
|
27
27
|
S = TypeVar("S", bound=Streamable)
|
|
28
28
|
Self = TypeVar("Self")
|
|
29
29
|
api_attribute_name = "_chia_api"
|
|
@@ -33,7 +33,7 @@ api_attribute_name = "_chia_api"
|
|
|
33
33
|
class ApiRequest:
|
|
34
34
|
request_type: ProtocolMessageTypes
|
|
35
35
|
message_class: type[Streamable]
|
|
36
|
-
method: Callable[..., Awaitable[
|
|
36
|
+
method: Callable[..., Awaitable[Message | None]]
|
|
37
37
|
peer_required: bool = False
|
|
38
38
|
bytes_required: bool = False
|
|
39
39
|
execute_task: bool = False
|
|
@@ -50,7 +50,7 @@ class ApiMetadata:
|
|
|
50
50
|
return cls(message_type_to_request=dict(original.message_type_to_request))
|
|
51
51
|
|
|
52
52
|
@classmethod
|
|
53
|
-
def from_bound_method(cls, method: Callable[..., Awaitable[
|
|
53
|
+
def from_bound_method(cls, method: Callable[..., Awaitable[Message | None]]) -> ApiRequest:
|
|
54
54
|
self: ApiMetadata = getattr(method, api_attribute_name)
|
|
55
55
|
message_type = ProtocolMessageTypes[method.__name__]
|
|
56
56
|
return self.message_type_to_request[message_type]
|
|
@@ -62,18 +62,18 @@ class ApiMetadata:
|
|
|
62
62
|
peer_required: bool = False,
|
|
63
63
|
bytes_required: bool = False,
|
|
64
64
|
execute_task: bool = False,
|
|
65
|
-
reply_types:
|
|
66
|
-
request_type:
|
|
67
|
-
) -> Callable[[Callable[Concatenate[Self, S, P], R]], Callable[Concatenate[Self,
|
|
65
|
+
reply_types: list[ProtocolMessageTypes] | None = None,
|
|
66
|
+
request_type: ProtocolMessageTypes | None = None,
|
|
67
|
+
) -> Callable[[Callable[Concatenate[Self, S, P], R]], Callable[Concatenate[Self, bytes | S, P], R]]:
|
|
68
68
|
non_optional_reply_types: list[ProtocolMessageTypes]
|
|
69
69
|
if reply_types is None:
|
|
70
70
|
non_optional_reply_types = []
|
|
71
71
|
else:
|
|
72
72
|
non_optional_reply_types = reply_types
|
|
73
73
|
|
|
74
|
-
def inner(f: Callable[Concatenate[Self, S, P], R]) -> Callable[Concatenate[Self,
|
|
74
|
+
def inner(f: Callable[Concatenate[Self, S, P], R]) -> Callable[Concatenate[Self, bytes | S, P], R]:
|
|
75
75
|
@functools.wraps(f)
|
|
76
|
-
def wrapper(self: Self, original:
|
|
76
|
+
def wrapper(self: Self, original: bytes | S, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
77
77
|
arg: S
|
|
78
78
|
if isinstance(original, bytes):
|
|
79
79
|
if request.bytes_required:
|
chia/server/chia_policy.py
CHANGED
|
@@ -6,15 +6,16 @@ import socket
|
|
|
6
6
|
import ssl
|
|
7
7
|
import struct
|
|
8
8
|
import sys
|
|
9
|
+
import weakref
|
|
9
10
|
|
|
10
11
|
if sys.platform == "win32":
|
|
11
12
|
import _overlapped # type: ignore[import-not-found]
|
|
12
13
|
import _winapi
|
|
13
14
|
|
|
14
|
-
from collections.abc import Iterable
|
|
15
|
-
from typing import TYPE_CHECKING, Any,
|
|
15
|
+
from collections.abc import Callable, Iterable
|
|
16
|
+
from typing import TYPE_CHECKING, Any, TypeAlias
|
|
16
17
|
|
|
17
|
-
from typing_extensions import Protocol
|
|
18
|
+
from typing_extensions import Protocol
|
|
18
19
|
|
|
19
20
|
# https://github.com/python/asyncio/pull/448
|
|
20
21
|
global_max_concurrent_connections: int = 250
|
|
@@ -31,7 +32,7 @@ if TYPE_CHECKING:
|
|
|
31
32
|
# https://github.com/python/typeshed/pull/5718/files
|
|
32
33
|
def __call__(self) -> asyncio.protocols.BaseProtocol: ...
|
|
33
34
|
|
|
34
|
-
_SSLContext: TypeAlias =
|
|
35
|
+
_SSLContext: TypeAlias = bool | ssl.SSLContext | None
|
|
35
36
|
|
|
36
37
|
# https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/base_events.py#L389
|
|
37
38
|
# https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/base_events.pyi#L64
|
|
@@ -42,11 +43,11 @@ if TYPE_CHECKING:
|
|
|
42
43
|
self,
|
|
43
44
|
protocol_factory: _ProtocolFactory,
|
|
44
45
|
sock: socket.socket,
|
|
45
|
-
sslcontext:
|
|
46
|
-
server:
|
|
46
|
+
sslcontext: _SSLContext | None = ...,
|
|
47
|
+
server: asyncio.base_events.Server | None = ...,
|
|
47
48
|
backlog: int = ...,
|
|
48
49
|
# https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/constants.py#L16
|
|
49
|
-
ssl_handshake_timeout:
|
|
50
|
+
ssl_handshake_timeout: float | None = ...,
|
|
50
51
|
) -> None: ...
|
|
51
52
|
|
|
52
53
|
# https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/base_events.py#L278
|
|
@@ -57,15 +58,26 @@ if TYPE_CHECKING:
|
|
|
57
58
|
else:
|
|
58
59
|
_loop: EventsAbstractEventLoop
|
|
59
60
|
_sockets: Iterable[socket.socket]
|
|
60
|
-
|
|
61
|
+
if sys.version_info >= (3, 13):
|
|
62
|
+
# https://github.com/python/cpython/blob/v3.13.7/Lib/asyncio/base_events.py#L283
|
|
63
|
+
_clients: weakref.WeakSet[object]
|
|
64
|
+
else:
|
|
65
|
+
_active_count: int
|
|
61
66
|
_protocol_factory: _ProtocolFactory
|
|
62
67
|
_backlog: int
|
|
63
68
|
_ssl_context: _SSLContext
|
|
64
|
-
_ssl_handshake_timeout:
|
|
69
|
+
_ssl_handshake_timeout: float | None
|
|
70
|
+
|
|
71
|
+
if sys.version_info >= (3, 13):
|
|
72
|
+
# https://github.com/python/cpython/blob/bcee1c322115c581da27600f2ae55e5439c027eb/Lib/asyncio/base_events.py#L296
|
|
73
|
+
def _attach(self, transport: object) -> None: ...
|
|
74
|
+
|
|
75
|
+
def _detach(self, transport: object) -> None: ...
|
|
76
|
+
else:
|
|
65
77
|
|
|
66
|
-
|
|
78
|
+
def _attach(self) -> None: ...
|
|
67
79
|
|
|
68
|
-
|
|
80
|
+
def _detach(self) -> None: ...
|
|
69
81
|
|
|
70
82
|
def _start_serving(self) -> None: ...
|
|
71
83
|
|
|
@@ -76,7 +88,7 @@ if TYPE_CHECKING:
|
|
|
76
88
|
# https://github.com/python/cpython/blob/v3.10.8/Lib/asyncio/windows_events.py#L410
|
|
77
89
|
# https://github.com/python/typeshed/blob/d084079fc3d89a7b51b89095ad67762944e0ace3/stdlib/asyncio/windows_events.pyi#L44
|
|
78
90
|
class IocpProactor(asyncio.windows_events.IocpProactor):
|
|
79
|
-
_loop:
|
|
91
|
+
_loop: asyncio.events.AbstractEventLoop | None
|
|
80
92
|
|
|
81
93
|
def _register_with_iocp(self, obj: object) -> None: ...
|
|
82
94
|
|
|
@@ -116,8 +128,8 @@ class PausableServer(BaseEventsServer):
|
|
|
116
128
|
protocol_factory: _ProtocolFactory,
|
|
117
129
|
ssl_context: _SSLContext,
|
|
118
130
|
backlog: int,
|
|
119
|
-
ssl_handshake_timeout:
|
|
120
|
-
max_concurrent_connections:
|
|
131
|
+
ssl_handshake_timeout: float | None,
|
|
132
|
+
max_concurrent_connections: int | None = None,
|
|
121
133
|
) -> None:
|
|
122
134
|
super().__init__(
|
|
123
135
|
loop=loop,
|
|
@@ -132,20 +144,22 @@ class PausableServer(BaseEventsServer):
|
|
|
132
144
|
max_concurrent_connections if max_concurrent_connections is not None else global_max_concurrent_connections
|
|
133
145
|
)
|
|
134
146
|
|
|
135
|
-
def _attach(self) -> None:
|
|
136
|
-
super()._attach()
|
|
137
|
-
|
|
138
|
-
|
|
147
|
+
def _attach(self, *args: object, **kwargs: object) -> None:
|
|
148
|
+
super()._attach(*args, **kwargs)
|
|
149
|
+
active_connections = self._chia_active_connections()
|
|
150
|
+
logging.getLogger(__name__).debug(f"New connection. Total connections: {active_connections}")
|
|
151
|
+
if not self._paused and active_connections >= self.max_concurrent_connections:
|
|
139
152
|
self._chia_pause()
|
|
140
153
|
|
|
141
|
-
def _detach(self) -> None:
|
|
142
|
-
super()._detach()
|
|
143
|
-
|
|
154
|
+
def _detach(self, *args: object, **kwargs: object) -> None:
|
|
155
|
+
super()._detach(*args, **kwargs)
|
|
156
|
+
active_connections = self._chia_active_connections()
|
|
157
|
+
logging.getLogger(__name__).debug(f"Connection lost. Total connections: {active_connections}")
|
|
144
158
|
if (
|
|
145
|
-
|
|
159
|
+
active_connections > 0
|
|
146
160
|
and self._sockets is not None
|
|
147
161
|
and self._paused
|
|
148
|
-
and
|
|
162
|
+
and active_connections < self.max_concurrent_connections
|
|
149
163
|
):
|
|
150
164
|
self._chia_resume()
|
|
151
165
|
|
|
@@ -180,6 +194,12 @@ class PausableServer(BaseEventsServer):
|
|
|
180
194
|
)
|
|
181
195
|
logging.getLogger(__name__).debug("Resumed accepting connections.")
|
|
182
196
|
|
|
197
|
+
def _chia_active_connections(self) -> int:
|
|
198
|
+
if sys.version_info >= (3, 13):
|
|
199
|
+
return len(self._clients)
|
|
200
|
+
else:
|
|
201
|
+
return self._active_count
|
|
202
|
+
|
|
183
203
|
|
|
184
204
|
async def _chia_create_server(
|
|
185
205
|
cls: Any,
|
|
@@ -192,9 +212,9 @@ async def _chia_create_server(
|
|
|
192
212
|
sock: Any = None,
|
|
193
213
|
backlog: int = 100,
|
|
194
214
|
ssl: _SSLContext = None,
|
|
195
|
-
reuse_address:
|
|
196
|
-
reuse_port:
|
|
197
|
-
ssl_handshake_timeout:
|
|
215
|
+
reuse_address: bool | None = None,
|
|
216
|
+
reuse_port: bool | None = None,
|
|
217
|
+
ssl_handshake_timeout: float | None = 30,
|
|
198
218
|
start_serving: bool = True,
|
|
199
219
|
) -> PausableServer:
|
|
200
220
|
server: BaseEventsServer = await cls.create_server(
|
chia/server/introducer_peers.py
CHANGED
|
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|
|
3
3
|
import random
|
|
4
4
|
import time
|
|
5
5
|
from dataclasses import dataclass
|
|
6
|
-
from typing import Optional
|
|
7
6
|
|
|
8
7
|
from chia_rs.sized_ints import uint16, uint64
|
|
9
8
|
|
|
@@ -43,7 +42,7 @@ class IntroducerPeers:
|
|
|
43
42
|
def __init__(self) -> None:
|
|
44
43
|
self._peers: set[VettedPeer] = set()
|
|
45
44
|
|
|
46
|
-
def add(self, peer:
|
|
45
|
+
def add(self, peer: PeerInfo | None) -> bool:
|
|
47
46
|
if peer is None or not peer.port:
|
|
48
47
|
return False
|
|
49
48
|
|
|
@@ -56,7 +55,7 @@ class IntroducerPeers:
|
|
|
56
55
|
self._peers.add(p)
|
|
57
56
|
return True
|
|
58
57
|
|
|
59
|
-
def remove(self, peer:
|
|
58
|
+
def remove(self, peer: VettedPeer | None) -> bool:
|
|
60
59
|
if peer is None or not peer.port:
|
|
61
60
|
return False
|
|
62
61
|
try:
|
chia/server/node_discovery.py
CHANGED
|
@@ -11,7 +11,7 @@ from dataclasses import dataclass, field
|
|
|
11
11
|
from logging import Logger
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
from random import Random
|
|
14
|
-
from typing import Any
|
|
14
|
+
from typing import Any
|
|
15
15
|
|
|
16
16
|
import dns.asyncresolver
|
|
17
17
|
from chia_rs.sized_ints import uint16, uint64
|
|
@@ -51,24 +51,24 @@ class FullNodeDiscovery:
|
|
|
51
51
|
peer_connect_interval: int
|
|
52
52
|
selected_network: str
|
|
53
53
|
log: Logger
|
|
54
|
-
introducer_info:
|
|
55
|
-
default_port:
|
|
56
|
-
resolver:
|
|
54
|
+
introducer_info: dict[str, Any] | None = None
|
|
55
|
+
default_port: int | None = None
|
|
56
|
+
resolver: dns.asyncresolver.Resolver | None = field(default=None)
|
|
57
57
|
enable_private_networks: bool = field(default=False)
|
|
58
58
|
is_closed: bool = field(default=False)
|
|
59
59
|
legacy_peer_db_migrated: bool = field(default=False)
|
|
60
|
-
relay_queue:
|
|
61
|
-
address_manager:
|
|
60
|
+
relay_queue: asyncio.Queue[tuple[TimestampedPeerInfo, int]] | None = field(default=None)
|
|
61
|
+
address_manager: AddressManager | None = field(default=None)
|
|
62
62
|
connection_time_pretest: dict[str, Any] = field(default_factory=dict)
|
|
63
63
|
received_count_from_peers: dict[str, Any] = field(default_factory=dict)
|
|
64
64
|
lock: asyncio.Lock = field(default_factory=asyncio.Lock)
|
|
65
|
-
connect_peers_task:
|
|
66
|
-
serialize_task:
|
|
67
|
-
cleanup_task:
|
|
65
|
+
connect_peers_task: asyncio.Task[None] | None = field(default=None)
|
|
66
|
+
serialize_task: asyncio.Task[None] | None = field(default=None)
|
|
67
|
+
cleanup_task: asyncio.Task[None] | None = field(default=None)
|
|
68
68
|
initial_wait: int = field(default=0)
|
|
69
69
|
pending_outbound_connections: set[str] = field(default_factory=set)
|
|
70
70
|
pending_tasks: set[asyncio.Task[None]] = field(default_factory=set)
|
|
71
|
-
introducer_info_obj:
|
|
71
|
+
introducer_info_obj: UnresolvedPeerInfo | None = field(default=None)
|
|
72
72
|
|
|
73
73
|
def __post_init__(self) -> None:
|
|
74
74
|
random.shuffle(self.dns_servers) # Don't always start with the same DNS server
|
|
@@ -245,7 +245,7 @@ class FullNodeDiscovery:
|
|
|
245
245
|
retry_introducers = False
|
|
246
246
|
dns_server_index: int = 0
|
|
247
247
|
tried_all_dns_servers: bool = False
|
|
248
|
-
local_peerinfo:
|
|
248
|
+
local_peerinfo: PeerInfo | None = await self.server.get_peer_info()
|
|
249
249
|
last_timestamp_local_info: uint64 = uint64(time.time())
|
|
250
250
|
last_collision_timestamp = 0
|
|
251
251
|
|
|
@@ -327,7 +327,7 @@ class FullNodeDiscovery:
|
|
|
327
327
|
tries = 0
|
|
328
328
|
now = time.time()
|
|
329
329
|
got_peer = False
|
|
330
|
-
addr:
|
|
330
|
+
addr: PeerInfo | None = None
|
|
331
331
|
max_tries = 50
|
|
332
332
|
if len(groups) < 3:
|
|
333
333
|
max_tries = 10
|
|
@@ -345,7 +345,7 @@ class FullNodeDiscovery:
|
|
|
345
345
|
addr = None
|
|
346
346
|
retry_introducers = True
|
|
347
347
|
break
|
|
348
|
-
info:
|
|
348
|
+
info: ExtendedPeerInfo | None = await self.address_manager.select_tried_collision()
|
|
349
349
|
if info is None or time.time() - last_collision_timestamp <= 60:
|
|
350
350
|
info = await self.address_manager.select_peer(is_feeler)
|
|
351
351
|
else:
|
|
@@ -440,7 +440,7 @@ class FullNodeDiscovery:
|
|
|
440
440
|
return port in NETWORK_ID_DEFAULT_PORTS.values() and port != self.default_port
|
|
441
441
|
|
|
442
442
|
async def _add_peers_common(
|
|
443
|
-
self, peer_list: list[TimestampedPeerInfo], peer_src:
|
|
443
|
+
self, peer_list: list[TimestampedPeerInfo], peer_src: PeerInfo | None, is_full_node: bool
|
|
444
444
|
) -> None:
|
|
445
445
|
# Check if we got the peers from a full node or from the introducer.
|
|
446
446
|
peers_adjusted_timestamp = []
|
|
@@ -488,8 +488,8 @@ class FullNodeDiscovery:
|
|
|
488
488
|
|
|
489
489
|
@dataclass
|
|
490
490
|
class FullNodePeers(FullNodeDiscovery):
|
|
491
|
-
self_advertise_task:
|
|
492
|
-
address_relay_task:
|
|
491
|
+
self_advertise_task: asyncio.Task[None] | None = field(default=None)
|
|
492
|
+
address_relay_task: asyncio.Task[None] | None = field(default=None)
|
|
493
493
|
relay_queue: asyncio.Queue[tuple[TimestampedPeerInfo, int]] = field(default_factory=asyncio.Queue)
|
|
494
494
|
neighbour_known_peers: dict[PeerInfo, set[str]] = field(default_factory=dict)
|
|
495
495
|
key: int = field(default_factory=lambda: random.getrandbits(256))
|
|
@@ -557,7 +557,7 @@ class FullNodePeers(FullNodeDiscovery):
|
|
|
557
557
|
if peer.host not in self.neighbour_known_peers[neighbour_info]:
|
|
558
558
|
self.neighbour_known_peers[neighbour_info].add(peer.host)
|
|
559
559
|
|
|
560
|
-
async def request_peers(self, peer_info: PeerInfo) ->
|
|
560
|
+
async def request_peers(self, peer_info: PeerInfo) -> Message | None:
|
|
561
561
|
try:
|
|
562
562
|
# Prevent a fingerprint attack: do not send peers to inbound connections.
|
|
563
563
|
# This asymmetric behavior for inbound and outbound connections was introduced
|
|
@@ -582,7 +582,7 @@ class FullNodePeers(FullNodeDiscovery):
|
|
|
582
582
|
return None
|
|
583
583
|
|
|
584
584
|
async def add_peers(
|
|
585
|
-
self, peer_list: list[TimestampedPeerInfo], peer_src:
|
|
585
|
+
self, peer_list: list[TimestampedPeerInfo], peer_src: PeerInfo | None, is_full_node: bool
|
|
586
586
|
) -> None:
|
|
587
587
|
try:
|
|
588
588
|
await self._add_peers_common(peer_list, peer_src, is_full_node)
|
|
@@ -671,6 +671,6 @@ class WalletPeers(FullNodeDiscovery):
|
|
|
671
671
|
await self._close_common()
|
|
672
672
|
|
|
673
673
|
async def add_peers(
|
|
674
|
-
self, peer_list: list[TimestampedPeerInfo], peer_src:
|
|
674
|
+
self, peer_list: list[TimestampedPeerInfo], peer_src: PeerInfo | None, is_full_node: bool
|
|
675
675
|
) -> None:
|
|
676
676
|
await self._add_peers_common(peer_list, peer_src, is_full_node)
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
4
|
import dataclasses
|
|
5
|
-
from typing import Optional, Union
|
|
6
5
|
|
|
7
6
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
8
7
|
from chia.protocols.shared_protocol import Capability
|
|
9
8
|
|
|
10
|
-
compose_rate_limits_cache: dict[int, dict[ProtocolMessageTypes,
|
|
9
|
+
compose_rate_limits_cache: dict[int, dict[ProtocolMessageTypes, RLSettings | Unlimited]] = {}
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
# this class is used to configure the *rate* limit for a message type. The
|
|
@@ -19,7 +18,7 @@ class RLSettings:
|
|
|
19
18
|
aggregate_limit: bool
|
|
20
19
|
frequency: int # Max request per time period (ie 1 min)
|
|
21
20
|
max_size: int # Max size of each request
|
|
22
|
-
max_total_size:
|
|
21
|
+
max_total_size: int | None = None # Max cumulative size of all requests in that period
|
|
23
22
|
|
|
24
23
|
|
|
25
24
|
# this class is used to indicate that a message type is not subject to a rate
|
|
@@ -43,7 +42,7 @@ aggregate_limit = RLSettings(
|
|
|
43
42
|
|
|
44
43
|
def get_rate_limits_to_use(
|
|
45
44
|
our_capabilities: list[Capability], peer_capabilities: list[Capability]
|
|
46
|
-
) -> tuple[dict[ProtocolMessageTypes,
|
|
45
|
+
) -> tuple[dict[ProtocolMessageTypes, RLSettings | Unlimited], RLSettings]:
|
|
47
46
|
# This will use the newest possible rate limits that both peers support. At this time there are only two
|
|
48
47
|
# options, v1 and v2.
|
|
49
48
|
|
|
@@ -64,7 +63,7 @@ def get_rate_limits_to_use(
|
|
|
64
63
|
|
|
65
64
|
# Each number in this dict corresponds to a specific version of rate limits (1, 2, etc).
|
|
66
65
|
# Version 1 includes the original limits for chia software from versions 1.0 to 1.4.
|
|
67
|
-
rate_limits: dict[int, dict[ProtocolMessageTypes,
|
|
66
|
+
rate_limits: dict[int, dict[ProtocolMessageTypes, RLSettings | Unlimited]] = {
|
|
68
67
|
1: {
|
|
69
68
|
ProtocolMessageTypes.new_transaction: RLSettings(False, 5000, 100, 5000 * 100),
|
|
70
69
|
ProtocolMessageTypes.request_transaction: RLSettings(False, 5000, 100, 5000 * 100),
|
chia/server/rate_limits.py
CHANGED
|
@@ -4,7 +4,7 @@ import dataclasses
|
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
6
|
from collections import Counter
|
|
7
|
-
from
|
|
7
|
+
from collections.abc import Callable
|
|
8
8
|
|
|
9
9
|
from chia.protocols.outbound_message import Message
|
|
10
10
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
@@ -53,7 +53,7 @@ class RateLimiter:
|
|
|
53
53
|
|
|
54
54
|
def process_msg_and_check(
|
|
55
55
|
self, message: Message, our_capabilities: list[Capability], peer_capabilities: list[Capability]
|
|
56
|
-
) ->
|
|
56
|
+
) -> str | None:
|
|
57
57
|
"""
|
|
58
58
|
Returns a string indicating which limit was hit if a rate limit is
|
|
59
59
|
exceeded, and the message should be blocked. Returns None if the limit was not
|
|
@@ -80,11 +80,11 @@ class RateLimiter:
|
|
|
80
80
|
proportion_of_limit: float = self.percentage_of_limit / 100
|
|
81
81
|
|
|
82
82
|
ret: bool = False
|
|
83
|
-
rate_limits: dict[ProtocolMessageTypes,
|
|
83
|
+
rate_limits: dict[ProtocolMessageTypes, RLSettings | Unlimited]
|
|
84
84
|
rate_limits, agg_limit = get_rate_limits_to_use(our_capabilities, peer_capabilities)
|
|
85
85
|
|
|
86
86
|
try:
|
|
87
|
-
limits:
|
|
87
|
+
limits: RLSettings | Unlimited = rate_limits[message_type]
|
|
88
88
|
if isinstance(limits, RLSettings) and limits.aggregate_limit:
|
|
89
89
|
non_tx_freq = agg_limit.frequency
|
|
90
90
|
assert agg_limit.max_total_size is not None
|
chia/server/resolve_peer_info.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
from chia.protocols.outbound_message import NodeType
|
|
7
7
|
from chia.types.peer_info import UnresolvedPeerInfo
|
|
@@ -18,7 +18,7 @@ PEER_INFO_MAPPING: dict[NodeType, str] = {
|
|
|
18
18
|
def get_unresolved_peer_infos(service_config: dict[str, Any], peer_type: NodeType) -> set[UnresolvedPeerInfo]:
|
|
19
19
|
peer_info_key = PEER_INFO_MAPPING[peer_type]
|
|
20
20
|
peer_infos: list[dict[str, Any]] = service_config.get(f"{peer_info_key}s", [])
|
|
21
|
-
peer_info:
|
|
21
|
+
peer_info: dict[str, Any] | None = service_config.get(peer_info_key)
|
|
22
22
|
if peer_info is not None:
|
|
23
23
|
peer_infos.append(peer_info)
|
|
24
24
|
|
|
@@ -32,8 +32,8 @@ def get_unresolved_peer_infos(service_config: dict[str, Any], peer_type: NodeTyp
|
|
|
32
32
|
def set_peer_info(
|
|
33
33
|
service_config: dict[str, Any],
|
|
34
34
|
peer_type: NodeType,
|
|
35
|
-
peer_host:
|
|
36
|
-
peer_port:
|
|
35
|
+
peer_host: str | None = None,
|
|
36
|
+
peer_port: int | None = None,
|
|
37
37
|
) -> None:
|
|
38
38
|
peer_info_key = PEER_INFO_MAPPING[peer_type]
|
|
39
39
|
if peer_info_key in service_config:
|