chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -3,9 +3,10 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
|
+
from collections.abc import Awaitable, Collection
|
|
6
7
|
from concurrent.futures import Executor, ThreadPoolExecutor
|
|
7
8
|
from dataclasses import dataclass
|
|
8
|
-
from typing import
|
|
9
|
+
from typing import Callable, Optional, TypeVar
|
|
9
10
|
|
|
10
11
|
from chia_rs import ELIGIBLE_FOR_DEDUP, ELIGIBLE_FOR_FF, BLSCache, supports_fast_forward, validate_clvm_and_signature
|
|
11
12
|
from chiabip158 import PyBIP158
|
|
@@ -33,7 +34,6 @@ from chia.util.db_wrapper import SQLITE_INT_MAX
|
|
|
33
34
|
from chia.util.errors import Err, ValidationError
|
|
34
35
|
from chia.util.inline_executor import InlineExecutor
|
|
35
36
|
from chia.util.ints import uint32, uint64
|
|
36
|
-
from chia.util.setproctitle import getproctitle, setproctitle
|
|
37
37
|
|
|
38
38
|
log = logging.getLogger(__name__)
|
|
39
39
|
|
|
@@ -51,7 +51,7 @@ class TimelockConditions:
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
def compute_assert_height(
|
|
54
|
-
removal_coin_records:
|
|
54
|
+
removal_coin_records: dict[bytes32, CoinRecord],
|
|
55
55
|
conds: SpendBundleConditions,
|
|
56
56
|
) -> TimelockConditions:
|
|
57
57
|
"""
|
|
@@ -102,14 +102,14 @@ def compute_assert_height(
|
|
|
102
102
|
class SpendBundleAddInfo:
|
|
103
103
|
cost: Optional[uint64]
|
|
104
104
|
status: MempoolInclusionStatus
|
|
105
|
-
removals:
|
|
105
|
+
removals: list[MempoolRemoveInfo]
|
|
106
106
|
error: Optional[Err]
|
|
107
107
|
|
|
108
108
|
|
|
109
109
|
@dataclass
|
|
110
110
|
class NewPeakInfo:
|
|
111
|
-
items:
|
|
112
|
-
removals:
|
|
111
|
+
items: list[NewPeakItem]
|
|
112
|
+
removals: list[MempoolRemoveInfo]
|
|
113
113
|
|
|
114
114
|
|
|
115
115
|
@dataclass
|
|
@@ -127,8 +127,8 @@ QUOTE_EXECUTION_COST = 20
|
|
|
127
127
|
class MempoolManager:
|
|
128
128
|
pool: Executor
|
|
129
129
|
constants: ConsensusConstants
|
|
130
|
-
seen_bundle_hashes:
|
|
131
|
-
get_coin_records: Callable[[Collection[bytes32]], Awaitable[
|
|
130
|
+
seen_bundle_hashes: dict[bytes32, bytes32]
|
|
131
|
+
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]]
|
|
132
132
|
nonzero_fee_minimum_fpc: int
|
|
133
133
|
mempool_max_total_cost: int
|
|
134
134
|
# a cache of MempoolItems that conflict with existing items in the pool
|
|
@@ -144,7 +144,7 @@ class MempoolManager:
|
|
|
144
144
|
|
|
145
145
|
def __init__(
|
|
146
146
|
self,
|
|
147
|
-
get_coin_records: Callable[[Collection[bytes32]], Awaitable[
|
|
147
|
+
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
|
|
148
148
|
consensus_constants: ConsensusConstants,
|
|
149
149
|
*,
|
|
150
150
|
single_threaded: bool = False,
|
|
@@ -153,7 +153,7 @@ class MempoolManager:
|
|
|
153
153
|
self.constants: ConsensusConstants = consensus_constants
|
|
154
154
|
|
|
155
155
|
# Keep track of seen spend_bundles
|
|
156
|
-
self.seen_bundle_hashes:
|
|
156
|
+
self.seen_bundle_hashes: dict[bytes32, bytes32] = {}
|
|
157
157
|
|
|
158
158
|
self.get_coin_records = get_coin_records
|
|
159
159
|
|
|
@@ -162,12 +162,11 @@ class MempoolManager:
|
|
|
162
162
|
# spends.
|
|
163
163
|
self.nonzero_fee_minimum_fpc = 5
|
|
164
164
|
|
|
165
|
-
BLOCK_SIZE_LIMIT_FACTOR = 0.7
|
|
166
165
|
# We need to deduct the block overhead, which consists of the wrapping
|
|
167
166
|
# quote opcode's bytes cost as well as its execution cost.
|
|
168
167
|
BLOCK_OVERHEAD = QUOTE_BYTES * self.constants.COST_PER_BYTE + QUOTE_EXECUTION_COST
|
|
169
168
|
|
|
170
|
-
self.max_block_clvm_cost = uint64(self.constants.MAX_BLOCK_COST_CLVM
|
|
169
|
+
self.max_block_clvm_cost = uint64(self.constants.MAX_BLOCK_COST_CLVM - BLOCK_OVERHEAD)
|
|
171
170
|
self.max_tx_clvm_cost = (
|
|
172
171
|
max_tx_clvm_cost if max_tx_clvm_cost is not None else uint64(self.constants.MAX_BLOCK_COST_CLVM // 2)
|
|
173
172
|
)
|
|
@@ -181,11 +180,7 @@ class MempoolManager:
|
|
|
181
180
|
if single_threaded:
|
|
182
181
|
self.pool = InlineExecutor()
|
|
183
182
|
else:
|
|
184
|
-
self.pool = ThreadPoolExecutor(
|
|
185
|
-
max_workers=2,
|
|
186
|
-
initializer=setproctitle,
|
|
187
|
-
initargs=(f"{getproctitle()}_mempool_worker",),
|
|
188
|
-
)
|
|
183
|
+
self.pool = ThreadPoolExecutor(max_workers=2)
|
|
189
184
|
|
|
190
185
|
# The mempool will correspond to a certain peak
|
|
191
186
|
self.peak: Optional[BlockRecordProtocol] = None
|
|
@@ -205,7 +200,7 @@ class MempoolManager:
|
|
|
205
200
|
last_tb_header_hash: bytes32,
|
|
206
201
|
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
|
|
207
202
|
item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
|
|
208
|
-
) -> Optional[
|
|
203
|
+
) -> Optional[tuple[SpendBundle, list[Coin]]]:
|
|
209
204
|
"""
|
|
210
205
|
Returns aggregated spendbundle that can be used for creating new block,
|
|
211
206
|
additions and removals in that spend_bundle
|
|
@@ -224,7 +219,7 @@ class MempoolManager:
|
|
|
224
219
|
)
|
|
225
220
|
|
|
226
221
|
def get_filter(self) -> bytes:
|
|
227
|
-
all_transactions:
|
|
222
|
+
all_transactions: set[bytes32] = set()
|
|
228
223
|
byte_array_list = []
|
|
229
224
|
for key in self.mempool.all_item_ids():
|
|
230
225
|
if key not in all_transactions:
|
|
@@ -252,7 +247,7 @@ class MempoolManager:
|
|
|
252
247
|
def add_and_maybe_pop_seen(self, spend_name: bytes32) -> None:
|
|
253
248
|
self.seen_bundle_hashes[spend_name] = spend_name
|
|
254
249
|
while len(self.seen_bundle_hashes) > self.seen_cache_size:
|
|
255
|
-
first_in =
|
|
250
|
+
first_in = next(iter(self.seen_bundle_hashes.keys()))
|
|
256
251
|
self.seen_bundle_hashes.pop(first_in)
|
|
257
252
|
|
|
258
253
|
def seen(self, bundle_hash: bytes32) -> bool:
|
|
@@ -321,7 +316,7 @@ class MempoolManager:
|
|
|
321
316
|
conds: SpendBundleConditions,
|
|
322
317
|
spend_name: bytes32,
|
|
323
318
|
first_added_height: uint32,
|
|
324
|
-
get_coin_records: Optional[Callable[[Collection[bytes32]], Awaitable[
|
|
319
|
+
get_coin_records: Optional[Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]]] = None,
|
|
325
320
|
) -> SpendBundleAddInfo:
|
|
326
321
|
"""
|
|
327
322
|
Validates and adds to mempool a new_spend with the given NPCResult, and spend_name, and the current mempool.
|
|
@@ -337,7 +332,7 @@ class MempoolManager:
|
|
|
337
332
|
Returns:
|
|
338
333
|
Optional[uint64]: cost of the entire transaction, None iff status is FAILED
|
|
339
334
|
MempoolInclusionStatus: SUCCESS (should add to pool), FAILED (cannot add), and PENDING (can add later)
|
|
340
|
-
|
|
335
|
+
list[MempoolRemoveInfo]: conflicting mempool items which were removed, if no Err
|
|
341
336
|
Optional[Err]: Err is set iff status is FAILED
|
|
342
337
|
"""
|
|
343
338
|
|
|
@@ -362,7 +357,7 @@ class MempoolManager:
|
|
|
362
357
|
info = self.mempool.add_to_pool(item)
|
|
363
358
|
if info.error is not None:
|
|
364
359
|
return SpendBundleAddInfo(item.cost, MempoolInclusionStatus.FAILED, [], info.error)
|
|
365
|
-
return SpendBundleAddInfo(item.cost, MempoolInclusionStatus.SUCCESS, info.removals
|
|
360
|
+
return SpendBundleAddInfo(item.cost, MempoolInclusionStatus.SUCCESS, [*info.removals, conflict], None)
|
|
366
361
|
elif err is Err.MEMPOOL_CONFLICT and item is not None:
|
|
367
362
|
# The transaction has a conflict with another item in the
|
|
368
363
|
# mempool, put it aside and re-try it later
|
|
@@ -383,8 +378,8 @@ class MempoolManager:
|
|
|
383
378
|
conds: SpendBundleConditions,
|
|
384
379
|
spend_name: bytes32,
|
|
385
380
|
first_added_height: uint32,
|
|
386
|
-
get_coin_records: Callable[[Collection[bytes32]], Awaitable[
|
|
387
|
-
) ->
|
|
381
|
+
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
|
|
382
|
+
) -> tuple[Optional[Err], Optional[MempoolItem], list[bytes32]]:
|
|
388
383
|
"""
|
|
389
384
|
Validates new_spend with the given NPCResult, and spend_name, and the current mempool. The mempool should
|
|
390
385
|
be locked during this call (blockchain lock).
|
|
@@ -400,7 +395,7 @@ class MempoolManager:
|
|
|
400
395
|
Returns:
|
|
401
396
|
Optional[Err]: Err is set if we cannot add to the mempool, None if we will immediately add to mempool
|
|
402
397
|
Optional[MempoolItem]: the item to add (to mempool or pending pool)
|
|
403
|
-
|
|
398
|
+
list[bytes32]: conflicting mempool items to remove, if no Err
|
|
404
399
|
"""
|
|
405
400
|
start_time = time.time()
|
|
406
401
|
if self.peak is None:
|
|
@@ -408,12 +403,12 @@ class MempoolManager:
|
|
|
408
403
|
|
|
409
404
|
cost = conds.cost
|
|
410
405
|
|
|
411
|
-
removal_names:
|
|
412
|
-
additions_dict:
|
|
406
|
+
removal_names: set[bytes32] = set()
|
|
407
|
+
additions_dict: dict[bytes32, Coin] = {}
|
|
413
408
|
addition_amount: int = 0
|
|
414
409
|
# Map of coin ID to eligibility information
|
|
415
|
-
eligibility_and_additions:
|
|
416
|
-
non_eligible_coin_ids:
|
|
410
|
+
eligibility_and_additions: dict[bytes32, EligibilityAndAdditions] = {}
|
|
411
|
+
non_eligible_coin_ids: list[bytes32] = []
|
|
417
412
|
for spend in conds.spends:
|
|
418
413
|
coin_id = bytes32(spend.coin_id)
|
|
419
414
|
removal_names.add(coin_id)
|
|
@@ -422,7 +417,7 @@ class MempoolManager:
|
|
|
422
417
|
child_coin = Coin(coin_id, puzzle_hash, uint64(amount))
|
|
423
418
|
spend_additions.append(child_coin)
|
|
424
419
|
additions_dict[child_coin.name()] = child_coin
|
|
425
|
-
addition_amount
|
|
420
|
+
addition_amount += child_coin.amount
|
|
426
421
|
is_eligible_for_dedup = bool(spend.flags & ELIGIBLE_FOR_DEDUP)
|
|
427
422
|
is_eligible_for_ff = bool(spend.flags & ELIGIBLE_FOR_FF)
|
|
428
423
|
eligibility_and_additions[coin_id] = EligibilityAndAdditions(
|
|
@@ -430,9 +425,9 @@ class MempoolManager:
|
|
|
430
425
|
spend_additions=spend_additions,
|
|
431
426
|
is_eligible_for_ff=is_eligible_for_ff,
|
|
432
427
|
)
|
|
433
|
-
removal_names_from_coin_spends:
|
|
434
|
-
fast_forward_coin_ids:
|
|
435
|
-
bundle_coin_spends:
|
|
428
|
+
removal_names_from_coin_spends: set[bytes32] = set()
|
|
429
|
+
fast_forward_coin_ids: set[bytes32] = set()
|
|
430
|
+
bundle_coin_spends: dict[bytes32, BundleCoinSpend] = {}
|
|
436
431
|
for coin_spend in new_spend.coin_spends:
|
|
437
432
|
coin_id = coin_spend.coin.name()
|
|
438
433
|
removal_names_from_coin_spends.add(coin_id)
|
|
@@ -457,7 +452,7 @@ class MempoolManager:
|
|
|
457
452
|
# If you reach here it's probably because your program reveal doesn't match the coin's puzzle hash
|
|
458
453
|
return Err.INVALID_SPEND_BUNDLE, None, []
|
|
459
454
|
|
|
460
|
-
removal_record_dict:
|
|
455
|
+
removal_record_dict: dict[bytes32, CoinRecord] = {}
|
|
461
456
|
removal_amount: int = 0
|
|
462
457
|
removal_records = await get_coin_records(removal_names)
|
|
463
458
|
for record in removal_records:
|
|
@@ -485,7 +480,7 @@ class MempoolManager:
|
|
|
485
480
|
removal_record_dict[name] = removal_record
|
|
486
481
|
else:
|
|
487
482
|
removal_record = removal_record_dict[name]
|
|
488
|
-
removal_amount
|
|
483
|
+
removal_amount += removal_record.coin.amount
|
|
489
484
|
|
|
490
485
|
fees = uint64(removal_amount - addition_amount)
|
|
491
486
|
|
|
@@ -580,17 +575,17 @@ class MempoolManager:
|
|
|
580
575
|
log.log(
|
|
581
576
|
logging.DEBUG if duration < 2 else logging.WARNING,
|
|
582
577
|
f"add_spendbundle {spend_name} took {duration:0.2f} seconds. "
|
|
583
|
-
f"Cost: {cost} ({round(100.0 * cost/self.constants.MAX_BLOCK_COST_CLVM, 3)}% of max block cost)",
|
|
578
|
+
f"Cost: {cost} ({round(100.0 * cost / self.constants.MAX_BLOCK_COST_CLVM, 3)}% of max block cost)",
|
|
584
579
|
)
|
|
585
580
|
|
|
586
581
|
return None, potential, [item.name for item in conflicts]
|
|
587
582
|
|
|
588
583
|
def check_removals(
|
|
589
584
|
self,
|
|
590
|
-
non_eligible_coin_ids:
|
|
591
|
-
removals:
|
|
592
|
-
fast_forward_coin_ids:
|
|
593
|
-
) ->
|
|
585
|
+
non_eligible_coin_ids: list[bytes32],
|
|
586
|
+
removals: dict[bytes32, CoinRecord],
|
|
587
|
+
fast_forward_coin_ids: set[bytes32],
|
|
588
|
+
) -> tuple[Optional[Err], list[MempoolItem]]:
|
|
594
589
|
"""
|
|
595
590
|
This function checks for double spends, unknown spends and conflicting transactions in mempool.
|
|
596
591
|
Returns Error (if any), the set of existing MempoolItems with conflicting spends (if any).
|
|
@@ -636,7 +631,7 @@ class MempoolManager:
|
|
|
636
631
|
return item
|
|
637
632
|
|
|
638
633
|
async def new_peak(
|
|
639
|
-
self, new_peak: Optional[BlockRecordProtocol], spent_coins: Optional[
|
|
634
|
+
self, new_peak: Optional[BlockRecordProtocol], spent_coins: Optional[list[bytes32]]
|
|
640
635
|
) -> NewPeakInfo:
|
|
641
636
|
"""
|
|
642
637
|
Called when a new peak is available, we try to recreate a mempool for the new tip.
|
|
@@ -655,10 +650,10 @@ class MempoolManager:
|
|
|
655
650
|
return NewPeakInfo([], [])
|
|
656
651
|
assert new_peak.timestamp is not None
|
|
657
652
|
self.fee_estimator.new_block_height(new_peak.height)
|
|
658
|
-
included_items:
|
|
653
|
+
included_items: list[MempoolItemInfo] = []
|
|
659
654
|
|
|
660
655
|
expired = self.mempool.new_tx_block(new_peak.height, new_peak.timestamp)
|
|
661
|
-
mempool_item_removals:
|
|
656
|
+
mempool_item_removals: list[MempoolRemoveInfo] = [expired]
|
|
662
657
|
|
|
663
658
|
use_optimization: bool = self.peak is not None and new_peak.prev_transaction_block_hash == self.peak.header_hash
|
|
664
659
|
self.peak = new_peak
|
|
@@ -669,7 +664,7 @@ class MempoolManager:
|
|
|
669
664
|
# when looking up transactions by all coin IDs, we're likely to
|
|
670
665
|
# find the same transaction multiple times. We put them in a set
|
|
671
666
|
# to deduplicate
|
|
672
|
-
spendbundle_ids_to_remove:
|
|
667
|
+
spendbundle_ids_to_remove: set[bytes32] = set()
|
|
673
668
|
for spend in spent_coins:
|
|
674
669
|
items = self.mempool.get_items_by_coin_id(spend)
|
|
675
670
|
for item in items:
|
|
@@ -692,9 +687,9 @@ class MempoolManager:
|
|
|
692
687
|
|
|
693
688
|
# in order to make this a bit quicker, we look-up all the spends in
|
|
694
689
|
# a single query, rather than one at a time.
|
|
695
|
-
coin_records:
|
|
690
|
+
coin_records: dict[bytes32, CoinRecord] = {}
|
|
696
691
|
|
|
697
|
-
removals:
|
|
692
|
+
removals: set[bytes32] = set()
|
|
698
693
|
for item in old_pool.all_items():
|
|
699
694
|
for s in item.spend_bundle.coin_spends:
|
|
700
695
|
removals.add(s.coin.name())
|
|
@@ -703,8 +698,8 @@ class MempoolManager:
|
|
|
703
698
|
name = record.coin.name()
|
|
704
699
|
coin_records[name] = record
|
|
705
700
|
|
|
706
|
-
async def local_get_coin_records(names: Collection[bytes32]) ->
|
|
707
|
-
ret:
|
|
701
|
+
async def local_get_coin_records(names: Collection[bytes32]) -> list[CoinRecord]:
|
|
702
|
+
ret: list[CoinRecord] = []
|
|
708
703
|
for name in names:
|
|
709
704
|
r = coin_records.get(name)
|
|
710
705
|
if r is not None:
|
|
@@ -751,8 +746,8 @@ class MempoolManager:
|
|
|
751
746
|
self.mempool.fee_estimator.new_block(FeeBlockInfo(new_peak.height, included_items))
|
|
752
747
|
return NewPeakInfo(txs_added, mempool_item_removals)
|
|
753
748
|
|
|
754
|
-
def get_items_not_in_filter(self, mempool_filter: PyBIP158, limit: int = 100) ->
|
|
755
|
-
items:
|
|
749
|
+
def get_items_not_in_filter(self, mempool_filter: PyBIP158, limit: int = 100) -> list[SpendBundle]:
|
|
750
|
+
items: list[SpendBundle] = []
|
|
756
751
|
|
|
757
752
|
assert limit > 0
|
|
758
753
|
|
|
@@ -779,8 +774,8 @@ def optional_max(a: Optional[T], b: Optional[T]) -> Optional[T]:
|
|
|
779
774
|
|
|
780
775
|
|
|
781
776
|
def can_replace(
|
|
782
|
-
conflicting_items:
|
|
783
|
-
removal_names:
|
|
777
|
+
conflicting_items: list[MempoolItem],
|
|
778
|
+
removal_names: set[bytes32],
|
|
784
779
|
new_item: MempoolItem,
|
|
785
780
|
) -> bool:
|
|
786
781
|
"""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
6
|
from sortedcontainers import SortedDict
|
|
7
7
|
|
|
@@ -15,7 +15,7 @@ class ConflictTxCache:
|
|
|
15
15
|
_cache_max_total_cost: int
|
|
16
16
|
_cache_max_size: int = 1000
|
|
17
17
|
_cache_cost: int = field(default=0, init=False)
|
|
18
|
-
_txs:
|
|
18
|
+
_txs: dict[bytes32, MempoolItem] = field(default_factory=dict, init=False)
|
|
19
19
|
|
|
20
20
|
def get(self, bundle_name: bytes32) -> Optional[MempoolItem]:
|
|
21
21
|
return self._txs.get(bundle_name, None)
|
|
@@ -34,11 +34,11 @@ class ConflictTxCache:
|
|
|
34
34
|
self._cache_cost += item.cost
|
|
35
35
|
|
|
36
36
|
while self._cache_cost > self._cache_max_total_cost or len(self._txs) > self._cache_max_size:
|
|
37
|
-
first_in =
|
|
37
|
+
first_in = next(iter(self._txs.keys()))
|
|
38
38
|
self._cache_cost -= self._txs[first_in].cost
|
|
39
39
|
self._txs.pop(first_in)
|
|
40
40
|
|
|
41
|
-
def drain(self) ->
|
|
41
|
+
def drain(self) -> dict[bytes32, MempoolItem]:
|
|
42
42
|
ret = self._txs
|
|
43
43
|
self._txs = {}
|
|
44
44
|
self._cache_cost = 0
|
|
@@ -53,8 +53,8 @@ class PendingTxCache:
|
|
|
53
53
|
_cache_max_total_cost: int
|
|
54
54
|
_cache_max_size: int = 3000
|
|
55
55
|
_cache_cost: int = field(default=0, init=False)
|
|
56
|
-
_txs:
|
|
57
|
-
_by_height: SortedDict[uint32,
|
|
56
|
+
_txs: dict[bytes32, MempoolItem] = field(default_factory=dict, init=False)
|
|
57
|
+
_by_height: SortedDict[uint32, dict[bytes32, MempoolItem]] = field(default_factory=SortedDict, init=False)
|
|
58
58
|
|
|
59
59
|
def get(self, bundle_name: bytes32) -> Optional[MempoolItem]:
|
|
60
60
|
return self._txs.get(bundle_name, None)
|
|
@@ -82,15 +82,15 @@ class PendingTxCache:
|
|
|
82
82
|
self._txs.pop(to_evict[0])
|
|
83
83
|
continue
|
|
84
84
|
|
|
85
|
-
first_in =
|
|
85
|
+
first_in = next(iter(to_evict[1].keys()))
|
|
86
86
|
removed_item = self._txs.pop(first_in)
|
|
87
87
|
self._cache_cost -= removed_item.cost
|
|
88
88
|
to_evict[1].pop(first_in)
|
|
89
89
|
if to_evict[1] == {}:
|
|
90
90
|
self._by_height.popitem()
|
|
91
91
|
|
|
92
|
-
def drain(self, up_to_height: uint32) ->
|
|
93
|
-
ret:
|
|
92
|
+
def drain(self, up_to_height: uint32) -> dict[bytes32, MempoolItem]:
|
|
93
|
+
ret: dict[bytes32, MempoolItem] = {}
|
|
94
94
|
|
|
95
95
|
if self._txs == {}:
|
|
96
96
|
return ret
|
chia/full_node/subscriptions.py
CHANGED
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
|
-
from typing import Dict, List, Set
|
|
6
5
|
|
|
7
6
|
from chia_rs import Coin
|
|
8
7
|
|
|
@@ -15,8 +14,8 @@ log = logging.getLogger(__name__)
|
|
|
15
14
|
|
|
16
15
|
@dataclass(frozen=True)
|
|
17
16
|
class SubscriptionSet:
|
|
18
|
-
_subscriptions_for_peer:
|
|
19
|
-
_peers_for_subscription:
|
|
17
|
+
_subscriptions_for_peer: dict[bytes32, set[bytes32]] = field(default_factory=dict, init=False)
|
|
18
|
+
_peers_for_subscription: dict[bytes32, set[bytes32]] = field(default_factory=dict, init=False)
|
|
20
19
|
|
|
21
20
|
def add_subscription(self, peer_id: bytes32, item: bytes32) -> bool:
|
|
22
21
|
peers = self._peers_for_subscription.setdefault(item, set())
|
|
@@ -61,10 +60,10 @@ class SubscriptionSet:
|
|
|
61
60
|
if len(self._peers_for_subscription[item]) == 0:
|
|
62
61
|
self._peers_for_subscription.pop(item)
|
|
63
62
|
|
|
64
|
-
def subscriptions(self, peer_id: bytes32) ->
|
|
63
|
+
def subscriptions(self, peer_id: bytes32) -> set[bytes32]:
|
|
65
64
|
return self._subscriptions_for_peer.get(peer_id, set())
|
|
66
65
|
|
|
67
|
-
def peers(self, item: bytes32) ->
|
|
66
|
+
def peers(self, item: bytes32) -> set[bytes32]:
|
|
68
67
|
return self._peers_for_subscription.get(item, set())
|
|
69
68
|
|
|
70
69
|
def total_count(self) -> int:
|
|
@@ -87,15 +86,15 @@ class PeerSubscriptions:
|
|
|
87
86
|
coin_subscriptions = self._coin_subscriptions.count_subscriptions(peer_id)
|
|
88
87
|
return puzzle_subscriptions + coin_subscriptions
|
|
89
88
|
|
|
90
|
-
def add_puzzle_subscriptions(self, peer_id: bytes32, puzzle_hashes:
|
|
89
|
+
def add_puzzle_subscriptions(self, peer_id: bytes32, puzzle_hashes: list[bytes32], max_items: int) -> set[bytes32]:
|
|
91
90
|
"""
|
|
92
91
|
Adds subscriptions until max_items is reached. Filters out duplicates and returns all additions.
|
|
93
92
|
"""
|
|
94
93
|
|
|
95
94
|
subscription_count = self.peer_subscription_count(peer_id)
|
|
96
|
-
added:
|
|
95
|
+
added: set[bytes32] = set()
|
|
97
96
|
|
|
98
|
-
def limit_reached() ->
|
|
97
|
+
def limit_reached() -> set[bytes32]:
|
|
99
98
|
log.info(
|
|
100
99
|
"Peer %s attempted to exceed the subscription limit while adding puzzle subscriptions.",
|
|
101
100
|
peer_id,
|
|
@@ -121,15 +120,15 @@ class PeerSubscriptions:
|
|
|
121
120
|
|
|
122
121
|
return added
|
|
123
122
|
|
|
124
|
-
def add_coin_subscriptions(self, peer_id: bytes32, coin_ids:
|
|
123
|
+
def add_coin_subscriptions(self, peer_id: bytes32, coin_ids: list[bytes32], max_items: int) -> set[bytes32]:
|
|
125
124
|
"""
|
|
126
125
|
Adds subscriptions until max_items is reached. Filters out duplicates and returns all additions.
|
|
127
126
|
"""
|
|
128
127
|
|
|
129
128
|
subscription_count = self.peer_subscription_count(peer_id)
|
|
130
|
-
added:
|
|
129
|
+
added: set[bytes32] = set()
|
|
131
130
|
|
|
132
|
-
def limit_reached() ->
|
|
131
|
+
def limit_reached() -> set[bytes32]:
|
|
133
132
|
log.info(
|
|
134
133
|
"Peer %s attempted to exceed the subscription limit while adding coin subscriptions.",
|
|
135
134
|
peer_id,
|
|
@@ -155,12 +154,12 @@ class PeerSubscriptions:
|
|
|
155
154
|
|
|
156
155
|
return added
|
|
157
156
|
|
|
158
|
-
def remove_puzzle_subscriptions(self, peer_id: bytes32, puzzle_hashes:
|
|
157
|
+
def remove_puzzle_subscriptions(self, peer_id: bytes32, puzzle_hashes: list[bytes32]) -> set[bytes32]:
|
|
159
158
|
"""
|
|
160
159
|
Removes subscriptions. Filters out duplicates and returns all removals.
|
|
161
160
|
"""
|
|
162
161
|
|
|
163
|
-
removed:
|
|
162
|
+
removed: set[bytes32] = set()
|
|
164
163
|
|
|
165
164
|
for puzzle_hash in puzzle_hashes:
|
|
166
165
|
if not self._puzzle_subscriptions.remove_subscription(peer_id, puzzle_hash):
|
|
@@ -170,12 +169,12 @@ class PeerSubscriptions:
|
|
|
170
169
|
|
|
171
170
|
return removed
|
|
172
171
|
|
|
173
|
-
def remove_coin_subscriptions(self, peer_id: bytes32, coin_ids:
|
|
172
|
+
def remove_coin_subscriptions(self, peer_id: bytes32, coin_ids: list[bytes32]) -> set[bytes32]:
|
|
174
173
|
"""
|
|
175
174
|
Removes subscriptions. Filters out duplicates and returns all removals.
|
|
176
175
|
"""
|
|
177
176
|
|
|
178
|
-
removed:
|
|
177
|
+
removed: set[bytes32] = set()
|
|
179
178
|
|
|
180
179
|
for coin_id in coin_ids:
|
|
181
180
|
if not self._coin_subscriptions.remove_subscription(peer_id, coin_id):
|
|
@@ -195,16 +194,16 @@ class PeerSubscriptions:
|
|
|
195
194
|
self._puzzle_subscriptions.remove_peer(peer_id)
|
|
196
195
|
self._coin_subscriptions.remove_peer(peer_id)
|
|
197
196
|
|
|
198
|
-
def coin_subscriptions(self, peer_id: bytes32) ->
|
|
197
|
+
def coin_subscriptions(self, peer_id: bytes32) -> set[bytes32]:
|
|
199
198
|
return self._coin_subscriptions.subscriptions(peer_id)
|
|
200
199
|
|
|
201
|
-
def puzzle_subscriptions(self, peer_id: bytes32) ->
|
|
200
|
+
def puzzle_subscriptions(self, peer_id: bytes32) -> set[bytes32]:
|
|
202
201
|
return self._puzzle_subscriptions.subscriptions(peer_id)
|
|
203
202
|
|
|
204
|
-
def peers_for_coin_id(self, coin_id: bytes32) ->
|
|
203
|
+
def peers_for_coin_id(self, coin_id: bytes32) -> set[bytes32]:
|
|
205
204
|
return self._coin_subscriptions.peers(coin_id)
|
|
206
205
|
|
|
207
|
-
def peers_for_puzzle_hash(self, puzzle_hash: bytes32) ->
|
|
206
|
+
def peers_for_puzzle_hash(self, puzzle_hash: bytes32) -> set[bytes32]:
|
|
208
207
|
return self._puzzle_subscriptions.peers(puzzle_hash)
|
|
209
208
|
|
|
210
209
|
def coin_subscription_count(self) -> int:
|
|
@@ -215,16 +214,16 @@ class PeerSubscriptions:
|
|
|
215
214
|
|
|
216
215
|
|
|
217
216
|
def peers_for_spend_bundle(
|
|
218
|
-
peer_subscriptions: PeerSubscriptions, conds: SpendBundleConditions, hints_for_removals:
|
|
219
|
-
) ->
|
|
217
|
+
peer_subscriptions: PeerSubscriptions, conds: SpendBundleConditions, hints_for_removals: set[bytes32]
|
|
218
|
+
) -> set[bytes32]:
|
|
220
219
|
"""
|
|
221
220
|
Returns a list of peer ids that are subscribed to any of the created or
|
|
222
221
|
spent coins, puzzle hashes, or hints in the spend bundle. To avoid repeated
|
|
223
222
|
lookups, `hints_for_removals` should be a set of all puzzle hashes that are being removed.
|
|
224
223
|
"""
|
|
225
224
|
|
|
226
|
-
coin_ids:
|
|
227
|
-
puzzle_hashes:
|
|
225
|
+
coin_ids: set[bytes32] = set()
|
|
226
|
+
puzzle_hashes: set[bytes32] = hints_for_removals.copy()
|
|
228
227
|
|
|
229
228
|
for spend in conds.spends:
|
|
230
229
|
coin_ids.add(bytes32(spend.coin_id))
|
|
@@ -237,7 +236,7 @@ def peers_for_spend_bundle(
|
|
|
237
236
|
if memo is not None and len(memo) == 32:
|
|
238
237
|
puzzle_hashes.add(bytes32(memo))
|
|
239
238
|
|
|
240
|
-
peers:
|
|
239
|
+
peers: set[bytes32] = set()
|
|
241
240
|
|
|
242
241
|
for coin_id in coin_ids:
|
|
243
242
|
peers |= peer_subscriptions.peers_for_coin_id(coin_id)
|
chia/full_node/sync_store.py
CHANGED
|
@@ -3,9 +3,10 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import collections
|
|
5
5
|
import logging
|
|
6
|
+
from collections import OrderedDict
|
|
6
7
|
from collections import OrderedDict as orderedDict
|
|
7
8
|
from dataclasses import dataclass, field
|
|
8
|
-
from typing import
|
|
9
|
+
from typing import Optional
|
|
9
10
|
|
|
10
11
|
import typing_extensions
|
|
11
12
|
|
|
@@ -29,14 +30,14 @@ class SyncStore:
|
|
|
29
30
|
sync_mode: bool = False
|
|
30
31
|
long_sync: bool = False
|
|
31
32
|
# Header hash : peer node id
|
|
32
|
-
peak_to_peer: OrderedDict[bytes32,
|
|
33
|
+
peak_to_peer: OrderedDict[bytes32, set[bytes32]] = field(default_factory=orderedDict)
|
|
33
34
|
# peer node id : Peak
|
|
34
|
-
peer_to_peak:
|
|
35
|
+
peer_to_peak: dict[bytes32, Peak] = field(default_factory=dict)
|
|
35
36
|
# Peak we are syncing towards
|
|
36
37
|
target_peak: Optional[Peak] = None
|
|
37
38
|
peers_changed: asyncio.Event = field(default_factory=asyncio.Event)
|
|
38
39
|
# Set of nodes which we are batch syncing from
|
|
39
|
-
batch_syncing:
|
|
40
|
+
batch_syncing: set[bytes32] = field(default_factory=set)
|
|
40
41
|
# Set of nodes which we are backtrack syncing from, and how many threads
|
|
41
42
|
_backtrack_syncing: collections.defaultdict[bytes32, int] = field(
|
|
42
43
|
default_factory=lambda: collections.defaultdict(int),
|
|
@@ -79,19 +80,19 @@ class SyncStore:
|
|
|
79
80
|
if new_peak:
|
|
80
81
|
self.peer_to_peak[peer_id] = Peak(header_hash, height, weight)
|
|
81
82
|
|
|
82
|
-
def get_peers_that_have_peak(self, header_hashes:
|
|
83
|
+
def get_peers_that_have_peak(self, header_hashes: list[bytes32]) -> set[bytes32]:
|
|
83
84
|
"""
|
|
84
85
|
Returns: peer ids of peers that have at least one of the header hashes.
|
|
85
86
|
"""
|
|
86
87
|
|
|
87
|
-
node_ids:
|
|
88
|
+
node_ids: set[bytes32] = set()
|
|
88
89
|
for header_hash in header_hashes:
|
|
89
90
|
if header_hash in self.peak_to_peer:
|
|
90
91
|
for node_id in self.peak_to_peer[header_hash]:
|
|
91
92
|
node_ids.add(node_id)
|
|
92
93
|
return node_ids
|
|
93
94
|
|
|
94
|
-
def get_peak_of_each_peer(self) ->
|
|
95
|
+
def get_peak_of_each_peer(self) -> dict[bytes32, Peak]:
|
|
95
96
|
"""
|
|
96
97
|
Returns: dictionary of peer id to peak information.
|
|
97
98
|
"""
|
|
@@ -4,7 +4,7 @@ import asyncio
|
|
|
4
4
|
import logging
|
|
5
5
|
from dataclasses import dataclass
|
|
6
6
|
from queue import SimpleQueue
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Optional
|
|
8
8
|
|
|
9
9
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
10
10
|
from chia.types.transaction_queue_entry import TransactionQueueEntry
|
|
@@ -25,8 +25,8 @@ class TransactionQueue:
|
|
|
25
25
|
|
|
26
26
|
_list_cursor: int # this is which index
|
|
27
27
|
_queue_length: asyncio.Semaphore
|
|
28
|
-
_index_to_peer_map:
|
|
29
|
-
_queue_dict:
|
|
28
|
+
_index_to_peer_map: list[bytes32]
|
|
29
|
+
_queue_dict: dict[bytes32, SimpleQueue[TransactionQueueEntry]]
|
|
30
30
|
_high_priority_queue: SimpleQueue[TransactionQueueEntry]
|
|
31
31
|
peer_size_limit: int
|
|
32
32
|
log: logging.Logger
|
|
File without changes
|