chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/server/ws_connection.py
CHANGED
|
@@ -5,8 +5,9 @@ import logging
|
|
|
5
5
|
import math
|
|
6
6
|
import time
|
|
7
7
|
import traceback
|
|
8
|
+
from collections.abc import Awaitable
|
|
8
9
|
from dataclasses import dataclass, field
|
|
9
|
-
from typing import Any,
|
|
10
|
+
from typing import Any, Callable, Optional, Union
|
|
10
11
|
|
|
11
12
|
from aiohttp import ClientSession, WebSocketError, WSCloseCode, WSMessage, WSMsgType
|
|
12
13
|
from aiohttp.client import ClientWebSocketResponse
|
|
@@ -21,22 +22,23 @@ from chia.protocols.protocol_timing import (
|
|
|
21
22
|
API_EXCEPTION_BAN_SECONDS,
|
|
22
23
|
CONSENSUS_ERROR_BAN_SECONDS,
|
|
23
24
|
INTERNAL_PROTOCOL_ERROR_BAN_SECONDS,
|
|
25
|
+
RATE_LIMITER_BAN_SECONDS,
|
|
24
26
|
)
|
|
25
27
|
from chia.protocols.shared_protocol import Capability, Error, Handshake, protocol_version
|
|
26
|
-
from chia.server.api_protocol import ApiProtocol
|
|
28
|
+
from chia.server.api_protocol import ApiMetadata, ApiProtocol
|
|
27
29
|
from chia.server.capabilities import known_active_capabilities
|
|
28
30
|
from chia.server.outbound_message import Message, NodeType, make_msg
|
|
29
31
|
from chia.server.rate_limits import RateLimiter
|
|
30
32
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
31
33
|
from chia.types.peer_info import PeerInfo
|
|
32
|
-
from chia.util.api_decorators import get_metadata
|
|
33
34
|
from chia.util.errors import ApiError, ConsensusError, Err, ProtocolError, TimestampError
|
|
34
35
|
from chia.util.ints import int16, uint8, uint16
|
|
35
36
|
from chia.util.log_exceptions import log_exceptions
|
|
36
37
|
|
|
37
38
|
# Each message is prepended with LENGTH_BYTES bytes specifying the length
|
|
38
|
-
from chia.util.network import
|
|
39
|
+
from chia.util.network import is_localhost
|
|
39
40
|
from chia.util.streamable import Streamable
|
|
41
|
+
from chia.util.task_referencer import create_referenced_task
|
|
40
42
|
|
|
41
43
|
# Max size 2^(8*4) which is around 4GiB
|
|
42
44
|
LENGTH_BYTES: int = 4
|
|
@@ -47,7 +49,7 @@ ConnectionCallback = Callable[["WSChiaConnection"], Awaitable[None]]
|
|
|
47
49
|
error_response_version = Version("0.0.35")
|
|
48
50
|
|
|
49
51
|
|
|
50
|
-
def create_default_last_message_time_dict() ->
|
|
52
|
+
def create_default_last_message_time_dict() -> dict[ProtocolMessageTypes, float]:
|
|
51
53
|
return {message_type: -math.inf for message_type in ProtocolMessageTypes}
|
|
52
54
|
|
|
53
55
|
|
|
@@ -73,8 +75,8 @@ class WSChiaConnection:
|
|
|
73
75
|
api: ApiProtocol = field(repr=False)
|
|
74
76
|
local_type: NodeType
|
|
75
77
|
local_port: Optional[int]
|
|
76
|
-
local_capabilities_for_handshake:
|
|
77
|
-
local_capabilities:
|
|
78
|
+
local_capabilities_for_handshake: list[tuple[uint16, str]] = field(repr=False)
|
|
79
|
+
local_capabilities: list[Capability]
|
|
78
80
|
peer_info: PeerInfo
|
|
79
81
|
peer_node_id: bytes32
|
|
80
82
|
log: logging.Logger = field(repr=False)
|
|
@@ -82,6 +84,7 @@ class WSChiaConnection:
|
|
|
82
84
|
close_callback: Optional[ConnectionClosedCallbackProtocol] = field(repr=False)
|
|
83
85
|
outbound_rate_limiter: RateLimiter
|
|
84
86
|
inbound_rate_limiter: RateLimiter
|
|
87
|
+
class_for_type: dict[NodeType, type[ApiProtocol]] = field(repr=False)
|
|
85
88
|
|
|
86
89
|
# connection properties
|
|
87
90
|
is_outbound: bool
|
|
@@ -90,9 +93,9 @@ class WSChiaConnection:
|
|
|
90
93
|
received_message_callback: Optional[ConnectionCallback] = field(repr=False)
|
|
91
94
|
incoming_queue: asyncio.Queue[Message] = field(default_factory=asyncio.Queue, repr=False)
|
|
92
95
|
outgoing_queue: asyncio.Queue[Message] = field(default_factory=asyncio.Queue, repr=False)
|
|
93
|
-
api_tasks:
|
|
96
|
+
api_tasks: dict[bytes32, asyncio.Task[None]] = field(default_factory=dict, repr=False)
|
|
94
97
|
# Contains task ids of api tasks which should not be canceled
|
|
95
|
-
execute_tasks:
|
|
98
|
+
execute_tasks: set[bytes32] = field(default_factory=set, repr=False)
|
|
96
99
|
|
|
97
100
|
# ChiaConnection metrics
|
|
98
101
|
creation_time: float = field(default_factory=time.time)
|
|
@@ -107,17 +110,17 @@ class WSChiaConnection:
|
|
|
107
110
|
_close_event: asyncio.Event = field(default_factory=asyncio.Event, repr=False)
|
|
108
111
|
session: Optional[ClientSession] = field(default=None, repr=False)
|
|
109
112
|
|
|
110
|
-
pending_requests:
|
|
111
|
-
request_results:
|
|
113
|
+
pending_requests: dict[uint16, asyncio.Event] = field(default_factory=dict, repr=False)
|
|
114
|
+
request_results: dict[uint16, Message] = field(default_factory=dict, repr=False)
|
|
112
115
|
closed: bool = False
|
|
113
116
|
connection_type: Optional[NodeType] = None
|
|
114
117
|
request_nonce: uint16 = uint16(0)
|
|
115
|
-
peer_capabilities:
|
|
118
|
+
peer_capabilities: list[Capability] = field(default_factory=list)
|
|
116
119
|
# Used by the Chia Seeder.
|
|
117
120
|
version: str = field(default_factory=str)
|
|
118
121
|
protocol_version: Version = field(default_factory=lambda: Version("0"))
|
|
119
122
|
|
|
120
|
-
log_rate_limit_last_time:
|
|
123
|
+
log_rate_limit_last_time: dict[ProtocolMessageTypes, float] = field(
|
|
121
124
|
default_factory=create_default_last_message_time_dict,
|
|
122
125
|
repr=False,
|
|
123
126
|
)
|
|
@@ -136,7 +139,8 @@ class WSChiaConnection:
|
|
|
136
139
|
peer_id: bytes32,
|
|
137
140
|
inbound_rate_limit_percent: int,
|
|
138
141
|
outbound_rate_limit_percent: int,
|
|
139
|
-
local_capabilities_for_handshake:
|
|
142
|
+
local_capabilities_for_handshake: list[tuple[uint16, str]],
|
|
143
|
+
class_for_type: dict[NodeType, type[ApiProtocol]],
|
|
140
144
|
session: Optional[ClientSession] = None,
|
|
141
145
|
) -> WSChiaConnection:
|
|
142
146
|
assert ws._writer is not None
|
|
@@ -168,6 +172,7 @@ class WSChiaConnection:
|
|
|
168
172
|
inbound_rate_limiter=RateLimiter(incoming=True, percentage_of_limit=inbound_rate_limit_percent),
|
|
169
173
|
is_outbound=is_outbound,
|
|
170
174
|
received_message_callback=received_message_callback,
|
|
175
|
+
class_for_type=class_for_type,
|
|
171
176
|
session=session,
|
|
172
177
|
)
|
|
173
178
|
|
|
@@ -222,7 +227,7 @@ class WSChiaConnection:
|
|
|
222
227
|
raise ProtocolError(Err.INCOMPATIBLE_NETWORK_ID)
|
|
223
228
|
|
|
224
229
|
if (
|
|
225
|
-
local_type in
|
|
230
|
+
local_type in {NodeType.FARMER, NodeType.HARVESTER}
|
|
226
231
|
and inbound_handshake.protocol_version != protocol_version[local_type]
|
|
227
232
|
):
|
|
228
233
|
self.log.warning(
|
|
@@ -263,7 +268,7 @@ class WSChiaConnection:
|
|
|
263
268
|
remote_node_type = NodeType(inbound_handshake.node_type)
|
|
264
269
|
|
|
265
270
|
if (
|
|
266
|
-
remote_node_type in
|
|
271
|
+
remote_node_type in {NodeType.FARMER, NodeType.HARVESTER}
|
|
267
272
|
and inbound_handshake.protocol_version != protocol_version[remote_node_type]
|
|
268
273
|
):
|
|
269
274
|
self.log.warning(
|
|
@@ -292,9 +297,9 @@ class WSChiaConnection:
|
|
|
292
297
|
# "1" means capability is enabled
|
|
293
298
|
self.peer_capabilities = known_active_capabilities(inbound_handshake.capabilities)
|
|
294
299
|
|
|
295
|
-
self.outbound_task =
|
|
296
|
-
self.inbound_task =
|
|
297
|
-
self.incoming_message_task =
|
|
300
|
+
self.outbound_task = create_referenced_task(self.outbound_handler())
|
|
301
|
+
self.inbound_task = create_referenced_task(self.inbound_handler())
|
|
302
|
+
self.incoming_message_task = create_referenced_task(self.incoming_message_handler())
|
|
298
303
|
|
|
299
304
|
async def close(
|
|
300
305
|
self,
|
|
@@ -375,8 +380,9 @@ class WSChiaConnection:
|
|
|
375
380
|
except asyncio.CancelledError:
|
|
376
381
|
pass
|
|
377
382
|
except Exception as e:
|
|
383
|
+
expected_types = (BrokenPipeError, ConnectionResetError, TimeoutError)
|
|
378
384
|
expected = False
|
|
379
|
-
if isinstance(e, (
|
|
385
|
+
if isinstance(e, expected_types) or isinstance(e.__cause__, expected_types):
|
|
380
386
|
expected = True
|
|
381
387
|
elif isinstance(e, OSError):
|
|
382
388
|
if e.errno in {113}:
|
|
@@ -398,20 +404,20 @@ class WSChiaConnection:
|
|
|
398
404
|
self.log.debug(
|
|
399
405
|
f"<- {ProtocolMessageTypes(full_message.type).name} from peer {self.peer_node_id} {self.peer_info.host}"
|
|
400
406
|
)
|
|
401
|
-
message_type = ProtocolMessageTypes(full_message.type).name
|
|
402
407
|
|
|
403
408
|
if full_message.type == ProtocolMessageTypes.error.value:
|
|
404
409
|
error = Error.from_bytes(full_message.data)
|
|
405
410
|
self.api.log.warning(f"ApiError: {error} from {self.peer_node_id}, {self.peer_info}")
|
|
406
411
|
return None
|
|
407
412
|
|
|
408
|
-
|
|
413
|
+
bare_message_type = ProtocolMessageTypes(full_message.type)
|
|
414
|
+
metadata = self.api.metadata.message_type_to_request.get(bare_message_type)
|
|
415
|
+
message_type = bare_message_type.name
|
|
409
416
|
|
|
410
|
-
if
|
|
417
|
+
if metadata is None:
|
|
411
418
|
self.log.error(f"Non existing function: {message_type}")
|
|
412
419
|
raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [message_type])
|
|
413
420
|
|
|
414
|
-
metadata = get_metadata(function=f)
|
|
415
421
|
if metadata is None:
|
|
416
422
|
self.log.error(f"Peer trying to call non api function {message_type}")
|
|
417
423
|
raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [message_type])
|
|
@@ -428,14 +434,13 @@ class WSChiaConnection:
|
|
|
428
434
|
timeout = None
|
|
429
435
|
|
|
430
436
|
if metadata.peer_required:
|
|
431
|
-
coroutine =
|
|
437
|
+
coroutine = metadata.method(self.api, full_message.data, self)
|
|
432
438
|
else:
|
|
433
|
-
coroutine =
|
|
439
|
+
coroutine = metadata.method(self.api, full_message.data)
|
|
434
440
|
|
|
435
441
|
async def wrapped_coroutine() -> Optional[Message]:
|
|
436
442
|
try:
|
|
437
|
-
|
|
438
|
-
result: Message = await coroutine
|
|
443
|
+
result = await coroutine
|
|
439
444
|
return result
|
|
440
445
|
except asyncio.CancelledError:
|
|
441
446
|
pass
|
|
@@ -499,7 +504,7 @@ class WSChiaConnection:
|
|
|
499
504
|
while True:
|
|
500
505
|
message = await self.incoming_queue.get()
|
|
501
506
|
task_id: bytes32 = bytes32.secret()
|
|
502
|
-
api_task =
|
|
507
|
+
api_task = create_referenced_task(self._api_call(message, task_id))
|
|
503
508
|
self.api_tasks[task_id] = api_task
|
|
504
509
|
|
|
505
510
|
async def inbound_handler(self) -> None:
|
|
@@ -537,10 +542,12 @@ class WSChiaConnection:
|
|
|
537
542
|
) -> Any:
|
|
538
543
|
if self.connection_type is None:
|
|
539
544
|
raise ValueError("handshake not done yet")
|
|
540
|
-
request_metadata =
|
|
545
|
+
request_metadata = ApiMetadata.from_bound_method(request_method)
|
|
541
546
|
assert request_metadata is not None, f"ApiMetadata unavailable for {request_method}"
|
|
542
|
-
|
|
543
|
-
|
|
547
|
+
if (
|
|
548
|
+
request_metadata.request_type
|
|
549
|
+
not in self.class_for_type[self.connection_type].metadata.message_type_to_request
|
|
550
|
+
):
|
|
544
551
|
raise AttributeError(
|
|
545
552
|
f"Node type {self.connection_type} does not have method {request_metadata.request_type.name}"
|
|
546
553
|
)
|
|
@@ -566,8 +573,8 @@ class WSChiaConnection:
|
|
|
566
573
|
await self.ban_peer_bad_protocol(error_message)
|
|
567
574
|
raise ProtocolError(Err.INVALID_PROTOCOL_MESSAGE, [error_message])
|
|
568
575
|
|
|
569
|
-
recv_method =
|
|
570
|
-
receive_metadata =
|
|
576
|
+
recv_method = self.class_for_type[self.local_type].metadata.message_type_to_request[recv_message_type].method
|
|
577
|
+
receive_metadata = ApiMetadata.from_bound_method(recv_method)
|
|
571
578
|
assert receive_metadata is not None, f"ApiMetadata unavailable for {recv_method}"
|
|
572
579
|
return receive_metadata.message_class.from_bytes(response.data)
|
|
573
580
|
|
|
@@ -621,21 +628,29 @@ class WSChiaConnection:
|
|
|
621
628
|
encoded: bytes = bytes(message)
|
|
622
629
|
size = len(encoded)
|
|
623
630
|
assert len(encoded) < (2 ** (LENGTH_BYTES * 8))
|
|
624
|
-
|
|
631
|
+
limiter_msg = self.outbound_rate_limiter.process_msg_and_check(
|
|
625
632
|
message, self.local_capabilities, self.peer_capabilities
|
|
626
|
-
)
|
|
633
|
+
)
|
|
634
|
+
if limiter_msg is not None:
|
|
627
635
|
if not is_localhost(self.peer_info.host):
|
|
628
636
|
message_type = ProtocolMessageTypes(message.type)
|
|
629
637
|
last_time = self.log_rate_limit_last_time[message_type]
|
|
630
638
|
now = time.monotonic()
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
639
|
+
if now - last_time >= 30:
|
|
640
|
+
self.log_rate_limit_last_time[message_type] = now
|
|
641
|
+
details = ", ".join(
|
|
642
|
+
[
|
|
643
|
+
f"{message_type.name}",
|
|
644
|
+
f"sz: {len(message.data) / 1000:0.2f} kB",
|
|
645
|
+
f"peer: {self.peer_info.host}",
|
|
646
|
+
f"{limiter_msg}",
|
|
647
|
+
]
|
|
648
|
+
)
|
|
649
|
+
self.log.info(f"Rate limiting ourselves. Dropping outbound message: {details}")
|
|
635
650
|
|
|
636
651
|
# TODO: fix this special case. This function has rate limits which are too low.
|
|
637
652
|
if ProtocolMessageTypes(message.type) != ProtocolMessageTypes.respond_peers:
|
|
638
|
-
|
|
653
|
+
create_referenced_task(self._wait_and_retry(message), known_unreferenced=True)
|
|
639
654
|
|
|
640
655
|
return None
|
|
641
656
|
else:
|
|
@@ -663,7 +678,7 @@ class WSChiaConnection:
|
|
|
663
678
|
f"{self.peer_server_port}/"
|
|
664
679
|
f"{self.peer_info.port}"
|
|
665
680
|
)
|
|
666
|
-
|
|
681
|
+
create_referenced_task(self.close(), known_unreferenced=True)
|
|
667
682
|
await asyncio.sleep(3)
|
|
668
683
|
elif message.type == WSMsgType.CLOSE:
|
|
669
684
|
self.log.debug(
|
|
@@ -671,11 +686,11 @@ class WSChiaConnection:
|
|
|
671
686
|
f"{self.peer_server_port}/"
|
|
672
687
|
f"{self.peer_info.port}"
|
|
673
688
|
)
|
|
674
|
-
|
|
689
|
+
create_referenced_task(self.close(), known_unreferenced=True)
|
|
675
690
|
await asyncio.sleep(3)
|
|
676
691
|
elif message.type == WSMsgType.CLOSED:
|
|
677
692
|
if not self.closed:
|
|
678
|
-
|
|
693
|
+
create_referenced_task(self.close(), known_unreferenced=True)
|
|
679
694
|
await asyncio.sleep(3)
|
|
680
695
|
return None
|
|
681
696
|
elif message.type == WSMsgType.BINARY:
|
|
@@ -687,16 +702,15 @@ class WSChiaConnection:
|
|
|
687
702
|
message_type = ProtocolMessageTypes(full_message_loaded.type).name
|
|
688
703
|
except Exception:
|
|
689
704
|
message_type = "Unknown"
|
|
690
|
-
|
|
705
|
+
limiter_msg = self.inbound_rate_limiter.process_msg_and_check(
|
|
691
706
|
full_message_loaded, self.local_capabilities, self.peer_capabilities
|
|
692
|
-
)
|
|
707
|
+
)
|
|
708
|
+
if limiter_msg is not None:
|
|
693
709
|
if self.local_type == NodeType.FULL_NODE and not is_localhost(self.peer_info.host):
|
|
694
|
-
self.
|
|
695
|
-
|
|
696
|
-
f"message: {message_type}"
|
|
697
|
-
)
|
|
710
|
+
details = ", ".join([f"{self.peer_info.host}", f"message: {message_type}", limiter_msg])
|
|
711
|
+
self.log.error(f"Peer has been rate limited and will be disconnected: {details}")
|
|
698
712
|
# Only full node disconnects peers, to prevent abuse and crashing timelords, farmers, etc
|
|
699
|
-
|
|
713
|
+
create_referenced_task(self.close(RATE_LIMITER_BAN_SECONDS), known_unreferenced=True)
|
|
700
714
|
await asyncio.sleep(3)
|
|
701
715
|
return None
|
|
702
716
|
else:
|
|
@@ -709,14 +723,14 @@ class WSChiaConnection:
|
|
|
709
723
|
elif message.type == WSMsgType.ERROR:
|
|
710
724
|
self.log.error(f"WebSocket Error: {message}")
|
|
711
725
|
if isinstance(message.data, WebSocketError) and message.data.code == WSCloseCode.MESSAGE_TOO_BIG:
|
|
712
|
-
|
|
726
|
+
create_referenced_task(self.close(RATE_LIMITER_BAN_SECONDS), known_unreferenced=True)
|
|
713
727
|
else:
|
|
714
|
-
|
|
728
|
+
create_referenced_task(self.close(), known_unreferenced=True)
|
|
715
729
|
await asyncio.sleep(3)
|
|
716
730
|
|
|
717
731
|
else:
|
|
718
732
|
self.log.error(f"Unexpected WebSocket message type: {message}")
|
|
719
|
-
|
|
733
|
+
create_referenced_task(self.close())
|
|
720
734
|
await asyncio.sleep(3)
|
|
721
735
|
return None
|
|
722
736
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from chia.consensus.block_body_validation import ForkInfo
|
|
6
|
+
from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
|
|
7
|
+
from chia.full_node.full_node import FullNode, PeakPostProcessingResult
|
|
8
|
+
from chia.types.full_block import FullBlock
|
|
9
|
+
from chia.types.peer_info import PeerInfo
|
|
10
|
+
from chia.types.validation_state import ValidationState
|
|
11
|
+
from chia.util.batches import to_batches
|
|
12
|
+
from chia.util.ints import uint32
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def add_blocks_in_batches(
|
|
16
|
+
blocks: list[FullBlock],
|
|
17
|
+
full_node: FullNode,
|
|
18
|
+
) -> None:
|
|
19
|
+
peak_hash = blocks[0].prev_header_hash
|
|
20
|
+
if blocks[0].height == 0:
|
|
21
|
+
assert peak_hash == full_node.constants.GENESIS_CHALLENGE
|
|
22
|
+
diff = full_node.constants.DIFFICULTY_STARTING
|
|
23
|
+
ssi = full_node.constants.SUB_SLOT_ITERS_STARTING
|
|
24
|
+
fork_height = -1
|
|
25
|
+
else:
|
|
26
|
+
# assume the fork point is immediately before the
|
|
27
|
+
# batch of block we're about to add
|
|
28
|
+
block_record = await full_node.blockchain.get_block_record_from_db(peak_hash)
|
|
29
|
+
assert block_record is not None
|
|
30
|
+
ssi, diff = get_next_sub_slot_iters_and_difficulty(
|
|
31
|
+
full_node.constants, True, block_record, full_node.blockchain
|
|
32
|
+
)
|
|
33
|
+
fork_height = block_record.height
|
|
34
|
+
fork_info = ForkInfo(fork_height, blocks[0].height - 1, peak_hash)
|
|
35
|
+
|
|
36
|
+
vs = ValidationState(ssi, diff, None)
|
|
37
|
+
|
|
38
|
+
for block_batch in to_batches(blocks, 64):
|
|
39
|
+
b = block_batch.entries[0]
|
|
40
|
+
if (b.height % 128) == 0:
|
|
41
|
+
print(f"main chain: {b.height:4} weight: {b.weight}")
|
|
42
|
+
# vs is updated by the call to add_block_batch()
|
|
43
|
+
success, state_change_summary = await full_node.add_block_batch(
|
|
44
|
+
block_batch.entries, PeerInfo("0.0.0.0", 0), fork_info, vs
|
|
45
|
+
)
|
|
46
|
+
assert success is True
|
|
47
|
+
if state_change_summary is not None:
|
|
48
|
+
peak_fb: Optional[FullBlock] = await full_node.blockchain.get_full_peak()
|
|
49
|
+
assert peak_fb is not None
|
|
50
|
+
ppp_result: PeakPostProcessingResult = await full_node.peak_post_processing(
|
|
51
|
+
peak_fb, state_change_summary, None
|
|
52
|
+
)
|
|
53
|
+
await full_node.peak_post_processing_2(peak_fb, None, state_change_summary, ppp_result)
|
|
54
|
+
await full_node._finish_sync(uint32(max(0, fork_height)))
|