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/full_node/weight_proof.py
CHANGED
|
@@ -8,7 +8,7 @@ import random
|
|
|
8
8
|
import tempfile
|
|
9
9
|
from concurrent.futures.process import ProcessPoolExecutor
|
|
10
10
|
from multiprocessing.context import BaseContext
|
|
11
|
-
from typing import IO,
|
|
11
|
+
from typing import IO, Optional
|
|
12
12
|
|
|
13
13
|
from chia.consensus.block_header_validation import validate_finished_header_block
|
|
14
14
|
from chia.consensus.block_record import BlockRecord
|
|
@@ -31,6 +31,7 @@ from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
|
31
31
|
from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
|
|
32
32
|
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
33
33
|
from chia.types.header_block import HeaderBlock
|
|
34
|
+
from chia.types.validation_state import ValidationState
|
|
34
35
|
from chia.types.weight_proof import (
|
|
35
36
|
RecentChainData,
|
|
36
37
|
SubEpochChallengeSegment,
|
|
@@ -44,6 +45,7 @@ from chia.util.block_cache import BlockCache
|
|
|
44
45
|
from chia.util.hash import std_hash
|
|
45
46
|
from chia.util.ints import uint8, uint32, uint64, uint128
|
|
46
47
|
from chia.util.setproctitle import getproctitle, setproctitle
|
|
48
|
+
from chia.util.task_referencer import create_referenced_task
|
|
47
49
|
|
|
48
50
|
log = logging.getLogger(__name__)
|
|
49
51
|
|
|
@@ -92,8 +94,8 @@ class WeightProofHandler:
|
|
|
92
94
|
self.tip = tip
|
|
93
95
|
return wp
|
|
94
96
|
|
|
95
|
-
def get_sub_epoch_data(self, tip_height: uint32, summary_heights:
|
|
96
|
-
sub_epoch_data:
|
|
97
|
+
def get_sub_epoch_data(self, tip_height: uint32, summary_heights: list[uint32]) -> list[SubEpochData]:
|
|
98
|
+
sub_epoch_data: list[SubEpochData] = []
|
|
97
99
|
for sub_epoch_n, ses_height in enumerate(summary_heights):
|
|
98
100
|
if ses_height > tip_height:
|
|
99
101
|
break
|
|
@@ -107,7 +109,7 @@ class WeightProofHandler:
|
|
|
107
109
|
Creates a weight proof object
|
|
108
110
|
"""
|
|
109
111
|
assert self.blockchain is not None
|
|
110
|
-
sub_epoch_segments:
|
|
112
|
+
sub_epoch_segments: list[SubEpochChallengeSegment] = []
|
|
111
113
|
tip_rec = self.blockchain.try_block_record(tip)
|
|
112
114
|
if tip_rec is None:
|
|
113
115
|
log.error("failed not tip in cache")
|
|
@@ -164,7 +166,7 @@ class WeightProofHandler:
|
|
|
164
166
|
log.debug(f"sub_epochs: {len(sub_epoch_data)}")
|
|
165
167
|
return WeightProof(sub_epoch_data, sub_epoch_segments, recent_chain)
|
|
166
168
|
|
|
167
|
-
def get_seed_for_proof(self, summary_heights:
|
|
169
|
+
def get_seed_for_proof(self, summary_heights: list[uint32], tip_height: uint32) -> bytes32:
|
|
168
170
|
count = 0
|
|
169
171
|
ses = None
|
|
170
172
|
for sub_epoch_n, ses_height in enumerate(reversed(summary_heights)):
|
|
@@ -177,8 +179,8 @@ class WeightProofHandler:
|
|
|
177
179
|
seed = ses.get_hash()
|
|
178
180
|
return seed
|
|
179
181
|
|
|
180
|
-
async def _get_recent_chain(self, tip_height: uint32) -> Optional[
|
|
181
|
-
recent_chain:
|
|
182
|
+
async def _get_recent_chain(self, tip_height: uint32) -> Optional[list[HeaderBlock]]:
|
|
183
|
+
recent_chain: list[HeaderBlock] = []
|
|
182
184
|
ses_heights = self.blockchain.get_ses_heights()
|
|
183
185
|
min_height = 0
|
|
184
186
|
count_ses = 0
|
|
@@ -288,8 +290,8 @@ class WeightProofHandler:
|
|
|
288
290
|
|
|
289
291
|
async def __create_sub_epoch_segments(
|
|
290
292
|
self, ses_block: BlockRecord, se_start: BlockRecord, sub_epoch_n: uint32
|
|
291
|
-
) -> Optional[
|
|
292
|
-
segments:
|
|
293
|
+
) -> Optional[list[SubEpochChallengeSegment]]:
|
|
294
|
+
segments: list[SubEpochChallengeSegment] = []
|
|
293
295
|
start_height = await self.get_prev_two_slots_height(se_start)
|
|
294
296
|
|
|
295
297
|
blocks = await self.blockchain.get_block_records_in_range(
|
|
@@ -345,12 +347,12 @@ class WeightProofHandler:
|
|
|
345
347
|
self,
|
|
346
348
|
header_block: HeaderBlock,
|
|
347
349
|
sub_epoch_n: uint32,
|
|
348
|
-
header_blocks:
|
|
349
|
-
blocks:
|
|
350
|
+
header_blocks: dict[bytes32, HeaderBlock],
|
|
351
|
+
blocks: dict[bytes32, BlockRecord],
|
|
350
352
|
first_segment_in_sub_epoch: bool,
|
|
351
|
-
) ->
|
|
353
|
+
) -> tuple[Optional[SubEpochChallengeSegment], uint32]:
|
|
352
354
|
assert self.blockchain is not None
|
|
353
|
-
sub_slots:
|
|
355
|
+
sub_slots: list[SubSlotData] = []
|
|
354
356
|
log.debug(f"create challenge segment block {header_block.header_hash} block height {header_block.height} ")
|
|
355
357
|
# VDFs from sub slots before challenge block
|
|
356
358
|
first_sub_slots, first_rc_end_of_slot_vdf = await self.__first_sub_slot_vdfs(
|
|
@@ -392,10 +394,10 @@ class WeightProofHandler:
|
|
|
392
394
|
async def __first_sub_slot_vdfs(
|
|
393
395
|
self,
|
|
394
396
|
header_block: HeaderBlock,
|
|
395
|
-
header_blocks:
|
|
396
|
-
blocks:
|
|
397
|
+
header_blocks: dict[bytes32, HeaderBlock],
|
|
398
|
+
blocks: dict[bytes32, BlockRecord],
|
|
397
399
|
first_in_sub_epoch: bool,
|
|
398
|
-
) ->
|
|
400
|
+
) -> tuple[Optional[list[SubSlotData]], Optional[VDFInfo]]:
|
|
399
401
|
# combine cc vdfs of all reward blocks from the start of the sub slot to end
|
|
400
402
|
header_block_sub_rec = blocks[header_block.header_hash]
|
|
401
403
|
# find slot start
|
|
@@ -418,8 +420,8 @@ class WeightProofHandler:
|
|
|
418
420
|
curr_sub_rec = blocks[curr_sub_rec.prev_hash]
|
|
419
421
|
|
|
420
422
|
curr = header_blocks[curr_sub_rec.header_hash]
|
|
421
|
-
sub_slots_data:
|
|
422
|
-
tmp_sub_slots_data:
|
|
423
|
+
sub_slots_data: list[SubSlotData] = []
|
|
424
|
+
tmp_sub_slots_data: list[SubSlotData] = []
|
|
423
425
|
while curr.height < header_block.height:
|
|
424
426
|
if curr is None:
|
|
425
427
|
log.error("failed fetching block")
|
|
@@ -469,8 +471,8 @@ class WeightProofHandler:
|
|
|
469
471
|
def first_rc_end_of_slot_vdf(
|
|
470
472
|
self,
|
|
471
473
|
header_block: HeaderBlock,
|
|
472
|
-
blocks:
|
|
473
|
-
header_blocks:
|
|
474
|
+
blocks: dict[bytes32, BlockRecord],
|
|
475
|
+
header_blocks: dict[bytes32, HeaderBlock],
|
|
474
476
|
) -> Optional[VDFInfo]:
|
|
475
477
|
curr = blocks[header_block.header_hash]
|
|
476
478
|
while curr.height > 0 and not curr.sub_epoch_summary_included:
|
|
@@ -478,16 +480,16 @@ class WeightProofHandler:
|
|
|
478
480
|
return header_blocks[curr.header_hash].finished_sub_slots[-1].reward_chain.end_of_slot_vdf
|
|
479
481
|
|
|
480
482
|
async def __slot_end_vdf(
|
|
481
|
-
self, start_height: uint32, header_blocks:
|
|
482
|
-
) ->
|
|
483
|
+
self, start_height: uint32, header_blocks: dict[bytes32, HeaderBlock], blocks: dict[bytes32, BlockRecord]
|
|
484
|
+
) -> tuple[Optional[list[SubSlotData]], uint32]:
|
|
483
485
|
# gets all vdfs first sub slot after challenge block to last sub slot
|
|
484
486
|
log.debug(f"slot end vdf start height {start_height}")
|
|
485
487
|
header_hash = self.blockchain.height_to_hash(start_height)
|
|
486
488
|
assert header_hash is not None
|
|
487
489
|
curr = header_blocks[header_hash]
|
|
488
490
|
curr_header_hash = curr.header_hash
|
|
489
|
-
sub_slots_data:
|
|
490
|
-
tmp_sub_slots_data:
|
|
491
|
+
sub_slots_data: list[SubSlotData] = []
|
|
492
|
+
tmp_sub_slots_data: list[SubSlotData] = []
|
|
491
493
|
while not blocks[curr_header_hash].is_challenge_block(self.constants):
|
|
492
494
|
if curr.first_in_sub_slot:
|
|
493
495
|
sub_slots_data.extend(tmp_sub_slots_data)
|
|
@@ -512,7 +514,7 @@ class WeightProofHandler:
|
|
|
512
514
|
log.debug(f"slot end vdf end height {curr.height} slots {len(sub_slots_data)} ")
|
|
513
515
|
return sub_slots_data, curr.height
|
|
514
516
|
|
|
515
|
-
def handle_block_vdfs(self, curr: HeaderBlock, blocks:
|
|
517
|
+
def handle_block_vdfs(self, curr: HeaderBlock, blocks: dict[bytes32, BlockRecord]) -> SubSlotData:
|
|
516
518
|
cc_sp_proof = None
|
|
517
519
|
icc_ip_proof = None
|
|
518
520
|
cc_sp_info = None
|
|
@@ -558,7 +560,7 @@ class WeightProofHandler:
|
|
|
558
560
|
curr.total_iters,
|
|
559
561
|
)
|
|
560
562
|
|
|
561
|
-
def validate_weight_proof_single_proc(self, weight_proof: WeightProof) ->
|
|
563
|
+
def validate_weight_proof_single_proc(self, weight_proof: WeightProof) -> tuple[bool, uint32]:
|
|
562
564
|
assert self.blockchain is not None
|
|
563
565
|
assert len(weight_proof.sub_epochs) > 0
|
|
564
566
|
if len(weight_proof.sub_epochs) == 0:
|
|
@@ -588,7 +590,7 @@ class WeightProofHandler:
|
|
|
588
590
|
fork_point, _ = self.get_fork_point(summaries)
|
|
589
591
|
return True, fork_point
|
|
590
592
|
|
|
591
|
-
async def validate_weight_proof(self, weight_proof: WeightProof) ->
|
|
593
|
+
async def validate_weight_proof(self, weight_proof: WeightProof) -> tuple[bool, uint32, list[SubEpochSummary]]:
|
|
592
594
|
assert self.blockchain is not None
|
|
593
595
|
if len(weight_proof.sub_epochs) == 0:
|
|
594
596
|
return False, uint32(0), []
|
|
@@ -613,7 +615,7 @@ class WeightProofHandler:
|
|
|
613
615
|
# The shutdown file manager must be inside of the executor manager so that
|
|
614
616
|
# we request the workers close prior to waiting for them to close.
|
|
615
617
|
with _create_shutdown_file() as shutdown_file:
|
|
616
|
-
task =
|
|
618
|
+
task = create_referenced_task(
|
|
617
619
|
validate_weight_proof_inner(
|
|
618
620
|
self.constants,
|
|
619
621
|
executor,
|
|
@@ -629,7 +631,7 @@ class WeightProofHandler:
|
|
|
629
631
|
valid, _ = await task
|
|
630
632
|
return valid, fork_point, summaries
|
|
631
633
|
|
|
632
|
-
def get_fork_point(self, received_summaries:
|
|
634
|
+
def get_fork_point(self, received_summaries: list[SubEpochSummary]) -> tuple[uint32, int]:
|
|
633
635
|
# returns the fork height and ses index
|
|
634
636
|
# iterate through sub epoch summaries to find fork point
|
|
635
637
|
fork_point_index = 0
|
|
@@ -653,8 +655,8 @@ class WeightProofHandler:
|
|
|
653
655
|
|
|
654
656
|
|
|
655
657
|
def _get_weights_for_sampling(
|
|
656
|
-
rng: random.Random, total_weight: uint128, recent_chain:
|
|
657
|
-
) -> Optional[
|
|
658
|
+
rng: random.Random, total_weight: uint128, recent_chain: list[HeaderBlock]
|
|
659
|
+
) -> Optional[list[uint128]]:
|
|
658
660
|
weight_to_check = []
|
|
659
661
|
last_l_weight = recent_chain[-1].reward_chain_block.weight - recent_chain[0].reward_chain_block.weight
|
|
660
662
|
delta = last_l_weight / total_weight
|
|
@@ -675,10 +677,10 @@ def _get_weights_for_sampling(
|
|
|
675
677
|
def _sample_sub_epoch(
|
|
676
678
|
start_of_epoch_weight: uint128,
|
|
677
679
|
end_of_epoch_weight: uint128,
|
|
678
|
-
weight_to_check: Optional[
|
|
680
|
+
weight_to_check: Optional[list[uint128]],
|
|
679
681
|
) -> bool:
|
|
680
682
|
"""
|
|
681
|
-
weight_to_check:
|
|
683
|
+
weight_to_check: list[uint128] is expected to be sorted
|
|
682
684
|
"""
|
|
683
685
|
if weight_to_check is None:
|
|
684
686
|
return True
|
|
@@ -717,7 +719,7 @@ async def _challenge_block_vdfs(
|
|
|
717
719
|
constants: ConsensusConstants,
|
|
718
720
|
header_block: HeaderBlock,
|
|
719
721
|
block_rec: BlockRecord,
|
|
720
|
-
sub_blocks:
|
|
722
|
+
sub_blocks: dict[bytes32, BlockRecord],
|
|
721
723
|
) -> SubSlotData:
|
|
722
724
|
(_, _, _, _, cc_vdf_iters, _) = get_signage_point_vdf_info(
|
|
723
725
|
constants,
|
|
@@ -828,7 +830,7 @@ def handle_end_of_slot(
|
|
|
828
830
|
def _validate_sub_epoch_summaries(
|
|
829
831
|
constants: ConsensusConstants,
|
|
830
832
|
weight_proof: WeightProof,
|
|
831
|
-
) ->
|
|
833
|
+
) -> tuple[Optional[list[SubEpochSummary]], Optional[list[uint128]]]:
|
|
832
834
|
last_ses_hash, last_ses_sub_height = _get_last_ses_hash(constants, weight_proof.recent_chain_data)
|
|
833
835
|
if last_ses_hash is None:
|
|
834
836
|
log.warning("could not find last ses block")
|
|
@@ -861,12 +863,12 @@ def _validate_sub_epoch_summaries(
|
|
|
861
863
|
def _map_sub_epoch_summaries(
|
|
862
864
|
sub_blocks_for_se: uint32,
|
|
863
865
|
ses_hash: bytes32,
|
|
864
|
-
sub_epoch_data:
|
|
866
|
+
sub_epoch_data: list[SubEpochData],
|
|
865
867
|
curr_difficulty: uint64,
|
|
866
|
-
) ->
|
|
868
|
+
) -> tuple[list[SubEpochSummary], uint128, list[uint128]]:
|
|
867
869
|
total_weight: uint128 = uint128(0)
|
|
868
|
-
summaries:
|
|
869
|
-
sub_epoch_weight_list:
|
|
870
|
+
summaries: list[SubEpochSummary] = []
|
|
871
|
+
sub_epoch_weight_list: list[uint128] = []
|
|
870
872
|
for idx, data in enumerate(sub_epoch_data):
|
|
871
873
|
ses = SubEpochSummary(
|
|
872
874
|
ses_hash,
|
|
@@ -879,8 +881,8 @@ def _map_sub_epoch_summaries(
|
|
|
879
881
|
if idx < len(sub_epoch_data) - 1:
|
|
880
882
|
delta = 0
|
|
881
883
|
if idx > 0:
|
|
882
|
-
delta =
|
|
883
|
-
log.debug(f"sub epoch {idx} start weight is {total_weight+curr_difficulty} ")
|
|
884
|
+
delta = data.num_blocks_overflow
|
|
885
|
+
log.debug(f"sub epoch {idx} start weight is {total_weight + curr_difficulty} ")
|
|
884
886
|
sub_epoch_weight_list.append(uint128(total_weight + curr_difficulty))
|
|
885
887
|
total_weight = uint128(
|
|
886
888
|
total_weight
|
|
@@ -902,7 +904,7 @@ def _map_sub_epoch_summaries(
|
|
|
902
904
|
def _validate_summaries_weight(
|
|
903
905
|
constants: ConsensusConstants,
|
|
904
906
|
sub_epoch_data_weight: uint128,
|
|
905
|
-
summaries:
|
|
907
|
+
summaries: list[SubEpochSummary],
|
|
906
908
|
weight_proof: WeightProof,
|
|
907
909
|
) -> bool:
|
|
908
910
|
num_over = summaries[-1].num_blocks_overflow
|
|
@@ -921,10 +923,10 @@ def _validate_sub_epoch_segments(
|
|
|
921
923
|
constants: ConsensusConstants,
|
|
922
924
|
rng: random.Random,
|
|
923
925
|
weight_proof_bytes: bytes,
|
|
924
|
-
summaries_bytes:
|
|
926
|
+
summaries_bytes: list[bytes],
|
|
925
927
|
height: uint32,
|
|
926
928
|
validate_from: int = 0,
|
|
927
|
-
) -> Optional[
|
|
929
|
+
) -> Optional[list[tuple[VDFProof, ClassgroupElement, VDFInfo]]]:
|
|
928
930
|
summaries = summaries_from_bytes(summaries_bytes)
|
|
929
931
|
sub_epoch_segments: SubEpochSegments = SubEpochSegments.from_bytes(weight_proof_bytes)
|
|
930
932
|
rc_sub_slot_hash = constants.GENESIS_CHALLENGE
|
|
@@ -987,7 +989,7 @@ def _validate_segment(
|
|
|
987
989
|
first_segment_in_se: bool,
|
|
988
990
|
sampled: bool,
|
|
989
991
|
height: uint32,
|
|
990
|
-
) ->
|
|
992
|
+
) -> tuple[bool, int, int, int, list[tuple[VDFProof, ClassgroupElement, VDFInfo]]]:
|
|
991
993
|
ip_iters, slot_iters, slots = 0, 0, 0
|
|
992
994
|
after_challenge = False
|
|
993
995
|
to_validate = []
|
|
@@ -1000,9 +1002,7 @@ def _validate_segment(
|
|
|
1000
1002
|
if required_iters is None:
|
|
1001
1003
|
return False, uint64(0), uint64(0), uint64(0), []
|
|
1002
1004
|
assert sub_slot_data.signage_point_index is not None
|
|
1003
|
-
ip_iters
|
|
1004
|
-
constants, curr_ssi, sub_slot_data.signage_point_index, required_iters
|
|
1005
|
-
)
|
|
1005
|
+
ip_iters += calculate_ip_iters(constants, curr_ssi, sub_slot_data.signage_point_index, required_iters)
|
|
1006
1006
|
vdf_list = _get_challenge_block_vdfs(constants, idx, segment.sub_slots, curr_ssi)
|
|
1007
1007
|
to_validate.extend(vdf_list)
|
|
1008
1008
|
elif sampled and after_challenge:
|
|
@@ -1011,17 +1011,17 @@ def _validate_segment(
|
|
|
1011
1011
|
log.error(f"failed to validate sub slot data {idx} vdfs")
|
|
1012
1012
|
return False, uint64(0), uint64(0), uint64(0), []
|
|
1013
1013
|
to_validate.extend(vdf_list)
|
|
1014
|
-
slot_iters
|
|
1015
|
-
slots
|
|
1014
|
+
slot_iters += curr_ssi
|
|
1015
|
+
slots += uint64(1)
|
|
1016
1016
|
return True, ip_iters, slot_iters, slots, to_validate
|
|
1017
1017
|
|
|
1018
1018
|
|
|
1019
1019
|
def _get_challenge_block_vdfs(
|
|
1020
1020
|
constants: ConsensusConstants,
|
|
1021
1021
|
sub_slot_idx: int,
|
|
1022
|
-
sub_slots:
|
|
1022
|
+
sub_slots: list[SubSlotData],
|
|
1023
1023
|
ssi: uint64,
|
|
1024
|
-
) ->
|
|
1024
|
+
) -> list[tuple[VDFProof, ClassgroupElement, VDFInfo]]:
|
|
1025
1025
|
to_validate = []
|
|
1026
1026
|
sub_slot_data = sub_slots[sub_slot_idx]
|
|
1027
1027
|
if sub_slot_data.cc_signage_point is not None and sub_slot_data.cc_sp_vdf_info:
|
|
@@ -1058,9 +1058,9 @@ def _get_challenge_block_vdfs(
|
|
|
1058
1058
|
def _validate_sub_slot_data(
|
|
1059
1059
|
constants: ConsensusConstants,
|
|
1060
1060
|
sub_slot_idx: int,
|
|
1061
|
-
sub_slots:
|
|
1061
|
+
sub_slots: list[SubSlotData],
|
|
1062
1062
|
ssi: uint64,
|
|
1063
|
-
) ->
|
|
1063
|
+
) -> tuple[bool, list[tuple[VDFProof, ClassgroupElement, VDFInfo]]]:
|
|
1064
1064
|
sub_slot_data = sub_slots[sub_slot_idx]
|
|
1065
1065
|
assert sub_slot_idx > 0
|
|
1066
1066
|
prev_ssd = sub_slots[sub_slot_idx - 1]
|
|
@@ -1134,7 +1134,7 @@ def sub_slot_data_vdf_input(
|
|
|
1134
1134
|
constants: ConsensusConstants,
|
|
1135
1135
|
sub_slot_data: SubSlotData,
|
|
1136
1136
|
sub_slot_idx: int,
|
|
1137
|
-
sub_slots:
|
|
1137
|
+
sub_slots: list[SubSlotData],
|
|
1138
1138
|
is_overflow: bool,
|
|
1139
1139
|
new_sub_slot: bool,
|
|
1140
1140
|
ssi: uint64,
|
|
@@ -1198,9 +1198,9 @@ def sub_slot_data_vdf_input(
|
|
|
1198
1198
|
def validate_recent_blocks(
|
|
1199
1199
|
constants: ConsensusConstants,
|
|
1200
1200
|
recent_chain_bytes: bytes,
|
|
1201
|
-
summaries_bytes:
|
|
1201
|
+
summaries_bytes: list[bytes],
|
|
1202
1202
|
shutdown_file_path: Optional[pathlib.Path] = None,
|
|
1203
|
-
) ->
|
|
1203
|
+
) -> tuple[bool, list[bytes]]:
|
|
1204
1204
|
recent_chain: RecentChainData = RecentChainData.from_bytes(recent_chain_bytes)
|
|
1205
1205
|
summaries = summaries_from_bytes(summaries_bytes)
|
|
1206
1206
|
sub_blocks = BlockCache({})
|
|
@@ -1253,8 +1253,9 @@ def validate_recent_blocks(
|
|
|
1253
1253
|
adjusted = True
|
|
1254
1254
|
deficit = get_deficit(constants, deficit, prev_block_record, overflow, len(block.finished_sub_slots))
|
|
1255
1255
|
if sub_slots > 2 and transaction_blocks > 11 and (tip_height - block.height < last_blocks_to_validate):
|
|
1256
|
+
expected_vs = ValidationState(ssi, diff, None)
|
|
1256
1257
|
caluclated_required_iters, error = validate_finished_header_block(
|
|
1257
|
-
constants, sub_blocks, block, False,
|
|
1258
|
+
constants, sub_blocks, block, False, expected_vs, ses_blocks > 2
|
|
1258
1259
|
)
|
|
1259
1260
|
if error is not None:
|
|
1260
1261
|
log.error(f"block {block.header_hash} failed validation {error}")
|
|
@@ -1266,7 +1267,7 @@ def validate_recent_blocks(
|
|
|
1266
1267
|
if ret is None:
|
|
1267
1268
|
return False, []
|
|
1268
1269
|
required_iters = ret
|
|
1269
|
-
validated_block_count
|
|
1270
|
+
validated_block_count += 1
|
|
1270
1271
|
|
|
1271
1272
|
curr_block_ses = None if not ses else summaries[ses_idx - 1]
|
|
1272
1273
|
block_record = header_block_to_sub_block_record(
|
|
@@ -1384,7 +1385,7 @@ def __validate_pospace(
|
|
|
1384
1385
|
def __get_rc_sub_slot(
|
|
1385
1386
|
constants: ConsensusConstants,
|
|
1386
1387
|
segment: SubEpochChallengeSegment,
|
|
1387
|
-
summaries:
|
|
1388
|
+
summaries: list[SubEpochSummary],
|
|
1388
1389
|
curr_ssi: uint64,
|
|
1389
1390
|
) -> RewardChainSubSlot:
|
|
1390
1391
|
ses = summaries[uint32(segment.sub_epoch_n - 1)]
|
|
@@ -1465,7 +1466,7 @@ def __get_rc_sub_slot(
|
|
|
1465
1466
|
return rc_sub_slot
|
|
1466
1467
|
|
|
1467
1468
|
|
|
1468
|
-
def __get_cc_sub_slot(sub_slots:
|
|
1469
|
+
def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: Optional[SubEpochSummary]) -> ChallengeChainSubSlot:
|
|
1469
1470
|
sub_slot: Optional[SubSlotData] = None
|
|
1470
1471
|
for i in reversed(range(0, idx)):
|
|
1471
1472
|
sub_slot = sub_slots[i]
|
|
@@ -1491,8 +1492,8 @@ def __get_cc_sub_slot(sub_slots: List[SubSlotData], idx: int, ses: Optional[SubE
|
|
|
1491
1492
|
|
|
1492
1493
|
|
|
1493
1494
|
def _get_curr_diff_ssi(
|
|
1494
|
-
constants: ConsensusConstants, idx: int, summaries:
|
|
1495
|
-
) ->
|
|
1495
|
+
constants: ConsensusConstants, idx: int, summaries: list[SubEpochSummary]
|
|
1496
|
+
) -> tuple[uint64, uint64]:
|
|
1496
1497
|
curr_difficulty = constants.DIFFICULTY_STARTING
|
|
1497
1498
|
curr_ssi = constants.SUB_SLOT_ITERS_STARTING
|
|
1498
1499
|
for ses in reversed(summaries[0:idx]):
|
|
@@ -1505,7 +1506,7 @@ def _get_curr_diff_ssi(
|
|
|
1505
1506
|
return curr_difficulty, curr_ssi
|
|
1506
1507
|
|
|
1507
1508
|
|
|
1508
|
-
def vars_to_bytes(summaries:
|
|
1509
|
+
def vars_to_bytes(summaries: list[SubEpochSummary], weight_proof: WeightProof) -> tuple[list[bytes], bytes, bytes]:
|
|
1509
1510
|
wp_recent_chain_bytes = bytes(RecentChainData(weight_proof.recent_chain_data))
|
|
1510
1511
|
wp_segment_bytes = bytes(SubEpochSegments(weight_proof.sub_epoch_segments))
|
|
1511
1512
|
summary_bytes = []
|
|
@@ -1514,7 +1515,7 @@ def vars_to_bytes(summaries: List[SubEpochSummary], weight_proof: WeightProof) -
|
|
|
1514
1515
|
return summary_bytes, wp_segment_bytes, wp_recent_chain_bytes
|
|
1515
1516
|
|
|
1516
1517
|
|
|
1517
|
-
def summaries_from_bytes(summaries_bytes:
|
|
1518
|
+
def summaries_from_bytes(summaries_bytes: list[bytes]) -> list[SubEpochSummary]:
|
|
1518
1519
|
summaries = []
|
|
1519
1520
|
for summary in summaries_bytes:
|
|
1520
1521
|
summaries.append(SubEpochSummary.from_bytes(summary))
|
|
@@ -1522,8 +1523,8 @@ def summaries_from_bytes(summaries_bytes: List[bytes]) -> List[SubEpochSummary]:
|
|
|
1522
1523
|
|
|
1523
1524
|
|
|
1524
1525
|
def _get_last_ses_hash(
|
|
1525
|
-
constants: ConsensusConstants, recent_reward_chain:
|
|
1526
|
-
) ->
|
|
1526
|
+
constants: ConsensusConstants, recent_reward_chain: list[HeaderBlock]
|
|
1527
|
+
) -> tuple[Optional[bytes32], uint32]:
|
|
1527
1528
|
for idx, block in enumerate(reversed(recent_reward_chain)):
|
|
1528
1529
|
if (block.reward_chain_block.height % constants.SUB_EPOCH_BLOCKS) == 0:
|
|
1529
1530
|
idx = len(recent_reward_chain) - 1 - idx # reverse
|
|
@@ -1541,8 +1542,8 @@ def _get_last_ses_hash(
|
|
|
1541
1542
|
return None, uint32(0)
|
|
1542
1543
|
|
|
1543
1544
|
|
|
1544
|
-
def _get_ses_idx(recent_reward_chain:
|
|
1545
|
-
idxs:
|
|
1545
|
+
def _get_ses_idx(recent_reward_chain: list[HeaderBlock]) -> list[int]:
|
|
1546
|
+
idxs: list[int] = []
|
|
1546
1547
|
for idx, curr in enumerate(recent_reward_chain):
|
|
1547
1548
|
if len(curr.finished_sub_slots) > 0:
|
|
1548
1549
|
for slot in curr.finished_sub_slots:
|
|
@@ -1591,11 +1592,11 @@ def blue_boxed_end_of_slot(sub_slot: EndOfSubSlotBundle) -> bool:
|
|
|
1591
1592
|
|
|
1592
1593
|
|
|
1593
1594
|
def validate_sub_epoch_sampling(
|
|
1594
|
-
rng: random.Random, sub_epoch_weight_list:
|
|
1595
|
+
rng: random.Random, sub_epoch_weight_list: list[uint128], weight_proof: WeightProof
|
|
1595
1596
|
) -> bool:
|
|
1596
1597
|
tip = weight_proof.recent_chain_data[-1]
|
|
1597
1598
|
weight_to_check = _get_weights_for_sampling(rng, tip.weight, weight_proof.recent_chain_data)
|
|
1598
|
-
sampled_sub_epochs:
|
|
1599
|
+
sampled_sub_epochs: dict[int, bool] = {}
|
|
1599
1600
|
for idx in range(1, len(sub_epoch_weight_list)):
|
|
1600
1601
|
if _sample_sub_epoch(sub_epoch_weight_list[idx - 1], sub_epoch_weight_list[idx], weight_to_check):
|
|
1601
1602
|
sampled_sub_epochs[idx - 1] = True
|
|
@@ -1613,9 +1614,9 @@ def validate_sub_epoch_sampling(
|
|
|
1613
1614
|
|
|
1614
1615
|
|
|
1615
1616
|
def map_segments_by_sub_epoch(
|
|
1616
|
-
sub_epoch_segments:
|
|
1617
|
-
) ->
|
|
1618
|
-
segments:
|
|
1617
|
+
sub_epoch_segments: list[SubEpochChallengeSegment],
|
|
1618
|
+
) -> dict[int, list[SubEpochChallengeSegment]]:
|
|
1619
|
+
segments: dict[int, list[SubEpochChallengeSegment]] = {}
|
|
1619
1620
|
curr_sub_epoch_n = -1
|
|
1620
1621
|
for idx, segment in enumerate(sub_epoch_segments):
|
|
1621
1622
|
if curr_sub_epoch_n < segment.sub_epoch_n:
|
|
@@ -1627,7 +1628,7 @@ def map_segments_by_sub_epoch(
|
|
|
1627
1628
|
|
|
1628
1629
|
def _validate_vdf_batch(
|
|
1629
1630
|
constants: ConsensusConstants,
|
|
1630
|
-
vdf_list:
|
|
1631
|
+
vdf_list: list[tuple[bytes, bytes, bytes]],
|
|
1631
1632
|
shutdown_file_path: Optional[pathlib.Path] = None,
|
|
1632
1633
|
) -> bool:
|
|
1633
1634
|
for vdf_proof_bytes, class_group_bytes, info in vdf_list:
|
|
@@ -1650,11 +1651,11 @@ async def validate_weight_proof_inner(
|
|
|
1650
1651
|
shutdown_file_name: str,
|
|
1651
1652
|
num_processes: int,
|
|
1652
1653
|
weight_proof: WeightProof,
|
|
1653
|
-
summaries:
|
|
1654
|
-
sub_epoch_weight_list:
|
|
1654
|
+
summaries: list[SubEpochSummary],
|
|
1655
|
+
sub_epoch_weight_list: list[uint128],
|
|
1655
1656
|
skip_segment_validation: bool,
|
|
1656
1657
|
validate_from: int,
|
|
1657
|
-
) ->
|
|
1658
|
+
) -> tuple[bool, list[BlockRecord]]:
|
|
1658
1659
|
assert len(weight_proof.sub_epochs) > 0
|
|
1659
1660
|
if len(weight_proof.sub_epochs) == 0:
|
|
1660
1661
|
return False, []
|
chia/harvester/harvester.py
CHANGED
|
@@ -5,9 +5,10 @@ import concurrent
|
|
|
5
5
|
import contextlib
|
|
6
6
|
import dataclasses
|
|
7
7
|
import logging
|
|
8
|
+
from collections.abc import AsyncIterator
|
|
8
9
|
from concurrent.futures.thread import ThreadPoolExecutor
|
|
9
10
|
from pathlib import Path
|
|
10
|
-
from typing import TYPE_CHECKING, Any,
|
|
11
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
11
12
|
|
|
12
13
|
from typing_extensions import Literal
|
|
13
14
|
|
|
@@ -71,7 +72,7 @@ class Harvester:
|
|
|
71
72
|
|
|
72
73
|
return self._server
|
|
73
74
|
|
|
74
|
-
def __init__(self, root_path: Path, config:
|
|
75
|
+
def __init__(self, root_path: Path, config: dict[str, Any], constants: ConsensusConstants):
|
|
75
76
|
self.log = log
|
|
76
77
|
self.root_path = root_path
|
|
77
78
|
# TODO, remove checks below later after some versions / time
|
|
@@ -145,7 +146,7 @@ class Harvester:
|
|
|
145
146
|
|
|
146
147
|
await self.plot_sync_sender.await_closed()
|
|
147
148
|
|
|
148
|
-
def get_connections(self, request_node_type: Optional[NodeType]) ->
|
|
149
|
+
def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
149
150
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
150
151
|
|
|
151
152
|
async def on_connect(self, connection: WSChiaConnection) -> None:
|
|
@@ -154,7 +155,7 @@ class Harvester:
|
|
|
154
155
|
def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
|
|
155
156
|
self.state_changed_callback = callback
|
|
156
157
|
|
|
157
|
-
def state_changed(self, change: str, change_data: Optional[
|
|
158
|
+
def state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> None:
|
|
158
159
|
if self.state_changed_callback is not None:
|
|
159
160
|
self.state_changed_callback(change, change_data)
|
|
160
161
|
|
|
@@ -181,9 +182,9 @@ class Harvester:
|
|
|
181
182
|
asyncio.run_coroutine_threadsafe(self.plot_sync_sender.await_closed(), asyncio.get_running_loop())
|
|
182
183
|
self.plot_manager.stop_refreshing()
|
|
183
184
|
|
|
184
|
-
def get_plots(self) ->
|
|
185
|
+
def get_plots(self) -> tuple[list[dict[str, Any]], list[str], list[str]]:
|
|
185
186
|
self.log.debug(f"get_plots prover items: {self.plot_manager.plot_count()}")
|
|
186
|
-
response_plots:
|
|
187
|
+
response_plots: list[dict[str, Any]] = []
|
|
187
188
|
with self.plot_manager:
|
|
188
189
|
for path, plot_info in self.plot_manager.plots.items():
|
|
189
190
|
prover = plot_info.prover
|
|
@@ -222,7 +223,7 @@ class Harvester:
|
|
|
222
223
|
self.plot_manager.trigger_refresh()
|
|
223
224
|
return True
|
|
224
225
|
|
|
225
|
-
async def get_plot_directories(self) ->
|
|
226
|
+
async def get_plot_directories(self) -> list[str]:
|
|
226
227
|
return get_plot_directories(self.root_path)
|
|
227
228
|
|
|
228
229
|
async def remove_plot_directory(self, str_path: str) -> bool:
|
|
@@ -230,7 +231,7 @@ class Harvester:
|
|
|
230
231
|
self.plot_manager.trigger_refresh()
|
|
231
232
|
return True
|
|
232
233
|
|
|
233
|
-
async def get_harvester_config(self) ->
|
|
234
|
+
async def get_harvester_config(self) -> dict[str, Any]:
|
|
234
235
|
return get_harvester_config(self.root_path)
|
|
235
236
|
|
|
236
237
|
async def update_harvester_config(
|