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,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import List
|
|
5
4
|
|
|
6
5
|
import pytest
|
|
7
6
|
|
|
@@ -29,7 +28,7 @@ class TestRequestType(Streamable):
|
|
|
29
28
|
@streamable
|
|
30
29
|
@dataclass(frozen=True)
|
|
31
30
|
class TestResponseObject(Streamable):
|
|
32
|
-
qat:
|
|
31
|
+
qat: list[str]
|
|
33
32
|
sub: SubObject
|
|
34
33
|
|
|
35
34
|
|
chia/_tests/core/test_seeder.py
CHANGED
|
@@ -4,12 +4,19 @@ import time
|
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from ipaddress import IPv4Address, IPv6Address
|
|
6
6
|
from socket import AF_INET, AF_INET6, SOCK_STREAM
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Optional, Union, cast
|
|
8
|
+
from unittest.mock import AsyncMock
|
|
8
9
|
|
|
9
10
|
import dns
|
|
10
11
|
import pytest
|
|
12
|
+
from dns.name import from_text
|
|
13
|
+
from dns.rdataclass import IN
|
|
14
|
+
from dns.rdatatype import AAAA as AAAA_TYPE
|
|
15
|
+
from dns.rdatatype import A as A_TYPE
|
|
16
|
+
from dns.rdtypes.IN.A import A
|
|
17
|
+
from dns.rdtypes.IN.AAAA import AAAA
|
|
18
|
+
from dns.rrset import RRset
|
|
11
19
|
|
|
12
|
-
from chia._tests.util.time_out_assert import time_out_assert
|
|
13
20
|
from chia.seeder.dns_server import DNSServer
|
|
14
21
|
from chia.seeder.peer_record import PeerRecord, PeerReliability
|
|
15
22
|
from chia.util.ints import uint32, uint64
|
|
@@ -17,7 +24,7 @@ from chia.util.ints import uint32, uint64
|
|
|
17
24
|
timeout = 0.5
|
|
18
25
|
|
|
19
26
|
|
|
20
|
-
def generate_test_combs() ->
|
|
27
|
+
def generate_test_combs() -> list[tuple[bool, str, dns.rdatatype.RdataType]]:
|
|
21
28
|
"""
|
|
22
29
|
Generates all the combinations of tests we want to run.
|
|
23
30
|
"""
|
|
@@ -60,7 +67,7 @@ class FakeDnsPacket:
|
|
|
60
67
|
|
|
61
68
|
|
|
62
69
|
@pytest.fixture(scope="module")
|
|
63
|
-
def database_peers() ->
|
|
70
|
+
def database_peers() -> dict[str, PeerReliability]:
|
|
64
71
|
"""
|
|
65
72
|
We override the values in the class with these dbs, to save time.
|
|
66
73
|
"""
|
|
@@ -98,7 +105,7 @@ async def make_dns_query(
|
|
|
98
105
|
return await dns.asyncquery.udp(q=dns_message, where=target_address, timeout=d_timeout, port=port)
|
|
99
106
|
|
|
100
107
|
|
|
101
|
-
def get_addresses(num_subnets: int = 10) ->
|
|
108
|
+
def get_addresses(num_subnets: int = 10) -> tuple[list[IPv4Address], list[IPv6Address]]:
|
|
102
109
|
ipv4 = []
|
|
103
110
|
ipv6 = []
|
|
104
111
|
# generate 2500 ipv4 and 2500 ipv6 peers, it's just a string so who cares
|
|
@@ -110,7 +117,7 @@ def get_addresses(num_subnets: int = 10) -> Tuple[List[IPv4Address], List[IPv6Ad
|
|
|
110
117
|
|
|
111
118
|
|
|
112
119
|
def assert_standard_results(
|
|
113
|
-
std_query_answer:
|
|
120
|
+
std_query_answer: list[dns.rrset.RRset], request_type: dns.rdatatype.RdataType, num_ns: int
|
|
114
121
|
) -> None:
|
|
115
122
|
if request_type == dns.rdatatype.A:
|
|
116
123
|
assert len(std_query_answer) == 1 # only 1 kind of answer
|
|
@@ -164,7 +171,7 @@ async def test_error_conditions(
|
|
|
164
171
|
no_peers_response = await make_dns_query(use_tcp, target_address, port, no_peers)
|
|
165
172
|
assert no_peers_response.rcode() == dns.rcode.NOERROR
|
|
166
173
|
|
|
167
|
-
if request_type
|
|
174
|
+
if request_type in {dns.rdatatype.A, dns.rdatatype.AAAA}:
|
|
168
175
|
assert len(no_peers_response.answer) == 0 # no response, as expected
|
|
169
176
|
elif request_type == dns.rdatatype.ANY: # ns + soa
|
|
170
177
|
assert len(no_peers_response.answer) == 2
|
|
@@ -216,7 +223,7 @@ async def test_error_conditions(
|
|
|
216
223
|
r = await dns.asyncquery.tcp(q=no_peers, where=target_address, timeout=timeout, sock=socket)
|
|
217
224
|
assert r.answer == no_peers_response.answer
|
|
218
225
|
# send 120, as the first 2 bytes / the length of the packet, so that the server expects more.
|
|
219
|
-
await socket.sendall(
|
|
226
|
+
await socket.sendall((120).to_bytes(2, byteorder="big"), int(time.time() + timeout))
|
|
220
227
|
await socket.close()
|
|
221
228
|
with pytest.raises(EOFError):
|
|
222
229
|
await dns.asyncquery.receive_tcp(tcp_socket, timeout)
|
|
@@ -273,12 +280,11 @@ async def test_dns_queries(
|
|
|
273
280
|
await make_dns_query(use_tcp, target_address, port, e_query)
|
|
274
281
|
|
|
275
282
|
|
|
276
|
-
@pytest.mark.skip(reason="Flaky test with fixes in progress")
|
|
277
283
|
@pytest.mark.anyio
|
|
278
284
|
@pytest.mark.parametrize("use_tcp, target_address, request_type", all_test_combinations)
|
|
279
285
|
async def test_db_processing(
|
|
280
286
|
seeder_service: DNSServer,
|
|
281
|
-
database_peers:
|
|
287
|
+
database_peers: dict[str, PeerReliability],
|
|
282
288
|
use_tcp: bool,
|
|
283
289
|
target_address: str,
|
|
284
290
|
request_type: dns.rdatatype.RdataType,
|
|
@@ -298,11 +304,117 @@ async def test_db_processing(
|
|
|
298
304
|
# Write these new peers to db.
|
|
299
305
|
await crawl_store.load_reliable_peers_to_db()
|
|
300
306
|
|
|
301
|
-
#
|
|
302
|
-
await
|
|
307
|
+
# Force a DB reload and ensure it loaded the peers
|
|
308
|
+
await seeder_service.refresh_reliable_peers()
|
|
309
|
+
assert seeder_service.reliable_peers_v4 != []
|
|
303
310
|
|
|
304
311
|
# now we check that the db peers are being used.
|
|
305
312
|
query = dns.message.make_query(domain, request_type, use_edns=True) # we need to generate a new request id.
|
|
306
313
|
std_query_response = await make_dns_query(use_tcp, target_address, port, query)
|
|
307
314
|
assert std_query_response.rcode() == dns.rcode.NOERROR
|
|
308
315
|
assert_standard_results(std_query_response.answer, request_type, num_ns)
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
@pytest.mark.anyio
|
|
319
|
+
@pytest.mark.parametrize(
|
|
320
|
+
"use_tcp, target_address, request_type",
|
|
321
|
+
[
|
|
322
|
+
[False, "127.0.0.1", dns.rdatatype.A],
|
|
323
|
+
[False, "127.0.0.1", dns.rdatatype.AAAA],
|
|
324
|
+
[True, "127.0.0.1", dns.rdatatype.A],
|
|
325
|
+
[True, "127.0.0.1", dns.rdatatype.AAAA],
|
|
326
|
+
[False, "::1", dns.rdatatype.A],
|
|
327
|
+
[False, "::1", dns.rdatatype.AAAA],
|
|
328
|
+
[True, "::1", dns.rdatatype.A],
|
|
329
|
+
[True, "::1", dns.rdatatype.AAAA],
|
|
330
|
+
],
|
|
331
|
+
)
|
|
332
|
+
async def test_static_peers(
|
|
333
|
+
seeder_service: DNSServer,
|
|
334
|
+
database_peers: dict[str, PeerReliability],
|
|
335
|
+
use_tcp: bool,
|
|
336
|
+
target_address: str,
|
|
337
|
+
request_type: dns.rdatatype.RdataType,
|
|
338
|
+
) -> None:
|
|
339
|
+
port = get_dns_port(seeder_service, False, target_address)
|
|
340
|
+
domain = seeder_service.domain # default is: seeder.example.com
|
|
341
|
+
|
|
342
|
+
seeder_service.config["static_peers"] = ["1.2.3.4", "2001:0DB8::5"]
|
|
343
|
+
await seeder_service.refresh_reliable_peers()
|
|
344
|
+
|
|
345
|
+
query = dns.message.make_query(domain, request_type, use_edns=True) # we need to generate a new request id.
|
|
346
|
+
std_query_response = await make_dns_query(False, target_address, port, query, d_timeout=10)
|
|
347
|
+
assert std_query_response.rcode() == dns.rcode.NOERROR
|
|
348
|
+
assert len(std_query_response.answer) == 1 # only 1 kind of answer
|
|
349
|
+
answer = std_query_response.answer[0]
|
|
350
|
+
assert answer.rdtype == request_type
|
|
351
|
+
assert len(answer) == 1
|
|
352
|
+
expected = "2001:db8::5" if request_type == dns.rdatatype.AAAA else "1.2.3.4"
|
|
353
|
+
assert answer[0].to_text() == expected
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def get_mock_resolver() -> AsyncMock:
|
|
357
|
+
# Mock IPv4 response
|
|
358
|
+
mock_rrset_a = RRset(from_text("node.example.com."), IN, A_TYPE)
|
|
359
|
+
mock_rrset_a.add(A(IN, A_TYPE, "1.2.3.4")) # type: ignore
|
|
360
|
+
|
|
361
|
+
# Mock IPv6 response
|
|
362
|
+
mock_rrset_aaaa = RRset(from_text("node.example.com."), IN, AAAA_TYPE)
|
|
363
|
+
mock_rrset_aaaa.add(AAAA(IN, AAAA_TYPE, "2001:db8::5")) # type: ignore
|
|
364
|
+
|
|
365
|
+
# Create a mock Resolver
|
|
366
|
+
mock_resolver = AsyncMock()
|
|
367
|
+
|
|
368
|
+
# Adjust mock_resolve to accept all arguments
|
|
369
|
+
async def mock_resolve(
|
|
370
|
+
qname: Union[dns.name.Name, str],
|
|
371
|
+
rdtype: Union[dns.rdatatype.RdataType, str] = dns.rdatatype.A,
|
|
372
|
+
lifetime: Optional[float] = None,
|
|
373
|
+
) -> RRset:
|
|
374
|
+
if rdtype == "A":
|
|
375
|
+
return mock_rrset_a
|
|
376
|
+
elif rdtype == "AAAA":
|
|
377
|
+
return mock_rrset_aaaa
|
|
378
|
+
raise Exception(f"Unexpected query type: {rdtype}")
|
|
379
|
+
|
|
380
|
+
mock_resolver.resolve.side_effect = mock_resolve
|
|
381
|
+
return mock_resolver
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
@pytest.mark.anyio
|
|
385
|
+
@pytest.mark.parametrize(
|
|
386
|
+
"use_tcp, target_address, request_type",
|
|
387
|
+
[
|
|
388
|
+
[False, "127.0.0.1", dns.rdatatype.A],
|
|
389
|
+
[False, "127.0.0.1", dns.rdatatype.AAAA],
|
|
390
|
+
[True, "127.0.0.1", dns.rdatatype.A],
|
|
391
|
+
[True, "127.0.0.1", dns.rdatatype.AAAA],
|
|
392
|
+
[False, "::1", dns.rdatatype.A],
|
|
393
|
+
[False, "::1", dns.rdatatype.AAAA],
|
|
394
|
+
[True, "::1", dns.rdatatype.A],
|
|
395
|
+
[True, "::1", dns.rdatatype.AAAA],
|
|
396
|
+
],
|
|
397
|
+
)
|
|
398
|
+
async def test_static_peers_with_hostnames(
|
|
399
|
+
seeder_service: DNSServer,
|
|
400
|
+
database_peers: dict[str, PeerReliability],
|
|
401
|
+
use_tcp: bool,
|
|
402
|
+
target_address: str,
|
|
403
|
+
request_type: dns.rdatatype.RdataType,
|
|
404
|
+
) -> None:
|
|
405
|
+
port = get_dns_port(seeder_service, False, target_address)
|
|
406
|
+
domain = seeder_service.domain # default is: seeder.example.com
|
|
407
|
+
|
|
408
|
+
seeder_service.resolver = get_mock_resolver()
|
|
409
|
+
seeder_service.config["static_peers"] = ["node.example.com"]
|
|
410
|
+
await seeder_service.refresh_reliable_peers()
|
|
411
|
+
|
|
412
|
+
query = dns.message.make_query(domain, request_type, use_edns=True) # we need to generate a new request id.
|
|
413
|
+
std_query_response = await make_dns_query(False, target_address, port, query, d_timeout=10)
|
|
414
|
+
assert std_query_response.rcode() == dns.rcode.NOERROR
|
|
415
|
+
assert len(std_query_response.answer) == 1 # only 1 kind of answer
|
|
416
|
+
answer = std_query_response.answer[0]
|
|
417
|
+
assert answer.rdtype == request_type
|
|
418
|
+
assert len(answer) == 1
|
|
419
|
+
expected = "2001:db8::5" if request_type == dns.rdatatype.AAAA else "1.2.3.4"
|
|
420
|
+
assert answer[0].to_text() == expected
|
|
@@ -26,7 +26,7 @@ def BR(height: int, header_hash: bytes32, prev_hash: bytes32) -> BlockRecord:
|
|
|
26
26
|
@pytest.mark.anyio
|
|
27
27
|
async def test_block_cache(seeded_random: random.Random) -> None:
|
|
28
28
|
a = BlockCache({})
|
|
29
|
-
prev = bytes32
|
|
29
|
+
prev = bytes32.zeros
|
|
30
30
|
hashes = [bytes32.random(seeded_random) for _ in range(10)]
|
|
31
31
|
for i, hh in enumerate(hashes):
|
|
32
32
|
a.add_block(BR(i + 1, hh, prev))
|
|
@@ -36,9 +36,9 @@ async def test_block_cache(seeded_random: random.Random) -> None:
|
|
|
36
36
|
if i == 0:
|
|
37
37
|
continue
|
|
38
38
|
assert await a.prev_block_hash([hh]) == [hashes[i - 1]]
|
|
39
|
-
assert a.try_block_record(hh) == BR(i + 1,
|
|
40
|
-
assert a.block_record(hh) == BR(i + 1,
|
|
41
|
-
assert a.height_to_hash(uint32(i + 1)) ==
|
|
42
|
-
assert a.height_to_block_record(uint32(i + 1)) == BR(i + 1,
|
|
39
|
+
assert a.try_block_record(hh) == BR(i + 1, hh, hashes[i - 1])
|
|
40
|
+
assert a.block_record(hh) == BR(i + 1, hh, hashes[i - 1])
|
|
41
|
+
assert a.height_to_hash(uint32(i + 1)) == hh
|
|
42
|
+
assert a.height_to_block_record(uint32(i + 1)) == BR(i + 1, hh, hashes[i - 1])
|
|
43
43
|
assert a.contains_block(hh)
|
|
44
44
|
assert a.contains_height(uint32(i + 1))
|
|
@@ -4,10 +4,10 @@ from chia_rs import AugSchemeMPL, BLSCache
|
|
|
4
4
|
|
|
5
5
|
from chia.util.hash import std_hash
|
|
6
6
|
|
|
7
|
-
LOCAL_CACHE = BLSCache(
|
|
7
|
+
LOCAL_CACHE = BLSCache(50_000)
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
def test_cached_bls():
|
|
10
|
+
def test_cached_bls() -> None:
|
|
11
11
|
n_keys = 10
|
|
12
12
|
seed = b"a" * 31
|
|
13
13
|
sks = [AugSchemeMPL.key_gen(seed + bytes([i])) for i in range(n_keys)]
|
|
@@ -42,7 +42,7 @@ def test_cached_bls():
|
|
|
42
42
|
assert local_cache.aggregate_verify(pks, msgs, agg_sig)
|
|
43
43
|
|
|
44
44
|
|
|
45
|
-
def test_cached_bls_repeat_pk():
|
|
45
|
+
def test_cached_bls_repeat_pk() -> None:
|
|
46
46
|
n_keys = 400
|
|
47
47
|
seed = b"a" * 32
|
|
48
48
|
sks = [AugSchemeMPL.key_gen(seed) for i in range(n_keys)] + [AugSchemeMPL.key_gen(std_hash(seed))]
|
|
@@ -10,7 +10,7 @@ from multiprocessing import Pool, Queue, TimeoutError
|
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from threading import Thread
|
|
12
12
|
from time import sleep
|
|
13
|
-
from typing import Any,
|
|
13
|
+
from typing import Any, Optional
|
|
14
14
|
|
|
15
15
|
import pytest
|
|
16
16
|
import yaml
|
|
@@ -37,7 +37,7 @@ from chia.util.timing import adjusted_timeout
|
|
|
37
37
|
|
|
38
38
|
def write_config(
|
|
39
39
|
root_path: Path,
|
|
40
|
-
config:
|
|
40
|
+
config: dict,
|
|
41
41
|
atomic_write: bool,
|
|
42
42
|
do_sleep: bool,
|
|
43
43
|
iterations: int,
|
|
@@ -74,7 +74,7 @@ def write_config(
|
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
def read_and_compare_config(
|
|
77
|
-
root_path: Path, default_config:
|
|
77
|
+
root_path: Path, default_config: dict, do_sleep: bool, iterations: int, error_queue: Optional[Queue] = None
|
|
78
78
|
):
|
|
79
79
|
"""
|
|
80
80
|
Wait for a random amount of time, read the config and compare with the
|
|
@@ -99,7 +99,7 @@ def read_and_compare_config(
|
|
|
99
99
|
raise
|
|
100
100
|
|
|
101
101
|
|
|
102
|
-
async def create_reader_and_writer_tasks(root_path: Path, default_config:
|
|
102
|
+
async def create_reader_and_writer_tasks(root_path: Path, default_config: dict):
|
|
103
103
|
"""
|
|
104
104
|
Spin-off reader and writer threads and wait for completion
|
|
105
105
|
"""
|
|
@@ -135,7 +135,7 @@ async def create_reader_and_writer_tasks(root_path: Path, default_config: Dict):
|
|
|
135
135
|
raise error_queue.get()
|
|
136
136
|
|
|
137
137
|
|
|
138
|
-
def run_reader_and_writer_tasks(root_path: Path, default_config:
|
|
138
|
+
def run_reader_and_writer_tasks(root_path: Path, default_config: dict):
|
|
139
139
|
"""
|
|
140
140
|
Subprocess entry point. This function spins-off threads to perform read/write tasks
|
|
141
141
|
concurrently, possibly leading to synchronization issues accessing config data.
|
|
@@ -144,12 +144,12 @@ def run_reader_and_writer_tasks(root_path: Path, default_config: Dict):
|
|
|
144
144
|
|
|
145
145
|
|
|
146
146
|
@pytest.fixture(scope="function")
|
|
147
|
-
def default_config_dict() ->
|
|
147
|
+
def default_config_dict() -> dict:
|
|
148
148
|
"""
|
|
149
149
|
Returns a dictionary containing the default config.yaml contents
|
|
150
150
|
"""
|
|
151
151
|
content: str = initial_config_file("config.yaml")
|
|
152
|
-
config:
|
|
152
|
+
config: dict = yaml.safe_load(content)
|
|
153
153
|
return config
|
|
154
154
|
|
|
155
155
|
|
|
@@ -208,7 +208,7 @@ class TestConfig:
|
|
|
208
208
|
"""
|
|
209
209
|
root_path: Path = root_path_populated_with_config
|
|
210
210
|
# When: loading a newly created config
|
|
211
|
-
config:
|
|
211
|
+
config: dict = load_config(root_path=root_path, filename="config.yaml")
|
|
212
212
|
assert config is not None
|
|
213
213
|
# Expect: config values should match the defaults (from a small sampling)
|
|
214
214
|
assert config["daemon_port"] == default_config_dict["daemon_port"] == 55400
|
|
@@ -242,7 +242,7 @@ class TestConfig:
|
|
|
242
242
|
calling load_config().
|
|
243
243
|
"""
|
|
244
244
|
root_path: Path = root_path_populated_with_config
|
|
245
|
-
config:
|
|
245
|
+
config: dict = copy.deepcopy(default_config_dict)
|
|
246
246
|
# When: modifying the config
|
|
247
247
|
config["harvester"]["farmer_peers"][0]["host"] = "oldmacdonald.eie.io"
|
|
248
248
|
# Sanity check that we didn't modify the default config
|
|
@@ -255,7 +255,7 @@ class TestConfig:
|
|
|
255
255
|
save_config(root_path=root_path, filename="config.yaml", config_data=config)
|
|
256
256
|
|
|
257
257
|
# Expect: modifications should be preserved in the config read from disk
|
|
258
|
-
loaded:
|
|
258
|
+
loaded: dict = load_config(root_path=root_path, filename="config.yaml")
|
|
259
259
|
assert loaded["harvester"]["farmer_peers"][0]["host"] == "oldmacdonald.eie.io"
|
|
260
260
|
|
|
261
261
|
def test_multiple_writers(self, root_path_populated_with_config, default_config_dict):
|
|
@@ -310,7 +310,7 @@ class TestConfig:
|
|
|
310
310
|
await asyncio.gather(*all_tasks)
|
|
311
311
|
|
|
312
312
|
@pytest.mark.parametrize("prefix", [None])
|
|
313
|
-
def test_selected_network_address_prefix_default_config(self, config_with_address_prefix:
|
|
313
|
+
def test_selected_network_address_prefix_default_config(self, config_with_address_prefix: dict[str, Any]) -> None:
|
|
314
314
|
"""
|
|
315
315
|
Temp config.yaml created using a default config. address_prefix is defaulted to "xch"
|
|
316
316
|
"""
|
|
@@ -319,7 +319,7 @@ class TestConfig:
|
|
|
319
319
|
assert prefix == "xch"
|
|
320
320
|
|
|
321
321
|
@pytest.mark.parametrize("prefix", ["txch"])
|
|
322
|
-
def test_selected_network_address_prefix_testnet_config(self, config_with_address_prefix:
|
|
322
|
+
def test_selected_network_address_prefix_testnet_config(self, config_with_address_prefix: dict[str, Any]) -> None:
|
|
323
323
|
"""
|
|
324
324
|
Temp config.yaml created using a modified config. address_prefix is set to "txch"
|
|
325
325
|
"""
|
|
@@ -327,7 +327,7 @@ class TestConfig:
|
|
|
327
327
|
prefix = selected_network_address_prefix(config)
|
|
328
328
|
assert prefix == "txch"
|
|
329
329
|
|
|
330
|
-
def test_selected_network_address_prefix_config_dict(self, default_config_dict:
|
|
330
|
+
def test_selected_network_address_prefix_config_dict(self, default_config_dict: dict[str, Any]) -> None:
|
|
331
331
|
"""
|
|
332
332
|
Modified config dictionary has address_prefix set to "customxch"
|
|
333
333
|
"""
|
|
@@ -336,7 +336,7 @@ class TestWriteFile:
|
|
|
336
336
|
Write a file to a location and use the default permissions.
|
|
337
337
|
"""
|
|
338
338
|
|
|
339
|
-
if sys.platform in
|
|
339
|
+
if sys.platform in {"win32", "cygwin"}:
|
|
340
340
|
pytest.skip("Setting UNIX file permissions doesn't apply to Windows")
|
|
341
341
|
|
|
342
342
|
dest_path: Path = tmp_path / "test_write_file/test_write_file.txt"
|
|
@@ -355,7 +355,7 @@ class TestWriteFile:
|
|
|
355
355
|
Write a file to a location and use custom permissions.
|
|
356
356
|
"""
|
|
357
357
|
|
|
358
|
-
if sys.platform in
|
|
358
|
+
if sys.platform in {"win32", "cygwin"}:
|
|
359
359
|
pytest.skip("Setting UNIX file permissions doesn't apply to Windows")
|
|
360
360
|
|
|
361
361
|
dest_path: Path = tmp_path / "test_write_file/test_write_file.txt"
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Optional
|
|
5
5
|
|
|
6
6
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
7
|
from chia.util.ints import uint32
|
|
8
8
|
from chia.util.streamable import Streamable, recurse_jsonify, streamable
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
def dict_with_types(d:
|
|
11
|
+
def dict_with_types(d: dict[str, Any]) -> dict[str, Any]:
|
|
12
12
|
return {k: (v, type(v)) for k, v in d.items()}
|
|
13
13
|
|
|
14
14
|
|
|
@@ -46,7 +46,7 @@ def test_primitives() -> None:
|
|
|
46
46
|
"set optional",
|
|
47
47
|
"foobar",
|
|
48
48
|
b"\0\1",
|
|
49
|
-
bytes32
|
|
49
|
+
bytes32.zeros,
|
|
50
50
|
False,
|
|
51
51
|
)
|
|
52
52
|
|
|
@@ -64,7 +64,7 @@ def test_list() -> None:
|
|
|
64
64
|
@streamable
|
|
65
65
|
@dataclass(frozen=True)
|
|
66
66
|
class ListTest(Streamable):
|
|
67
|
-
d:
|
|
67
|
+
d: list[str]
|
|
68
68
|
|
|
69
69
|
t = ListTest(["foo", "bar"])
|
|
70
70
|
|
|
@@ -75,7 +75,7 @@ def test_tuple() -> None:
|
|
|
75
75
|
@streamable
|
|
76
76
|
@dataclass(frozen=True)
|
|
77
77
|
class TupleTest(Streamable):
|
|
78
|
-
d:
|
|
78
|
+
d: tuple[str, uint32, str]
|
|
79
79
|
|
|
80
80
|
t = TupleTest(("foo", uint32(123), "bar"))
|
|
81
81
|
|
|
@@ -85,14 +85,14 @@ def test_tuple() -> None:
|
|
|
85
85
|
@streamable
|
|
86
86
|
@dataclass(frozen=True)
|
|
87
87
|
class NestedWithTupleInner(Streamable):
|
|
88
|
-
a:
|
|
88
|
+
a: tuple[str, uint32, str]
|
|
89
89
|
b: bytes
|
|
90
90
|
|
|
91
91
|
|
|
92
92
|
@streamable
|
|
93
93
|
@dataclass(frozen=True)
|
|
94
94
|
class NestedWithTupleOuter(Streamable):
|
|
95
|
-
a:
|
|
95
|
+
a: tuple[NestedWithTupleInner, uint32, str]
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
def test_nested_with_tuple() -> None:
|
|
@@ -113,7 +113,7 @@ class NestedWithListInner(Streamable):
|
|
|
113
113
|
@streamable
|
|
114
114
|
@dataclass(frozen=True)
|
|
115
115
|
class NestedWithListOuter(Streamable):
|
|
116
|
-
a:
|
|
116
|
+
a: list[NestedWithListInner]
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
def test_nested_with_list() -> None:
|
|
@@ -125,7 +125,7 @@ def test_nested_with_list() -> None:
|
|
|
125
125
|
@streamable
|
|
126
126
|
@dataclass(frozen=True)
|
|
127
127
|
class TestNestedInner(Streamable):
|
|
128
|
-
a:
|
|
128
|
+
a: tuple[str, uint32, str]
|
|
129
129
|
b: bytes
|
|
130
130
|
|
|
131
131
|
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
import random
|
|
5
5
|
from dataclasses import dataclass, replace
|
|
6
|
-
from typing import Callable,
|
|
6
|
+
from typing import Callable, Optional
|
|
7
7
|
|
|
8
8
|
import importlib_resources
|
|
9
9
|
import pytest
|
|
@@ -180,7 +180,11 @@ class TestKeychain:
|
|
|
180
180
|
|
|
181
181
|
# All added keys should still be valid with their label
|
|
182
182
|
assert all(
|
|
183
|
-
|
|
183
|
+
# This must be compared to a tuple because the `.mnemonic` property is a list which makes the
|
|
184
|
+
# class unhashable. We should eventually add support in streamable for varadic tuples and maybe remove
|
|
185
|
+
# support for the mutable `list`.
|
|
186
|
+
key_data in (key_data_0, key_data_1, key_data_2) # noqa: PLR6201
|
|
187
|
+
for key_data in keychain.get_keys(include_secrets=True)
|
|
184
188
|
)
|
|
185
189
|
|
|
186
190
|
def test_bip39_eip2333_test_vector(self, empty_temp_file_keyring: TempKeyring):
|
|
@@ -318,7 +322,7 @@ def test_key_data_without_secrets(key_info: KeyInfo) -> None:
|
|
|
318
322
|
((_24keyinfo.mnemonic.split(), _24keyinfo.entropy, KeyDataSecrets.generate().private_key), "private_key"),
|
|
319
323
|
],
|
|
320
324
|
)
|
|
321
|
-
def test_key_data_secrets_post_init(input_data:
|
|
325
|
+
def test_key_data_secrets_post_init(input_data: tuple[list[str], bytes, PrivateKey], data_type: str) -> None:
|
|
322
326
|
with pytest.raises(KeychainKeyDataMismatch, match=data_type):
|
|
323
327
|
KeyDataSecrets(*input_data)
|
|
324
328
|
|
|
@@ -339,7 +343,7 @@ def test_key_data_secrets_post_init(input_data: Tuple[List[str], bytes, PrivateK
|
|
|
339
343
|
],
|
|
340
344
|
)
|
|
341
345
|
def test_key_data_post_init(
|
|
342
|
-
input_data:
|
|
346
|
+
input_data: tuple[uint32, G1Element, Optional[str], Optional[KeyDataSecrets]], data_type: str
|
|
343
347
|
) -> None:
|
|
344
348
|
with pytest.raises(KeychainKeyDataMismatch, match=data_type):
|
|
345
349
|
KeyData(*input_data)
|
|
@@ -427,7 +431,11 @@ async def test_set_label(get_temp_keyring: Keychain) -> None:
|
|
|
427
431
|
keychain.set_label(fingerprint=key_data_1.fingerprint, label=key_data_1.label)
|
|
428
432
|
assert key_data_0 == keychain.get_key(fingerprint=key_data_0.fingerprint, include_secrets=True)
|
|
429
433
|
# All added keys should still be valid with their label
|
|
430
|
-
|
|
434
|
+
|
|
435
|
+
# This must be compared to a tuple because the `.mnemonic` property is a list which makes the
|
|
436
|
+
# class unhashable. We should eventually add support in streamable for varadic tuples and maybe remove
|
|
437
|
+
# support for the mutable `list`.
|
|
438
|
+
assert all(key_data in (key_data_0, key_data_1) for key_data in keychain.get_keys(include_secrets=True)) # noqa: PLR6201
|
|
431
439
|
|
|
432
440
|
|
|
433
441
|
@pytest.mark.parametrize(
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Type
|
|
5
4
|
|
|
6
5
|
import pytest
|
|
7
6
|
|
|
8
7
|
from chia.simulator.keyring import TempKeyring
|
|
9
8
|
from chia.util.errors import KeychainFingerprintNotFound, KeychainLabelError, KeychainLabelExists, KeychainLabelInvalid
|
|
10
9
|
from chia.util.file_keyring import Key
|
|
11
|
-
from chia.util.keyring_wrapper import
|
|
10
|
+
from chia.util.keyring_wrapper import (
|
|
11
|
+
DEFAULT_PASSPHRASE_IF_NO_MASTER_PASSPHRASE,
|
|
12
|
+
KeyringWrapper,
|
|
13
|
+
obtain_current_passphrase,
|
|
14
|
+
)
|
|
12
15
|
|
|
13
16
|
log = logging.getLogger(__name__)
|
|
14
17
|
|
|
@@ -260,8 +263,6 @@ class TestKeyringWrapper:
|
|
|
260
263
|
assert KeyringWrapper.get_shared_instance().keyring.get_key("some service", "some user") is None
|
|
261
264
|
|
|
262
265
|
# Check that metadata is properly deleted
|
|
263
|
-
from chia.cmds.passphrase_funcs import obtain_current_passphrase
|
|
264
|
-
|
|
265
266
|
passphrase = obtain_current_passphrase(use_passphrase_cache=True)
|
|
266
267
|
assert KeyringWrapper.get_shared_instance().keyring.cached_file_content.get_decrypted_data_dict(passphrase) == {
|
|
267
268
|
"keys": {},
|
|
@@ -457,7 +458,7 @@ class TestKeyringWrapper:
|
|
|
457
458
|
],
|
|
458
459
|
)
|
|
459
460
|
def test_set_label_failures(
|
|
460
|
-
self, label: str, exception:
|
|
461
|
+
self, label: str, exception: type[KeychainLabelError], message: str, empty_temp_file_keyring: TempKeyring
|
|
461
462
|
) -> None:
|
|
462
463
|
keyring_wrapper = KeyringWrapper.get_shared_instance()
|
|
463
464
|
keyring_wrapper.keyring.set_label(1, "one")
|
|
@@ -4,7 +4,7 @@ import contextlib
|
|
|
4
4
|
import dataclasses
|
|
5
5
|
import logging
|
|
6
6
|
import re
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Union
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
10
|
|
|
@@ -21,8 +21,8 @@ def logger_fixture() -> logging.Logger:
|
|
|
21
21
|
|
|
22
22
|
@dataclasses.dataclass
|
|
23
23
|
class ErrorCase:
|
|
24
|
-
type_to_raise:
|
|
25
|
-
type_to_catch: Union[
|
|
24
|
+
type_to_raise: type[BaseException]
|
|
25
|
+
type_to_catch: Union[type[BaseException], tuple[type[BaseException], ...]]
|
|
26
26
|
should_match: bool
|
|
27
27
|
|
|
28
28
|
|