chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__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/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +59 -30
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +225 -62
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +963 -839
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +8 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +14 -14
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +372 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- 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/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +16 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +42 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +34 -13
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +3 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +22 -8
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +120 -105
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/harvester/harvester_api.py
CHANGED
|
@@ -5,7 +5,7 @@ import logging
|
|
|
5
5
|
import time
|
|
6
6
|
from collections.abc import Awaitable, Sequence
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import TYPE_CHECKING, ClassVar
|
|
8
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
9
9
|
|
|
10
10
|
from chia_rs import AugSchemeMPL, G1Element, G2Element, ProofOfSpace
|
|
11
11
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -16,7 +16,7 @@ from chia.consensus.pot_iterations import (
|
|
|
16
16
|
calculate_sp_interval_iters,
|
|
17
17
|
)
|
|
18
18
|
from chia.harvester.harvester import Harvester
|
|
19
|
-
from chia.plotting.prover import PlotVersion
|
|
19
|
+
from chia.plotting.prover import PlotVersion, V1Prover, V2Prover, V2Quality
|
|
20
20
|
from chia.plotting.util import PlotInfo, parse_plot_info
|
|
21
21
|
from chia.protocols import harvester_protocol
|
|
22
22
|
from chia.protocols.farmer_protocol import FarmingInfo
|
|
@@ -28,20 +28,22 @@ from chia.server.ws_connection import WSChiaConnection
|
|
|
28
28
|
from chia.types.blockchain_format.proof_of_space import (
|
|
29
29
|
calculate_pos_challenge,
|
|
30
30
|
calculate_prefix_bits,
|
|
31
|
-
calculate_required_plot_strength,
|
|
32
31
|
generate_plot_public_key,
|
|
32
|
+
is_v1_phased_out,
|
|
33
33
|
make_pos,
|
|
34
34
|
passes_plot_filter,
|
|
35
|
-
|
|
35
|
+
v1_cut_off_height,
|
|
36
36
|
)
|
|
37
37
|
from chia.wallet.derive_keys import master_sk_to_local_sk
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
class HarvesterAPI:
|
|
41
41
|
if TYPE_CHECKING:
|
|
42
|
-
from chia.
|
|
42
|
+
from chia.apis.harvester_stub import HarvesterApiStub
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
# Verify this class implements the HarvesterApiStub protocol
|
|
45
|
+
def _protocol_check(self: HarvesterAPI) -> HarvesterApiStub:
|
|
46
|
+
return self
|
|
45
47
|
|
|
46
48
|
log: logging.Logger
|
|
47
49
|
harvester: Harvester
|
|
@@ -58,7 +60,7 @@ class HarvesterAPI:
|
|
|
58
60
|
filter_prefix_bits = calculate_prefix_bits(
|
|
59
61
|
self.harvester.constants,
|
|
60
62
|
challenge.peak_height,
|
|
61
|
-
plot_info.prover.
|
|
63
|
+
plot_info.prover.get_param(),
|
|
62
64
|
)
|
|
63
65
|
return passes_plot_filter(
|
|
64
66
|
filter_prefix_bits,
|
|
@@ -89,7 +91,7 @@ class HarvesterAPI:
|
|
|
89
91
|
return proofs_found
|
|
90
92
|
|
|
91
93
|
async def _handle_v2_responses(
|
|
92
|
-
self, v2_awaitables: Sequence[Awaitable[
|
|
94
|
+
self, v2_awaitables: Sequence[Awaitable[PartialProofsData | None]], start_time: float, peer: WSChiaConnection
|
|
93
95
|
) -> int:
|
|
94
96
|
partial_proofs_found = 0
|
|
95
97
|
for quality_awaitable in asyncio.as_completed(v2_awaitables):
|
|
@@ -153,13 +155,9 @@ class HarvesterAPI:
|
|
|
153
155
|
start = time.monotonic()
|
|
154
156
|
assert len(new_challenge.challenge_hash) == 32
|
|
155
157
|
|
|
156
|
-
required_plot_strength = calculate_required_plot_strength(
|
|
157
|
-
self.harvester.constants, new_challenge.last_tx_height
|
|
158
|
-
)
|
|
159
|
-
|
|
160
158
|
loop = asyncio.get_running_loop()
|
|
161
159
|
|
|
162
|
-
def blocking_lookup_v2_partial_proofs(filename: Path, plot_info: PlotInfo) ->
|
|
160
|
+
def blocking_lookup_v2_partial_proofs(filename: Path, plot_info: PlotInfo) -> PartialProofsData | None:
|
|
163
161
|
# Uses the V2 Prover object to lookup qualities only. No full proofs generated.
|
|
164
162
|
try:
|
|
165
163
|
plot_id = plot_info.prover.get_id()
|
|
@@ -168,12 +166,12 @@ class HarvesterAPI:
|
|
|
168
166
|
new_challenge.challenge_hash,
|
|
169
167
|
new_challenge.sp_hash,
|
|
170
168
|
)
|
|
171
|
-
|
|
172
|
-
sp_challenge_hash,
|
|
169
|
+
qualities = plot_info.prover.get_qualities_for_challenge(
|
|
170
|
+
sp_challenge_hash, self.harvester.constants.QUALITY_PROOF_SCAN_FILTER
|
|
173
171
|
)
|
|
174
172
|
|
|
175
173
|
# If no partial proofs are found, return None
|
|
176
|
-
if len(
|
|
174
|
+
if len(qualities) == 0:
|
|
177
175
|
return None
|
|
178
176
|
|
|
179
177
|
# Get the appropriate difficulty for this plot
|
|
@@ -191,33 +189,36 @@ class HarvesterAPI:
|
|
|
191
189
|
good_partial_proofs = []
|
|
192
190
|
sp_interval_iters = calculate_sp_interval_iters(self.harvester.constants, sub_slot_iters)
|
|
193
191
|
|
|
194
|
-
for
|
|
195
|
-
quality_str = quality_for_partial_proof(partial_proof, new_challenge.challenge_hash)
|
|
192
|
+
for quality in qualities:
|
|
196
193
|
required_iters: uint64 = calculate_iterations_quality(
|
|
197
194
|
self.harvester.constants,
|
|
198
|
-
|
|
199
|
-
plot_info.prover.
|
|
195
|
+
quality.get_string(),
|
|
196
|
+
plot_info.prover.get_param(),
|
|
200
197
|
difficulty,
|
|
201
198
|
new_challenge.sp_hash,
|
|
202
|
-
sub_slot_iters,
|
|
203
|
-
new_challenge.last_tx_height,
|
|
204
199
|
)
|
|
205
200
|
|
|
206
|
-
if required_iters
|
|
207
|
-
|
|
201
|
+
if required_iters >= sp_interval_iters:
|
|
202
|
+
continue
|
|
203
|
+
|
|
204
|
+
assert isinstance(plot_info.prover, V2Prover)
|
|
205
|
+
assert isinstance(quality, V2Quality)
|
|
206
|
+
|
|
207
|
+
partial_proof = plot_info.prover.get_partial_proof(quality)
|
|
208
|
+
good_partial_proofs.append(partial_proof)
|
|
208
209
|
|
|
209
210
|
if len(good_partial_proofs) == 0:
|
|
210
211
|
return None
|
|
211
212
|
|
|
212
|
-
size = plot_info.prover.get_size().size_v2
|
|
213
|
-
assert size is not None
|
|
214
213
|
return PartialProofsData(
|
|
215
214
|
new_challenge.challenge_hash,
|
|
216
215
|
new_challenge.sp_hash,
|
|
217
|
-
|
|
216
|
+
str(filename.resolve()),
|
|
218
217
|
good_partial_proofs,
|
|
219
218
|
new_challenge.signage_point_index,
|
|
220
|
-
|
|
219
|
+
self.harvester.constants.PLOT_SIZE_V2,
|
|
220
|
+
plot_info.prover.get_strength(),
|
|
221
|
+
plot_id,
|
|
221
222
|
plot_info.pool_public_key,
|
|
222
223
|
plot_info.pool_contract_puzzle_hash,
|
|
223
224
|
plot_info.plot_public_key,
|
|
@@ -238,7 +239,9 @@ class HarvesterAPI:
|
|
|
238
239
|
new_challenge.sp_hash,
|
|
239
240
|
)
|
|
240
241
|
try:
|
|
241
|
-
|
|
242
|
+
qualities = plot_info.prover.get_qualities_for_challenge(
|
|
243
|
+
sp_challenge_hash, self.harvester.constants.QUALITY_PROOF_SCAN_FILTER
|
|
244
|
+
)
|
|
242
245
|
except RuntimeError as e:
|
|
243
246
|
if str(e) == "Timeout waiting for context queue.":
|
|
244
247
|
self.harvester.log.warning(
|
|
@@ -264,7 +267,7 @@ class HarvesterAPI:
|
|
|
264
267
|
return []
|
|
265
268
|
|
|
266
269
|
responses: list[tuple[bytes32, ProofOfSpace]] = []
|
|
267
|
-
if
|
|
270
|
+
if len(qualities) > 0:
|
|
268
271
|
difficulty = new_challenge.difficulty
|
|
269
272
|
sub_slot_iters = new_challenge.sub_slot_iters
|
|
270
273
|
if plot_info.pool_contract_puzzle_hash is not None:
|
|
@@ -277,24 +280,34 @@ class HarvesterAPI:
|
|
|
277
280
|
sub_slot_iters = pool_difficulty.sub_slot_iters
|
|
278
281
|
|
|
279
282
|
# Found proofs of space (on average 1 is expected per plot)
|
|
280
|
-
for index,
|
|
283
|
+
for index, quality in enumerate(qualities):
|
|
281
284
|
required_iters: uint64 = calculate_iterations_quality(
|
|
282
285
|
self.harvester.constants,
|
|
283
|
-
|
|
284
|
-
plot_info.prover.
|
|
286
|
+
quality.get_string(),
|
|
287
|
+
plot_info.prover.get_param(),
|
|
285
288
|
difficulty,
|
|
286
289
|
new_challenge.sp_hash,
|
|
287
|
-
sub_slot_iters,
|
|
288
|
-
new_challenge.last_tx_height,
|
|
289
290
|
)
|
|
290
291
|
sp_interval_iters = calculate_sp_interval_iters(self.harvester.constants, sub_slot_iters)
|
|
291
292
|
if required_iters < sp_interval_iters:
|
|
292
293
|
# Found a very good proof of space! will fetch the whole proof from disk,
|
|
293
294
|
# then send to farmer
|
|
294
295
|
try:
|
|
296
|
+
assert isinstance(plot_info.prover, V1Prover)
|
|
295
297
|
proof_xs = plot_info.prover.get_full_proof(
|
|
296
298
|
sp_challenge_hash, index, self.harvester.parallel_read
|
|
297
299
|
)
|
|
300
|
+
|
|
301
|
+
if is_v1_phased_out(proof_xs, new_challenge.last_tx_height, self.harvester.constants):
|
|
302
|
+
self.harvester.log.info(
|
|
303
|
+
f"Proof dropped due to hard fork phase-out of v1 plots: {filename}"
|
|
304
|
+
)
|
|
305
|
+
self.harvester.log.info(
|
|
306
|
+
f"File: {filename} Plot ID: {plot_id.hex()}, challenge: {sp_challenge_hash}, "
|
|
307
|
+
f"plot_info: {plot_info}"
|
|
308
|
+
)
|
|
309
|
+
continue
|
|
310
|
+
|
|
298
311
|
except RuntimeError as e:
|
|
299
312
|
if str(e) == "GRResult_NoProof received":
|
|
300
313
|
self.harvester.log.info(
|
|
@@ -327,6 +340,7 @@ class HarvesterAPI:
|
|
|
327
340
|
)
|
|
328
341
|
continue
|
|
329
342
|
|
|
343
|
+
quality_str = bytes32(quality.get_string())
|
|
330
344
|
responses.append(
|
|
331
345
|
(
|
|
332
346
|
quality_str,
|
|
@@ -335,7 +349,7 @@ class HarvesterAPI:
|
|
|
335
349
|
plot_info.pool_public_key,
|
|
336
350
|
plot_info.pool_contract_puzzle_hash,
|
|
337
351
|
plot_info.plot_public_key,
|
|
338
|
-
plot_info.prover.
|
|
352
|
+
plot_info.prover.get_param(),
|
|
339
353
|
proof_xs,
|
|
340
354
|
),
|
|
341
355
|
)
|
|
@@ -383,6 +397,11 @@ class HarvesterAPI:
|
|
|
383
397
|
if not self._plot_passes_filter(try_plot_info, new_challenge):
|
|
384
398
|
continue
|
|
385
399
|
if try_plot_info.prover.get_version() == PlotVersion.V2:
|
|
400
|
+
# before hard fork activation, we can't farm v2 plots
|
|
401
|
+
constants = self.harvester.constants
|
|
402
|
+
if new_challenge.last_tx_height < constants.HARD_FORK2_HEIGHT:
|
|
403
|
+
continue
|
|
404
|
+
|
|
386
405
|
v2_awaitables.append(
|
|
387
406
|
loop.run_in_executor(
|
|
388
407
|
self.harvester.executor,
|
|
@@ -393,12 +412,15 @@ class HarvesterAPI:
|
|
|
393
412
|
)
|
|
394
413
|
passed += 1
|
|
395
414
|
else:
|
|
415
|
+
# after the phase-out, ignore v1 plots
|
|
416
|
+
if new_challenge.last_tx_height >= v1_cut_off_height(self.harvester.constants):
|
|
417
|
+
continue
|
|
418
|
+
|
|
396
419
|
passed += 1
|
|
397
420
|
awaitables.append(lookup_challenge(try_plot_filename, try_plot_info))
|
|
398
421
|
self.harvester.log.debug(f"new_signage_point_harvester {passed} plots passed the plot filter")
|
|
399
422
|
|
|
400
423
|
# Concurrently executes all lookups on disk, to take advantage of multiple disk parallelism
|
|
401
|
-
time_taken = time.monotonic() - start
|
|
402
424
|
total_proofs_found = 0
|
|
403
425
|
total_v2_partial_proofs_found = 0
|
|
404
426
|
|
|
@@ -419,6 +441,7 @@ class HarvesterAPI:
|
|
|
419
441
|
else:
|
|
420
442
|
total_v2_partial_proofs_found = results[0]
|
|
421
443
|
|
|
444
|
+
time_taken = time.monotonic() - start
|
|
422
445
|
now = uint64(time.time())
|
|
423
446
|
|
|
424
447
|
farming_info = FarmingInfo(
|
|
@@ -452,7 +475,7 @@ class HarvesterAPI:
|
|
|
452
475
|
)
|
|
453
476
|
|
|
454
477
|
@metadata.request(reply_types=[ProtocolMessageTypes.respond_signatures])
|
|
455
|
-
async def request_signatures(self, request: harvester_protocol.RequestSignatures) ->
|
|
478
|
+
async def request_signatures(self, request: harvester_protocol.RequestSignatures) -> Message | None:
|
|
456
479
|
"""
|
|
457
480
|
The farmer requests a signature on the header hash, for one of the proofs that we found.
|
|
458
481
|
A signature is created on the header hash using the harvester private key. This can also
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
3
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
4
4
|
|
|
5
5
|
from chia_rs.sized_ints import uint32
|
|
6
6
|
|
|
@@ -31,7 +31,7 @@ class HarvesterRpcApi:
|
|
|
31
31
|
"/update_harvester_config": self.update_harvester_config,
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
async def _state_changed(self, change: str, change_data:
|
|
34
|
+
async def _state_changed(self, change: str, change_data: dict[str, Any] | None = None) -> list[WsRpcMessage]:
|
|
35
35
|
if change_data is None:
|
|
36
36
|
change_data = {}
|
|
37
37
|
|
|
@@ -102,14 +102,14 @@ class HarvesterRpcApi:
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
async def update_harvester_config(self, request: dict[str, Any]) -> EndpointResult:
|
|
105
|
-
use_gpu_harvesting:
|
|
106
|
-
gpu_index:
|
|
107
|
-
enforce_gpu_index:
|
|
108
|
-
disable_cpu_affinity:
|
|
109
|
-
parallel_decompressor_count:
|
|
110
|
-
decompressor_thread_count:
|
|
111
|
-
recursive_plot_scan:
|
|
112
|
-
refresh_parameter_interval_seconds:
|
|
105
|
+
use_gpu_harvesting: bool | None = None
|
|
106
|
+
gpu_index: int | None = None
|
|
107
|
+
enforce_gpu_index: bool | None = None
|
|
108
|
+
disable_cpu_affinity: bool | None = None
|
|
109
|
+
parallel_decompressor_count: int | None = None
|
|
110
|
+
decompressor_thread_count: int | None = None
|
|
111
|
+
recursive_plot_scan: bool | None = None
|
|
112
|
+
refresh_parameter_interval_seconds: uint32 | None = None
|
|
113
113
|
if "use_gpu_harvesting" in request:
|
|
114
114
|
use_gpu_harvesting = bool(request["use_gpu_harvesting"])
|
|
115
115
|
if "gpu_index" in request:
|
|
@@ -3,11 +3,11 @@ from __future__ import annotations
|
|
|
3
3
|
import os
|
|
4
4
|
import pathlib
|
|
5
5
|
import sys
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
from chia_rs import ConsensusConstants
|
|
9
9
|
|
|
10
|
-
from chia.apis import
|
|
10
|
+
from chia.apis import StubMetadataRegistry
|
|
11
11
|
from chia.consensus.constants import replace_str_to_bytes
|
|
12
12
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS, update_testnet_overrides
|
|
13
13
|
from chia.harvester.harvester import Harvester
|
|
@@ -48,7 +48,7 @@ def create_harvester_service(
|
|
|
48
48
|
peer_api = HarvesterAPI(node)
|
|
49
49
|
network_id = service_config["selected_network"]
|
|
50
50
|
|
|
51
|
-
rpc_info:
|
|
51
|
+
rpc_info: RpcInfo[HarvesterRpcApi] | None = None
|
|
52
52
|
if service_config.get("start_rpc_server", True):
|
|
53
53
|
rpc_info = (HarvesterRpcApi, service_config["rpc_port"])
|
|
54
54
|
|
|
@@ -64,7 +64,7 @@ def create_harvester_service(
|
|
|
64
64
|
network_id=network_id,
|
|
65
65
|
rpc_info=rpc_info,
|
|
66
66
|
connect_to_daemon=connect_to_daemon,
|
|
67
|
-
|
|
67
|
+
stub_metadata_for_type=StubMetadataRegistry,
|
|
68
68
|
)
|
|
69
69
|
|
|
70
70
|
|
chia/introducer/introducer.py
CHANGED
|
@@ -6,7 +6,7 @@ import logging
|
|
|
6
6
|
import random
|
|
7
7
|
import time
|
|
8
8
|
from collections.abc import AsyncIterator
|
|
9
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
9
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
10
10
|
|
|
11
11
|
import dns.asyncresolver
|
|
12
12
|
from chia_rs.sized_ints import uint16, uint64
|
|
@@ -42,7 +42,7 @@ class Introducer:
|
|
|
42
42
|
self.dns_servers = dns_servers
|
|
43
43
|
self.resolver = dns.asyncresolver.Resolver()
|
|
44
44
|
self._shut_down = False
|
|
45
|
-
self._server:
|
|
45
|
+
self._server: ChiaServer | None = None
|
|
46
46
|
self.log = logging.getLogger(__name__)
|
|
47
47
|
|
|
48
48
|
@contextlib.asynccontextmanager
|
|
@@ -62,7 +62,7 @@ class Introducer:
|
|
|
62
62
|
# TODO: fill this out?
|
|
63
63
|
pass
|
|
64
64
|
|
|
65
|
-
def get_connections(self, request_node_type:
|
|
65
|
+
def get_connections(self, request_node_type: NodeType | None) -> list[dict[str, Any]]:
|
|
66
66
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
67
67
|
|
|
68
68
|
def set_server(self, server: ChiaServer):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
5
5
|
|
|
6
6
|
from chia_rs.sized_ints import uint64
|
|
7
7
|
|
|
@@ -17,9 +17,11 @@ from chia.types.peer_info import TimestampedPeerInfo
|
|
|
17
17
|
|
|
18
18
|
class IntroducerAPI:
|
|
19
19
|
if TYPE_CHECKING:
|
|
20
|
-
from chia.
|
|
20
|
+
from chia.apis.introducer_stub import IntroducerApiStub
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
# Verify this class implements the IntroducerApiStub protocol
|
|
23
|
+
def _protocol_check(self: IntroducerAPI) -> IntroducerApiStub:
|
|
24
|
+
return self
|
|
23
25
|
|
|
24
26
|
log: logging.Logger
|
|
25
27
|
introducer: Introducer
|
|
@@ -40,7 +42,7 @@ class IntroducerAPI:
|
|
|
40
42
|
self,
|
|
41
43
|
request: RequestPeersIntroducer,
|
|
42
44
|
peer: WSChiaConnection,
|
|
43
|
-
) ->
|
|
45
|
+
) -> Message | None:
|
|
44
46
|
max_peers = self.introducer.max_peers_to_send
|
|
45
47
|
if self.introducer.server is None or self.introducer.server.introducer_peers is None:
|
|
46
48
|
return None
|
|
@@ -3,9 +3,9 @@ from __future__ import annotations
|
|
|
3
3
|
import os
|
|
4
4
|
import pathlib
|
|
5
5
|
import sys
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
|
-
from chia.apis import
|
|
8
|
+
from chia.apis import StubMetadataRegistry
|
|
9
9
|
from chia.introducer.introducer import Introducer
|
|
10
10
|
from chia.introducer.introducer_api import IntroducerAPI
|
|
11
11
|
from chia.introducer.introducer_service import IntroducerService
|
|
@@ -26,7 +26,7 @@ SERVICE_NAME = "introducer"
|
|
|
26
26
|
def create_introducer_service(
|
|
27
27
|
root_path: pathlib.Path,
|
|
28
28
|
config: dict[str, Any],
|
|
29
|
-
advertised_port:
|
|
29
|
+
advertised_port: int | None = None,
|
|
30
30
|
connect_to_daemon: bool = True,
|
|
31
31
|
) -> IntroducerService:
|
|
32
32
|
service_config = config[SERVICE_NAME]
|
|
@@ -60,7 +60,7 @@ def create_introducer_service(
|
|
|
60
60
|
service_name=SERVICE_NAME,
|
|
61
61
|
network_id=network_id,
|
|
62
62
|
connect_to_daemon=connect_to_daemon,
|
|
63
|
-
|
|
63
|
+
stub_metadata_for_type=StubMetadataRegistry,
|
|
64
64
|
)
|
|
65
65
|
|
|
66
66
|
|
chia/legacy/keyring.py
CHANGED
|
@@ -6,7 +6,8 @@ helper it's required to install the `legacy_keyring` extra dependency which can
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
8
|
import sys
|
|
9
|
-
from
|
|
9
|
+
from collections.abc import Callable
|
|
10
|
+
from typing import TypeAlias, cast
|
|
10
11
|
|
|
11
12
|
import click
|
|
12
13
|
from chia_rs import G1Element
|
|
@@ -21,11 +22,10 @@ except ImportError:
|
|
|
21
22
|
sys.exit("Use `install.sh -l` to install the legacy_keyring dependency.")
|
|
22
23
|
CryptFileKeyring = None
|
|
23
24
|
|
|
24
|
-
|
|
25
25
|
from chia.util.errors import KeychainUserNotFound
|
|
26
26
|
from chia.util.keychain import MAX_KEYS, KeyData, KeyDataSecrets, get_private_key_user
|
|
27
27
|
|
|
28
|
-
LegacyKeyring =
|
|
28
|
+
LegacyKeyring: TypeAlias = MacKeyring | WinKeyring | CryptFileKeyring
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
CURRENT_KEY_VERSION = "1.8"
|
chia/plot_sync/delta.py
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import Union
|
|
5
4
|
|
|
6
5
|
from chia.protocols.harvester_protocol import Plot
|
|
7
6
|
|
|
8
7
|
|
|
9
8
|
@dataclass
|
|
10
9
|
class DeltaType:
|
|
11
|
-
additions:
|
|
10
|
+
additions: dict[str, Plot] | list[str]
|
|
12
11
|
removals: list[str]
|
|
13
12
|
|
|
14
13
|
def __str__(self) -> str:
|
chia/plot_sync/receiver.py
CHANGED
|
@@ -2,11 +2,11 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import time
|
|
5
|
-
from collections.abc import Awaitable, Collection, Sequence
|
|
5
|
+
from collections.abc import Awaitable, Callable, Collection, Sequence
|
|
6
6
|
from dataclasses import dataclass, field
|
|
7
|
-
from typing import Any
|
|
7
|
+
from typing import Any
|
|
8
8
|
|
|
9
|
-
from chia_rs import
|
|
9
|
+
from chia_rs import ConsensusConstants
|
|
10
10
|
from chia_rs.sized_bytes import bytes32
|
|
11
11
|
from chia_rs.sized_ints import int16, uint32, uint64
|
|
12
12
|
from typing_extensions import Protocol
|
|
@@ -40,7 +40,7 @@ from chia.server.ws_connection import WSChiaConnection
|
|
|
40
40
|
log = logging.getLogger(__name__)
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
def get_list_or_len(list_in: Sequence[object], length: bool) ->
|
|
43
|
+
def get_list_or_len(list_in: Sequence[object], length: bool) -> int | Sequence[object]:
|
|
44
44
|
return len(list_in) if length else list_in
|
|
45
45
|
|
|
46
46
|
|
|
@@ -52,7 +52,7 @@ class Sync:
|
|
|
52
52
|
plots_processed: uint32 = uint32(0)
|
|
53
53
|
plots_total: uint32 = uint32(0)
|
|
54
54
|
delta: Delta = field(default_factory=Delta)
|
|
55
|
-
time_done:
|
|
55
|
+
time_done: float | None = None
|
|
56
56
|
|
|
57
57
|
def in_progress(self) -> bool:
|
|
58
58
|
return self.sync_id != 0
|
|
@@ -76,7 +76,7 @@ class Sync:
|
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
class ReceiverUpdateCallback(Protocol):
|
|
79
|
-
def __call__(self, peer_id: bytes32, delta:
|
|
79
|
+
def __call__(self, peer_id: bytes32, delta: Delta | None) -> Awaitable[None]:
|
|
80
80
|
pass
|
|
81
81
|
|
|
82
82
|
|
|
@@ -91,12 +91,14 @@ class Receiver:
|
|
|
91
91
|
_total_plot_size: int
|
|
92
92
|
_total_effective_plot_size: int
|
|
93
93
|
_update_callback: ReceiverUpdateCallback
|
|
94
|
-
_harvesting_mode:
|
|
94
|
+
_harvesting_mode: HarvestingMode | None
|
|
95
|
+
_constants: ConsensusConstants
|
|
95
96
|
|
|
96
97
|
def __init__(
|
|
97
98
|
self,
|
|
98
99
|
connection: WSChiaConnection,
|
|
99
100
|
update_callback: ReceiverUpdateCallback,
|
|
101
|
+
constants: ConsensusConstants,
|
|
100
102
|
) -> None:
|
|
101
103
|
self._connection = connection
|
|
102
104
|
self._current_sync = Sync()
|
|
@@ -109,12 +111,13 @@ class Receiver:
|
|
|
109
111
|
self._total_effective_plot_size = 0
|
|
110
112
|
self._update_callback = update_callback
|
|
111
113
|
self._harvesting_mode = None
|
|
114
|
+
self._constants = constants
|
|
112
115
|
|
|
113
|
-
async def trigger_callback(self, update:
|
|
116
|
+
async def trigger_callback(self, update: Delta | None = None) -> None:
|
|
114
117
|
try:
|
|
115
118
|
await self._update_callback(self._connection.peer_node_id, update)
|
|
116
|
-
except Exception
|
|
117
|
-
log.
|
|
119
|
+
except Exception:
|
|
120
|
+
log.exception(f"_update_callback: node_id {self.connection().peer_node_id}")
|
|
118
121
|
|
|
119
122
|
def reset(self) -> None:
|
|
120
123
|
log.info(f"reset: node_id {self.connection().peer_node_id}, current_sync: {self._current_sync}")
|
|
@@ -158,7 +161,7 @@ class Receiver:
|
|
|
158
161
|
def total_effective_plot_size(self) -> int:
|
|
159
162
|
return self._total_effective_plot_size
|
|
160
163
|
|
|
161
|
-
def harvesting_mode(self) ->
|
|
164
|
+
def harvesting_mode(self) -> HarvestingMode | None:
|
|
162
165
|
return self._harvesting_mode
|
|
163
166
|
|
|
164
167
|
async def _process(
|
|
@@ -168,7 +171,7 @@ class Receiver:
|
|
|
168
171
|
f"_process: node_id {self.connection().peer_node_id}, message_type: {message_type}, message: {message}"
|
|
169
172
|
)
|
|
170
173
|
|
|
171
|
-
async def send_response(plot_sync_error:
|
|
174
|
+
async def send_response(plot_sync_error: PlotSyncError | None = None) -> None:
|
|
172
175
|
if self._connection is not None:
|
|
173
176
|
await self._connection.send_message(
|
|
174
177
|
make_msg(
|
|
@@ -181,13 +184,13 @@ class Receiver:
|
|
|
181
184
|
await method(message)
|
|
182
185
|
await send_response()
|
|
183
186
|
except InvalidIdentifierError as e:
|
|
184
|
-
log.
|
|
187
|
+
log.exception(f"_process: node_id {self.connection().peer_node_id}")
|
|
185
188
|
await send_response(PlotSyncError(int16(e.error_code), f"{e}", e.expected_identifier))
|
|
186
189
|
except PlotSyncException as e:
|
|
187
|
-
log.
|
|
190
|
+
log.exception(f"_process: node_id {self.connection().peer_node_id}")
|
|
188
191
|
await send_response(PlotSyncError(int16(e.error_code), f"{e}", None))
|
|
189
192
|
except Exception as e:
|
|
190
|
-
log.
|
|
193
|
+
log.exception(f"_process: node_id {self.connection().peer_node_id}")
|
|
191
194
|
await send_response(PlotSyncError(int16(ErrorCodes.unknown), f"{e}", None))
|
|
192
195
|
|
|
193
196
|
def _validate_identifier(self, identifier: PlotSyncIdentifier, start: bool = False) -> None:
|
|
@@ -349,10 +352,10 @@ class Receiver:
|
|
|
349
352
|
self._keys_missing = self._current_sync.delta.keys_missing.additions.copy()
|
|
350
353
|
self._duplicates = self._current_sync.delta.duplicates.additions.copy()
|
|
351
354
|
self._total_plot_size = sum(plot.file_size for plot in self._plots.values())
|
|
355
|
+
|
|
352
356
|
self._total_effective_plot_size = int(
|
|
353
|
-
# TODO: todo_v2_plots support v2 plots
|
|
354
357
|
sum(
|
|
355
|
-
UI_ACTUAL_SPACE_CONSTANT_FACTOR *
|
|
358
|
+
UI_ACTUAL_SPACE_CONSTANT_FACTOR * _expected_plot_size(plot.param(), self._constants)
|
|
356
359
|
for plot in self._plots.values()
|
|
357
360
|
)
|
|
358
361
|
)
|
chia/plot_sync/sender.py
CHANGED
|
@@ -7,9 +7,9 @@ import traceback
|
|
|
7
7
|
from collections.abc import Iterable
|
|
8
8
|
from dataclasses import dataclass
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Any, Generic,
|
|
10
|
+
from typing import Any, Generic, TypeVar
|
|
11
11
|
|
|
12
|
-
from chia_rs.sized_ints import int16, uint32, uint64
|
|
12
|
+
from chia_rs.sized_ints import int16, uint8, uint32, uint64
|
|
13
13
|
from typing_extensions import Protocol
|
|
14
14
|
|
|
15
15
|
from chia.plot_sync.exceptions import AlreadyStartedError, InvalidConnectionTypeError
|
|
@@ -37,13 +37,18 @@ log = logging.getLogger(__name__)
|
|
|
37
37
|
def _convert_plot_info_list(plot_infos: list[PlotInfo]) -> list[Plot]:
|
|
38
38
|
converted: list[Plot] = []
|
|
39
39
|
for plot_info in plot_infos:
|
|
40
|
-
|
|
41
|
-
k
|
|
42
|
-
|
|
40
|
+
param = plot_info.prover.get_param()
|
|
41
|
+
k: uint8
|
|
42
|
+
if param.size_v1 is not None:
|
|
43
|
+
k = param.size_v1
|
|
44
|
+
else:
|
|
45
|
+
assert param.strength_v2 is not None
|
|
46
|
+
k = uint8(0x80 | param.strength_v2)
|
|
47
|
+
|
|
43
48
|
converted.append(
|
|
44
49
|
Plot(
|
|
45
50
|
filename=plot_info.prover.get_filename(),
|
|
46
|
-
size=k,
|
|
51
|
+
size=uint8(k),
|
|
47
52
|
plot_id=plot_info.prover.get_id(),
|
|
48
53
|
pool_public_key=plot_info.pool_public_key,
|
|
49
54
|
pool_contract_puzzle_hash=plot_info.pool_contract_puzzle_hash,
|
|
@@ -84,7 +89,7 @@ class MessageGenerator(Generic[T]):
|
|
|
84
89
|
class ExpectedResponse:
|
|
85
90
|
message_type: ProtocolMessageTypes
|
|
86
91
|
identifier: PlotSyncIdentifier
|
|
87
|
-
message:
|
|
92
|
+
message: PlotSyncResponse | None = None
|
|
88
93
|
|
|
89
94
|
def __str__(self) -> str:
|
|
90
95
|
return (
|
|
@@ -95,14 +100,14 @@ class ExpectedResponse:
|
|
|
95
100
|
|
|
96
101
|
class Sender:
|
|
97
102
|
_plot_manager: PlotManager
|
|
98
|
-
_connection:
|
|
103
|
+
_connection: WSChiaConnection | None
|
|
99
104
|
_sync_id: uint64
|
|
100
105
|
_next_message_id: uint64
|
|
101
106
|
_messages: list[MessageGenerator[PayloadType]]
|
|
102
107
|
_last_sync_id: uint64
|
|
103
108
|
_stop_requested = False
|
|
104
|
-
_task:
|
|
105
|
-
_response:
|
|
109
|
+
_task: asyncio.Task[None] | None
|
|
110
|
+
_response: ExpectedResponse | None
|
|
106
111
|
_harvesting_mode: HarvestingMode
|
|
107
112
|
|
|
108
113
|
def __init__(self, plot_manager: PlotManager, harvesting_mode: HarvestingMode) -> None:
|