chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
import pytest
|
|
7
6
|
|
|
8
7
|
from chia._tests.conftest import node_with_params
|
|
8
|
+
from chia._tests.util.time_out_assert import time_out_assert
|
|
9
|
+
from chia.protocols.full_node_protocol import RejectBlock, RejectBlocks, RespondBlock, RespondBlocks
|
|
9
10
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
10
11
|
from chia.protocols.shared_protocol import Capability
|
|
11
12
|
from chia.server.outbound_message import make_msg
|
|
@@ -14,12 +15,14 @@ from chia.server.rate_limit_numbers import rate_limits as rl_numbers
|
|
|
14
15
|
from chia.server.rate_limits import RateLimiter
|
|
15
16
|
from chia.server.server import ChiaServer
|
|
16
17
|
from chia.server.ws_connection import WSChiaConnection
|
|
18
|
+
from chia.simulator.block_tools import BlockTools
|
|
17
19
|
from chia.types.peer_info import PeerInfo
|
|
20
|
+
from chia.util.ints import uint32
|
|
18
21
|
|
|
19
22
|
rl_v2 = [Capability.BASE, Capability.BLOCK_HEADERS, Capability.RATE_LIMITS_V2]
|
|
20
23
|
rl_v1 = [Capability.BASE]
|
|
21
24
|
node_with_params_b = node_with_params
|
|
22
|
-
test_different_versions_results:
|
|
25
|
+
test_different_versions_results: list[int] = []
|
|
23
26
|
|
|
24
27
|
|
|
25
28
|
class TestRateLimits:
|
|
@@ -35,12 +38,12 @@ class TestRateLimits:
|
|
|
35
38
|
r = RateLimiter(incoming=True)
|
|
36
39
|
new_tx_message = make_msg(ProtocolMessageTypes.new_transaction, bytes([1] * 40))
|
|
37
40
|
for i in range(4999):
|
|
38
|
-
assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
|
|
41
|
+
assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2) is None
|
|
39
42
|
|
|
40
43
|
saw_disconnect = False
|
|
41
44
|
for i in range(4999):
|
|
42
45
|
response = r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
|
|
43
|
-
if not
|
|
46
|
+
if response is not None:
|
|
44
47
|
saw_disconnect = True
|
|
45
48
|
assert saw_disconnect
|
|
46
49
|
|
|
@@ -48,12 +51,12 @@ class TestRateLimits:
|
|
|
48
51
|
r = RateLimiter(incoming=True)
|
|
49
52
|
new_peak_message = make_msg(ProtocolMessageTypes.new_peak, bytes([1] * 40))
|
|
50
53
|
for i in range(200):
|
|
51
|
-
assert r.process_msg_and_check(new_peak_message, rl_v2, rl_v2)
|
|
54
|
+
assert r.process_msg_and_check(new_peak_message, rl_v2, rl_v2) is None
|
|
52
55
|
|
|
53
56
|
saw_disconnect = False
|
|
54
57
|
for i in range(200):
|
|
55
58
|
response = r.process_msg_and_check(new_peak_message, rl_v2, rl_v2)
|
|
56
|
-
if not
|
|
59
|
+
if response is not None:
|
|
57
60
|
saw_disconnect = True
|
|
58
61
|
assert saw_disconnect
|
|
59
62
|
|
|
@@ -64,15 +67,18 @@ class TestRateLimits:
|
|
|
64
67
|
large_tx_message = make_msg(ProtocolMessageTypes.new_transaction, bytes([1] * 3 * 1024 * 1024))
|
|
65
68
|
|
|
66
69
|
r = RateLimiter(incoming=True)
|
|
67
|
-
assert r.process_msg_and_check(small_tx_message, rl_v2, rl_v2)
|
|
68
|
-
assert
|
|
70
|
+
assert r.process_msg_and_check(small_tx_message, rl_v2, rl_v2) is None
|
|
71
|
+
assert r.process_msg_and_check(large_tx_message, rl_v2, rl_v2) is not None
|
|
69
72
|
|
|
70
73
|
small_vdf_message = make_msg(ProtocolMessageTypes.respond_signage_point, bytes([1] * 5 * 1024))
|
|
71
74
|
large_vdf_message = make_msg(ProtocolMessageTypes.respond_signage_point, bytes([1] * 600 * 1024))
|
|
75
|
+
large_blocks_message = make_msg(ProtocolMessageTypes.respond_blocks, bytes([1] * 51 * 1024 * 1024))
|
|
72
76
|
r = RateLimiter(incoming=True)
|
|
73
|
-
assert r.process_msg_and_check(small_vdf_message, rl_v2, rl_v2)
|
|
74
|
-
assert r.process_msg_and_check(small_vdf_message, rl_v2, rl_v2)
|
|
75
|
-
assert
|
|
77
|
+
assert r.process_msg_and_check(small_vdf_message, rl_v2, rl_v2) is None
|
|
78
|
+
assert r.process_msg_and_check(small_vdf_message, rl_v2, rl_v2) is None
|
|
79
|
+
assert r.process_msg_and_check(large_vdf_message, rl_v2, rl_v2) is not None
|
|
80
|
+
# this limit applies even though this message type is unlimited
|
|
81
|
+
assert r.process_msg_and_check(large_blocks_message, rl_v2, rl_v2) is not None
|
|
76
82
|
|
|
77
83
|
@pytest.mark.anyio
|
|
78
84
|
async def test_too_much_data(self):
|
|
@@ -80,24 +86,24 @@ class TestRateLimits:
|
|
|
80
86
|
r = RateLimiter(incoming=True)
|
|
81
87
|
tx_message = make_msg(ProtocolMessageTypes.respond_transaction, bytes([1] * 500 * 1024))
|
|
82
88
|
for i in range(40):
|
|
83
|
-
assert r.process_msg_and_check(tx_message, rl_v2, rl_v2)
|
|
89
|
+
assert r.process_msg_and_check(tx_message, rl_v2, rl_v2) is None
|
|
84
90
|
|
|
85
91
|
saw_disconnect = False
|
|
86
92
|
for i in range(300):
|
|
87
93
|
response = r.process_msg_and_check(tx_message, rl_v2, rl_v2)
|
|
88
|
-
if not
|
|
94
|
+
if response is not None:
|
|
89
95
|
saw_disconnect = True
|
|
90
96
|
assert saw_disconnect
|
|
91
97
|
|
|
92
98
|
r = RateLimiter(incoming=True)
|
|
93
|
-
block_message = make_msg(ProtocolMessageTypes.
|
|
99
|
+
block_message = make_msg(ProtocolMessageTypes.respond_unfinished_block, bytes([1] * 1024 * 1024))
|
|
94
100
|
for i in range(10):
|
|
95
|
-
assert r.process_msg_and_check(block_message, rl_v2, rl_v2)
|
|
101
|
+
assert r.process_msg_and_check(block_message, rl_v2, rl_v2) is None
|
|
96
102
|
|
|
97
103
|
saw_disconnect = False
|
|
98
104
|
for i in range(40):
|
|
99
105
|
response = r.process_msg_and_check(block_message, rl_v2, rl_v2)
|
|
100
|
-
if not
|
|
106
|
+
if response is not None:
|
|
101
107
|
saw_disconnect = True
|
|
102
108
|
assert saw_disconnect
|
|
103
109
|
|
|
@@ -110,30 +116,30 @@ class TestRateLimits:
|
|
|
110
116
|
message_3 = make_msg(ProtocolMessageTypes.plot_sync_start, bytes([1] * 64))
|
|
111
117
|
|
|
112
118
|
for i in range(500):
|
|
113
|
-
assert r.process_msg_and_check(message_1, rl_v2, rl_v2)
|
|
119
|
+
assert r.process_msg_and_check(message_1, rl_v2, rl_v2) is None
|
|
114
120
|
|
|
115
121
|
for i in range(500):
|
|
116
|
-
assert r.process_msg_and_check(message_2, rl_v2, rl_v2)
|
|
122
|
+
assert r.process_msg_and_check(message_2, rl_v2, rl_v2) is None
|
|
117
123
|
|
|
118
124
|
saw_disconnect = False
|
|
119
125
|
for i in range(500):
|
|
120
126
|
response = r.process_msg_and_check(message_3, rl_v2, rl_v2)
|
|
121
|
-
if not
|
|
127
|
+
if response is not None:
|
|
122
128
|
saw_disconnect = True
|
|
123
129
|
assert saw_disconnect
|
|
124
130
|
|
|
125
131
|
# Size limits
|
|
126
132
|
r = RateLimiter(incoming=True)
|
|
127
133
|
message_4 = make_msg(ProtocolMessageTypes.respond_proof_of_weight, bytes([1] * 49 * 1024 * 1024))
|
|
128
|
-
message_5 = make_msg(ProtocolMessageTypes.
|
|
134
|
+
message_5 = make_msg(ProtocolMessageTypes.request_blocks, bytes([1] * 49 * 1024 * 1024))
|
|
129
135
|
|
|
130
136
|
for i in range(2):
|
|
131
|
-
assert r.process_msg_and_check(message_4, rl_v2, rl_v2)
|
|
137
|
+
assert r.process_msg_and_check(message_4, rl_v2, rl_v2) is None
|
|
132
138
|
|
|
133
139
|
saw_disconnect = False
|
|
134
140
|
for i in range(2):
|
|
135
141
|
response = r.process_msg_and_check(message_5, rl_v2, rl_v2)
|
|
136
|
-
if not
|
|
142
|
+
if response is not None:
|
|
137
143
|
saw_disconnect = True
|
|
138
144
|
assert saw_disconnect
|
|
139
145
|
|
|
@@ -142,56 +148,56 @@ class TestRateLimits:
|
|
|
142
148
|
r = RateLimiter(True, 5)
|
|
143
149
|
tx_message = make_msg(ProtocolMessageTypes.respond_transaction, bytes([1] * 500 * 1024))
|
|
144
150
|
for i in range(10):
|
|
145
|
-
assert r.process_msg_and_check(tx_message, rl_v2, rl_v2)
|
|
151
|
+
assert r.process_msg_and_check(tx_message, rl_v2, rl_v2) is None
|
|
146
152
|
|
|
147
153
|
saw_disconnect = False
|
|
148
154
|
for i in range(300):
|
|
149
155
|
response = r.process_msg_and_check(tx_message, rl_v2, rl_v2)
|
|
150
|
-
if not
|
|
156
|
+
if response is not None:
|
|
151
157
|
saw_disconnect = True
|
|
152
158
|
assert saw_disconnect
|
|
153
|
-
assert
|
|
159
|
+
assert r.process_msg_and_check(tx_message, rl_v2, rl_v2) is not None
|
|
154
160
|
await asyncio.sleep(6)
|
|
155
|
-
assert r.process_msg_and_check(tx_message, rl_v2, rl_v2)
|
|
161
|
+
assert r.process_msg_and_check(tx_message, rl_v2, rl_v2) is None
|
|
156
162
|
|
|
157
163
|
# Counts reset also
|
|
158
164
|
r = RateLimiter(True, 5)
|
|
159
165
|
new_tx_message = make_msg(ProtocolMessageTypes.new_transaction, bytes([1] * 40))
|
|
160
166
|
for i in range(4999):
|
|
161
|
-
assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
|
|
167
|
+
assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2) is None
|
|
162
168
|
|
|
163
169
|
saw_disconnect = False
|
|
164
170
|
for i in range(4999):
|
|
165
171
|
response = r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
|
|
166
|
-
if not
|
|
172
|
+
if response is not None:
|
|
167
173
|
saw_disconnect = True
|
|
168
174
|
assert saw_disconnect
|
|
169
175
|
await asyncio.sleep(6)
|
|
170
|
-
assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2)
|
|
176
|
+
assert r.process_msg_and_check(new_tx_message, rl_v2, rl_v2) is None
|
|
171
177
|
|
|
172
178
|
@pytest.mark.anyio
|
|
173
179
|
async def test_percentage_limits(self):
|
|
174
180
|
r = RateLimiter(True, 60, 40)
|
|
175
181
|
new_peak_message = make_msg(ProtocolMessageTypes.new_peak, bytes([1] * 40))
|
|
176
182
|
for i in range(50):
|
|
177
|
-
assert r.process_msg_and_check(new_peak_message, rl_v2, rl_v2)
|
|
183
|
+
assert r.process_msg_and_check(new_peak_message, rl_v2, rl_v2) is None
|
|
178
184
|
|
|
179
185
|
saw_disconnect = False
|
|
180
186
|
for i in range(50):
|
|
181
187
|
response = r.process_msg_and_check(new_peak_message, rl_v2, rl_v2)
|
|
182
|
-
if not
|
|
188
|
+
if response is not None:
|
|
183
189
|
saw_disconnect = True
|
|
184
190
|
assert saw_disconnect
|
|
185
191
|
|
|
186
192
|
r = RateLimiter(True, 60, 40)
|
|
187
|
-
block_message = make_msg(ProtocolMessageTypes.
|
|
193
|
+
block_message = make_msg(ProtocolMessageTypes.respond_unfinished_block, bytes([1] * 1024 * 1024))
|
|
188
194
|
for i in range(5):
|
|
189
|
-
assert r.process_msg_and_check(block_message, rl_v2, rl_v2)
|
|
195
|
+
assert r.process_msg_and_check(block_message, rl_v2, rl_v2) is None
|
|
190
196
|
|
|
191
197
|
saw_disconnect = False
|
|
192
198
|
for i in range(5):
|
|
193
199
|
response = r.process_msg_and_check(block_message, rl_v2, rl_v2)
|
|
194
|
-
if not
|
|
200
|
+
if response is not None:
|
|
195
201
|
saw_disconnect = True
|
|
196
202
|
assert saw_disconnect
|
|
197
203
|
|
|
@@ -202,29 +208,29 @@ class TestRateLimits:
|
|
|
202
208
|
message_3 = make_msg(ProtocolMessageTypes.plot_sync_start, bytes([1] * 32))
|
|
203
209
|
|
|
204
210
|
for i in range(180):
|
|
205
|
-
assert r.process_msg_and_check(message_1, rl_v2, rl_v2)
|
|
211
|
+
assert r.process_msg_and_check(message_1, rl_v2, rl_v2) is None
|
|
206
212
|
for i in range(180):
|
|
207
|
-
assert r.process_msg_and_check(message_2, rl_v2, rl_v2)
|
|
213
|
+
assert r.process_msg_and_check(message_2, rl_v2, rl_v2) is None
|
|
208
214
|
|
|
209
215
|
saw_disconnect = False
|
|
210
216
|
for i in range(100):
|
|
211
217
|
response = r.process_msg_and_check(message_3, rl_v2, rl_v2)
|
|
212
|
-
if not
|
|
218
|
+
if response is not None:
|
|
213
219
|
saw_disconnect = True
|
|
214
220
|
assert saw_disconnect
|
|
215
221
|
|
|
216
222
|
# Aggregate percentage limit max total size
|
|
217
223
|
r = RateLimiter(True, 60, 40)
|
|
218
224
|
message_4 = make_msg(ProtocolMessageTypes.respond_proof_of_weight, bytes([1] * 18 * 1024 * 1024))
|
|
219
|
-
message_5 = make_msg(ProtocolMessageTypes.
|
|
225
|
+
message_5 = make_msg(ProtocolMessageTypes.respond_unfinished_block, bytes([1] * 24 * 1024 * 1024))
|
|
220
226
|
|
|
221
227
|
for i in range(2):
|
|
222
|
-
assert r.process_msg_and_check(message_4, rl_v2, rl_v2)
|
|
228
|
+
assert r.process_msg_and_check(message_4, rl_v2, rl_v2) is None
|
|
223
229
|
|
|
224
230
|
saw_disconnect = False
|
|
225
231
|
for i in range(2):
|
|
226
232
|
response = r.process_msg_and_check(message_5, rl_v2, rl_v2)
|
|
227
|
-
if not
|
|
233
|
+
if response is not None:
|
|
228
234
|
saw_disconnect = True
|
|
229
235
|
assert saw_disconnect
|
|
230
236
|
|
|
@@ -238,7 +244,7 @@ class TestRateLimits:
|
|
|
238
244
|
passed = 0
|
|
239
245
|
blocked = 0
|
|
240
246
|
for i in range(non_tx_freq):
|
|
241
|
-
if r.process_msg_and_check(new_peers_message, rl_v2, rl_v2):
|
|
247
|
+
if r.process_msg_and_check(new_peers_message, rl_v2, rl_v2) is None:
|
|
242
248
|
passed += 1
|
|
243
249
|
else:
|
|
244
250
|
blocked += 1
|
|
@@ -249,7 +255,7 @@ class TestRateLimits:
|
|
|
249
255
|
# ensure that *another* message type is not blocked because of this
|
|
250
256
|
|
|
251
257
|
new_signatures_message = make_msg(ProtocolMessageTypes.respond_signatures, bytes([1]))
|
|
252
|
-
assert r.process_msg_and_check(new_signatures_message, rl_v2, rl_v2)
|
|
258
|
+
assert r.process_msg_and_check(new_signatures_message, rl_v2, rl_v2) is None
|
|
253
259
|
|
|
254
260
|
@pytest.mark.anyio
|
|
255
261
|
async def test_too_many_incoming_messages(self):
|
|
@@ -261,7 +267,7 @@ class TestRateLimits:
|
|
|
261
267
|
passed = 0
|
|
262
268
|
blocked = 0
|
|
263
269
|
for i in range(non_tx_freq):
|
|
264
|
-
if r.process_msg_and_check(new_peers_message, rl_v2, rl_v2):
|
|
270
|
+
if r.process_msg_and_check(new_peers_message, rl_v2, rl_v2) is None:
|
|
265
271
|
passed += 1
|
|
266
272
|
else:
|
|
267
273
|
blocked += 1
|
|
@@ -272,7 +278,7 @@ class TestRateLimits:
|
|
|
272
278
|
# ensure that other message types *are* blocked because of this
|
|
273
279
|
|
|
274
280
|
new_signatures_message = make_msg(ProtocolMessageTypes.respond_signatures, bytes([1]))
|
|
275
|
-
assert
|
|
281
|
+
assert r.process_msg_and_check(new_signatures_message, rl_v2, rl_v2) is not None
|
|
276
282
|
|
|
277
283
|
@pytest.mark.parametrize(
|
|
278
284
|
"node_with_params",
|
|
@@ -368,3 +374,109 @@ class TestRateLimits:
|
|
|
368
374
|
# Otherwise, fall back to v1
|
|
369
375
|
assert ProtocolMessageTypes.request_block in rl_1["rate_limits_other"]
|
|
370
376
|
assert ProtocolMessageTypes.request_block not in rl_1["rate_limits_tx"]
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
@pytest.mark.anyio
|
|
380
|
+
@pytest.mark.parametrize(
|
|
381
|
+
"msg_type, size",
|
|
382
|
+
[
|
|
383
|
+
(ProtocolMessageTypes.respond_blocks, 10 * 1024 * 1024),
|
|
384
|
+
(ProtocolMessageTypes.reject_blocks, 90),
|
|
385
|
+
(ProtocolMessageTypes.respond_block, 1024 * 1024),
|
|
386
|
+
(ProtocolMessageTypes.reject_block, 90),
|
|
387
|
+
],
|
|
388
|
+
)
|
|
389
|
+
async def test_unlimited(msg_type: ProtocolMessageTypes, size: int):
|
|
390
|
+
r = RateLimiter(incoming=False)
|
|
391
|
+
|
|
392
|
+
message = make_msg(msg_type, bytes([1] * size))
|
|
393
|
+
|
|
394
|
+
for i in range(1000):
|
|
395
|
+
# since this is a backwards compatible change, it also affects V1
|
|
396
|
+
assert r.process_msg_and_check(message, rl_v1, rl_v1) is None
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
@pytest.mark.anyio
|
|
400
|
+
@pytest.mark.parametrize(
|
|
401
|
+
"msg_type",
|
|
402
|
+
[
|
|
403
|
+
ProtocolMessageTypes.respond_blocks,
|
|
404
|
+
ProtocolMessageTypes.reject_blocks,
|
|
405
|
+
ProtocolMessageTypes.respond_block,
|
|
406
|
+
ProtocolMessageTypes.reject_block,
|
|
407
|
+
],
|
|
408
|
+
)
|
|
409
|
+
@pytest.mark.parametrize(
|
|
410
|
+
"node_with_params",
|
|
411
|
+
[
|
|
412
|
+
pytest.param(
|
|
413
|
+
dict(
|
|
414
|
+
disable_capabilities=[Capability.BLOCK_HEADERS, Capability.RATE_LIMITS_V2],
|
|
415
|
+
),
|
|
416
|
+
id="V1",
|
|
417
|
+
),
|
|
418
|
+
pytest.param(
|
|
419
|
+
dict(
|
|
420
|
+
disable_capabilities=[],
|
|
421
|
+
),
|
|
422
|
+
id="V2",
|
|
423
|
+
),
|
|
424
|
+
],
|
|
425
|
+
indirect=True,
|
|
426
|
+
)
|
|
427
|
+
@pytest.mark.parametrize(
|
|
428
|
+
"node_with_params_b",
|
|
429
|
+
[
|
|
430
|
+
pytest.param(
|
|
431
|
+
dict(
|
|
432
|
+
disable_capabilities=[Capability.BLOCK_HEADERS, Capability.RATE_LIMITS_V2],
|
|
433
|
+
),
|
|
434
|
+
id="V1",
|
|
435
|
+
),
|
|
436
|
+
pytest.param(
|
|
437
|
+
dict(
|
|
438
|
+
disable_capabilities=[],
|
|
439
|
+
),
|
|
440
|
+
id="V2",
|
|
441
|
+
),
|
|
442
|
+
],
|
|
443
|
+
indirect=True,
|
|
444
|
+
)
|
|
445
|
+
async def test_unsolicited_responses(
|
|
446
|
+
node_with_params, node_with_params_b, self_hostname: str, msg_type: ProtocolMessageTypes, bt: BlockTools
|
|
447
|
+
):
|
|
448
|
+
node_a = node_with_params
|
|
449
|
+
node_b = node_with_params_b
|
|
450
|
+
|
|
451
|
+
msg = {
|
|
452
|
+
ProtocolMessageTypes.respond_blocks: make_msg(
|
|
453
|
+
ProtocolMessageTypes.respond_blocks, bytes(RespondBlocks(uint32(1), uint32(2), []))
|
|
454
|
+
),
|
|
455
|
+
ProtocolMessageTypes.reject_blocks: make_msg(
|
|
456
|
+
ProtocolMessageTypes.reject_blocks, bytes(RejectBlocks(uint32(1), uint32(2)))
|
|
457
|
+
),
|
|
458
|
+
ProtocolMessageTypes.respond_block: make_msg(
|
|
459
|
+
ProtocolMessageTypes.respond_block, bytes(RespondBlock(bt.get_consecutive_blocks(1)[0]))
|
|
460
|
+
),
|
|
461
|
+
ProtocolMessageTypes.reject_block: make_msg(ProtocolMessageTypes.reject_block, bytes(RejectBlock(uint32(0)))),
|
|
462
|
+
}[msg_type]
|
|
463
|
+
|
|
464
|
+
full_node_server_a: ChiaServer = node_a.full_node.server
|
|
465
|
+
full_node_server_b: ChiaServer = node_b.full_node.server
|
|
466
|
+
|
|
467
|
+
await full_node_server_b.start_client(PeerInfo(self_hostname, full_node_server_a.get_port()), None)
|
|
468
|
+
|
|
469
|
+
assert len(full_node_server_b.get_connections()) == 1
|
|
470
|
+
assert len(full_node_server_a.get_connections()) == 1
|
|
471
|
+
|
|
472
|
+
a_con: WSChiaConnection = full_node_server_a.get_connections()[0]
|
|
473
|
+
b_con: WSChiaConnection = full_node_server_b.get_connections()[0]
|
|
474
|
+
|
|
475
|
+
assert not a_con.closed
|
|
476
|
+
assert not b_con.closed
|
|
477
|
+
|
|
478
|
+
await a_con.send_message(msg)
|
|
479
|
+
|
|
480
|
+
# make sure the connection is closed because of the unsolicited response
|
|
481
|
+
# message
|
|
482
|
+
await time_out_assert(5, lambda: a_con.closed)
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass
|
|
5
|
-
from typing import Callable,
|
|
5
|
+
from typing import Callable, ClassVar, cast
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
8
|
from packaging.version import Version
|
|
@@ -16,6 +16,7 @@ from chia.protocols.full_node_protocol import RejectBlock, RequestBlock, Request
|
|
|
16
16
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
17
17
|
from chia.protocols.shared_protocol import Error, protocol_version
|
|
18
18
|
from chia.protocols.wallet_protocol import RejectHeaderRequest
|
|
19
|
+
from chia.server.api_protocol import ApiMetadata
|
|
19
20
|
from chia.server.outbound_message import NodeType, make_msg
|
|
20
21
|
from chia.server.server import ChiaServer
|
|
21
22
|
from chia.server.start_full_node import create_full_node_service
|
|
@@ -24,7 +25,6 @@ from chia.server.ws_connection import WSChiaConnection, error_response_version
|
|
|
24
25
|
from chia.simulator.block_tools import BlockTools
|
|
25
26
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
26
27
|
from chia.types.peer_info import PeerInfo
|
|
27
|
-
from chia.util.api_decorators import api_request
|
|
28
28
|
from chia.util.errors import ApiError, Err
|
|
29
29
|
from chia.util.ints import int16, uint32
|
|
30
30
|
|
|
@@ -32,19 +32,20 @@ from chia.util.ints import int16, uint32
|
|
|
32
32
|
@dataclass
|
|
33
33
|
class TestAPI:
|
|
34
34
|
log: logging.Logger = logging.getLogger(__name__)
|
|
35
|
+
metadata: ClassVar[ApiMetadata] = ApiMetadata()
|
|
35
36
|
|
|
36
37
|
def ready(self) -> bool:
|
|
37
38
|
return True
|
|
38
39
|
|
|
39
40
|
# API call from FullNodeAPI
|
|
40
|
-
@
|
|
41
|
+
@metadata.request()
|
|
41
42
|
async def request_transaction(self, request: RequestTransaction) -> None:
|
|
42
43
|
raise ApiError(Err.NO_TRANSACTIONS_WHILE_SYNCING, f"Some error message: {request.transaction_id}", b"ab")
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
@pytest.mark.anyio
|
|
46
47
|
async def test_duplicate_client_connection(
|
|
47
|
-
two_nodes:
|
|
48
|
+
two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
|
|
48
49
|
) -> None:
|
|
49
50
|
_, _, server_1, server_2, _ = two_nodes
|
|
50
51
|
assert await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), None)
|
|
@@ -54,7 +55,7 @@ async def test_duplicate_client_connection(
|
|
|
54
55
|
@pytest.mark.anyio
|
|
55
56
|
@pytest.mark.parametrize("method", [repr, str])
|
|
56
57
|
async def test_connection_string_conversion(
|
|
57
|
-
two_nodes_one_block:
|
|
58
|
+
two_nodes_one_block: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
|
|
58
59
|
self_hostname: str,
|
|
59
60
|
method: Callable[[object], str],
|
|
60
61
|
) -> None:
|
|
@@ -178,7 +179,7 @@ async def test_error_receive(
|
|
|
178
179
|
|
|
179
180
|
@pytest.mark.anyio
|
|
180
181
|
async def test_call_api_of_specific(
|
|
181
|
-
two_nodes:
|
|
182
|
+
two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
|
|
182
183
|
) -> None:
|
|
183
184
|
_, _, server_1, server_2, _ = two_nodes
|
|
184
185
|
assert await server_1.start_client(PeerInfo(self_hostname, server_2.get_port()), None)
|
|
@@ -193,7 +194,7 @@ async def test_call_api_of_specific(
|
|
|
193
194
|
|
|
194
195
|
@pytest.mark.anyio
|
|
195
196
|
async def test_call_api_of_specific_for_missing_peer(
|
|
196
|
-
two_nodes:
|
|
197
|
+
two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
|
|
197
198
|
) -> None:
|
|
198
199
|
_, _, server_1, server_2, _ = two_nodes
|
|
199
200
|
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import contextlib
|
|
4
5
|
import signal
|
|
5
6
|
import sys
|
|
6
7
|
import time
|
|
8
|
+
from collections.abc import AsyncIterator
|
|
7
9
|
from pathlib import Path
|
|
8
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Optional, cast
|
|
9
11
|
|
|
10
12
|
import aiohttp.client_exceptions
|
|
11
13
|
import pytest
|
|
@@ -34,16 +36,18 @@ else:
|
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
class CreateServiceProtocol(Protocol):
|
|
39
|
+
@contextlib.asynccontextmanager
|
|
37
40
|
async def __call__(
|
|
38
41
|
self,
|
|
39
42
|
self_hostname: str,
|
|
40
43
|
port: uint16,
|
|
41
44
|
root_path: Path,
|
|
42
|
-
net_config:
|
|
43
|
-
) -> RpcClient:
|
|
45
|
+
net_config: dict[str, Any],
|
|
46
|
+
) -> AsyncIterator[RpcClient]:
|
|
47
|
+
yield cast(RpcClient, None) # pragma: no cover
|
|
44
48
|
|
|
45
49
|
|
|
46
|
-
async def wait_for_daemon_connection(root_path: Path, config:
|
|
50
|
+
async def wait_for_daemon_connection(root_path: Path, config: dict[str, Any], timeout: float = 15) -> DaemonProxy:
|
|
47
51
|
timeout = adjusted_timeout(timeout=timeout)
|
|
48
52
|
|
|
49
53
|
start = time.monotonic()
|
|
@@ -82,34 +86,46 @@ async def test_daemon_terminates(signal_number: signal.Signals, chia_root: ChiaR
|
|
|
82
86
|
@pytest.mark.parametrize(
|
|
83
87
|
argnames=["create_service", "module_path", "service_config_name"],
|
|
84
88
|
argvalues=[
|
|
85
|
-
[DataLayerRpcClient.
|
|
86
|
-
[FarmerRpcClient.
|
|
87
|
-
[FullNodeRpcClient.
|
|
88
|
-
[HarvesterRpcClient.
|
|
89
|
-
[WalletRpcClient.
|
|
90
|
-
|
|
91
|
-
#
|
|
92
|
-
# [, "chia.seeder.start_crawler", ""],
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
89
|
+
[DataLayerRpcClient.create_as_context, "chia.server.start_data_layer", "data_layer"],
|
|
90
|
+
[FarmerRpcClient.create_as_context, "chia.server.start_farmer", "farmer"],
|
|
91
|
+
[FullNodeRpcClient.create_as_context, "chia.server.start_full_node", "full_node"],
|
|
92
|
+
[HarvesterRpcClient.create_as_context, "chia.server.start_harvester", "harvester"],
|
|
93
|
+
[WalletRpcClient.create_as_context, "chia.server.start_wallet", "wallet"],
|
|
94
|
+
[None, "chia.server.start_introducer", "introducer"],
|
|
95
|
+
# TODO: fails... make it not do that
|
|
96
|
+
# [None, "chia.seeder.start_crawler", "crawler"],
|
|
97
|
+
[None, "chia.server.start_timelord", "timelord"],
|
|
98
|
+
pytest.param(
|
|
99
|
+
None,
|
|
100
|
+
"chia.timelord.timelord_launcher",
|
|
101
|
+
"timelord_launcher",
|
|
102
|
+
marks=pytest.mark.skipif(
|
|
103
|
+
sys.platform in {"win32", "cygwin"},
|
|
104
|
+
reason="windows is not supported by the timelord launcher",
|
|
105
|
+
),
|
|
106
|
+
),
|
|
107
|
+
# TODO: fails... starts creating plots etc
|
|
108
|
+
# [None, "chia.simulator.start_simulator", "simulator"],
|
|
109
|
+
# TODO: fails... make it not do that
|
|
110
|
+
# [None, "chia.data_layer.data_layer_server", "data_layer"],
|
|
97
111
|
],
|
|
98
112
|
)
|
|
99
113
|
@pytest.mark.anyio
|
|
100
114
|
async def test_services_terminate(
|
|
101
115
|
signal_number: signal.Signals,
|
|
102
116
|
chia_root: ChiaRoot,
|
|
103
|
-
create_service: CreateServiceProtocol,
|
|
117
|
+
create_service: Optional[CreateServiceProtocol],
|
|
104
118
|
module_path: str,
|
|
105
119
|
service_config_name: str,
|
|
106
120
|
) -> None:
|
|
107
121
|
with lock_and_load_config(root_path=chia_root.path, filename="config.yaml") as config:
|
|
108
122
|
config["daemon_port"] = find_available_listen_port(name="daemon")
|
|
109
123
|
service_config = config[service_config_name]
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
124
|
+
api_port_group = service_config
|
|
125
|
+
if service_config_name == "timelord":
|
|
126
|
+
api_port_group = api_port_group["vdf_server"]
|
|
127
|
+
if "port" in api_port_group:
|
|
128
|
+
api_port_group["port"] = 0
|
|
113
129
|
rpc_port = find_available_listen_port(name="rpc")
|
|
114
130
|
service_config["rpc_port"] = rpc_port
|
|
115
131
|
save_config(root_path=chia_root.path, filename="config.yaml", config_data=config)
|
|
@@ -125,17 +141,26 @@ async def test_services_terminate(
|
|
|
125
141
|
daemon_client = await wait_for_daemon_connection(root_path=chia_root.path, config=config)
|
|
126
142
|
await daemon_client.close()
|
|
127
143
|
|
|
128
|
-
with
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
port=uint16(rpc_port),
|
|
135
|
-
root_path=chia_root.path,
|
|
136
|
-
net_config=config,
|
|
144
|
+
async with contextlib.AsyncExitStack() as exit_stack:
|
|
145
|
+
process = exit_stack.enter_context(
|
|
146
|
+
closing_chia_root_popen(
|
|
147
|
+
chia_root=chia_root,
|
|
148
|
+
args=[sys.executable, "-m", module_path],
|
|
149
|
+
)
|
|
137
150
|
)
|
|
138
|
-
|
|
151
|
+
|
|
152
|
+
if create_service is None:
|
|
153
|
+
await asyncio.sleep(5)
|
|
154
|
+
else:
|
|
155
|
+
client = await exit_stack.enter_async_context(
|
|
156
|
+
create_service(
|
|
157
|
+
self_hostname=config["self_hostname"],
|
|
158
|
+
port=uint16(rpc_port),
|
|
159
|
+
root_path=chia_root.path,
|
|
160
|
+
net_config=config,
|
|
161
|
+
)
|
|
162
|
+
)
|
|
163
|
+
|
|
139
164
|
start = time.monotonic()
|
|
140
165
|
while time.monotonic() - start < 50:
|
|
141
166
|
return_code = process.poll()
|
|
@@ -156,11 +181,8 @@ async def test_services_terminate(
|
|
|
156
181
|
else:
|
|
157
182
|
raise Exception("unable to connect")
|
|
158
183
|
|
|
159
|
-
|
|
160
|
-
|
|
184
|
+
return_code = process.poll()
|
|
185
|
+
assert return_code is None
|
|
161
186
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
finally:
|
|
165
|
-
client.close()
|
|
166
|
-
await client.await_closed()
|
|
187
|
+
process.send_signal(signal_number)
|
|
188
|
+
process.communicate(timeout=adjusted_timeout(timeout=30))
|
chia/_tests/core/ssl/test_ssl.py
CHANGED
|
@@ -8,6 +8,7 @@ import ssl
|
|
|
8
8
|
import aiohttp
|
|
9
9
|
import pytest
|
|
10
10
|
|
|
11
|
+
from chia.apis import ApiProtocolRegistry
|
|
11
12
|
from chia.protocols.shared_protocol import default_capabilities
|
|
12
13
|
from chia.server.outbound_message import NodeType
|
|
13
14
|
from chia.server.server import ChiaServer, ssl_context_for_client
|
|
@@ -33,10 +34,11 @@ async def establish_connection(server: ChiaServer, self_hostname: str, ssl_conte
|
|
|
33
34
|
True,
|
|
34
35
|
server.received_message_callback,
|
|
35
36
|
None,
|
|
36
|
-
bytes32
|
|
37
|
+
bytes32.zeros,
|
|
37
38
|
100,
|
|
38
39
|
30,
|
|
39
40
|
local_capabilities_for_handshake=default_capabilities[NodeType.FULL_NODE],
|
|
41
|
+
class_for_type=ApiProtocolRegistry,
|
|
40
42
|
)
|
|
41
43
|
await wsc.perform_handshake(server._network_id, dummy_port, NodeType.FULL_NODE)
|
|
42
44
|
await wsc.close()
|
|
@@ -84,7 +86,7 @@ class TestSSL:
|
|
|
84
86
|
full_nodes, wallets, _ = simulator_and_wallet
|
|
85
87
|
full_node_api = full_nodes[0]
|
|
86
88
|
server_1: ChiaServer = full_node_api.full_node.server
|
|
87
|
-
|
|
89
|
+
_wallet_node, server_2 = wallets[0]
|
|
88
90
|
|
|
89
91
|
success = await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), None)
|
|
90
92
|
assert success is True
|
|
@@ -165,7 +167,7 @@ class TestSSL:
|
|
|
165
167
|
|
|
166
168
|
@pytest.mark.anyio
|
|
167
169
|
async def test_full_node(self, simulator_and_wallet, self_hostname):
|
|
168
|
-
full_nodes,
|
|
170
|
+
full_nodes, _wallets, bt = simulator_and_wallet
|
|
169
171
|
full_node_api = full_nodes[0]
|
|
170
172
|
full_node_server = full_node_api.full_node.server
|
|
171
173
|
chia_ca_crt_path, chia_ca_key_path = chia_ssl_ca_paths(bt.root_path, bt.config)
|