chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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_blockchain_transactions.py +5 -2
- 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 +66 -31
- 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 +273 -70
- chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
- 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 +198 -30
- chia/_tests/core/mempool/test_mempool.py +54 -50
- 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 +988 -854
- 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 +9 -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 +63 -60
- 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 +17 -17
- 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 +16 -15
- 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 +374 -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 +19 -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 +50 -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 +239 -223
- chia/full_node/full_node_api.py +197 -152
- chia/full_node/full_node_rpc_api.py +34 -32
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hard_fork_utils.py +44 -0
- 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 +120 -36
- 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 +4 -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 +24 -10
- 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 +142 -106
- 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.6.0rc2.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
- 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.6.0rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
chia/farmer/farmer.py
CHANGED
|
@@ -11,7 +11,7 @@ from collections.abc import AsyncIterator
|
|
|
11
11
|
from dataclasses import dataclass
|
|
12
12
|
from math import floor
|
|
13
13
|
from pathlib import Path
|
|
14
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
14
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
15
15
|
|
|
16
16
|
import aiohttp
|
|
17
17
|
from chia_rs import AugSchemeMPL, ConsensusConstants, G1Element, G2Element, PrivateKey, ProofOfSpace
|
|
@@ -70,7 +70,7 @@ UPDATE_POOL_FARMER_INFO_INTERVAL: int = 300
|
|
|
70
70
|
@dataclass(frozen=True)
|
|
71
71
|
class GetPoolInfoResult:
|
|
72
72
|
pool_info: dict[str, Any]
|
|
73
|
-
new_pool_url:
|
|
73
|
+
new_pool_url: str | None
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
def strip_old_entries(pairs: list[tuple[float, Any]], before: float) -> list[tuple[float, Any]]:
|
|
@@ -89,7 +89,7 @@ def increment_pool_stats(
|
|
|
89
89
|
name: str,
|
|
90
90
|
current_time: float,
|
|
91
91
|
count: int = 1,
|
|
92
|
-
value:
|
|
92
|
+
value: int | dict[str, Any] | None = None,
|
|
93
93
|
) -> None:
|
|
94
94
|
if p2_singleton_puzzlehash not in pool_states:
|
|
95
95
|
return
|
|
@@ -127,9 +127,9 @@ class Farmer:
|
|
|
127
127
|
farmer_config: dict[str, Any],
|
|
128
128
|
pool_config: dict[str, Any],
|
|
129
129
|
consensus_constants: ConsensusConstants,
|
|
130
|
-
local_keychain:
|
|
130
|
+
local_keychain: Keychain | None = None,
|
|
131
131
|
):
|
|
132
|
-
self.keychain_proxy:
|
|
132
|
+
self.keychain_proxy: KeychainProxy | None = None
|
|
133
133
|
self.local_keychain = local_keychain
|
|
134
134
|
self._root_path = root_path
|
|
135
135
|
self.config = farmer_config
|
|
@@ -155,18 +155,18 @@ class Farmer:
|
|
|
155
155
|
|
|
156
156
|
self.plot_sync_receivers: dict[bytes32, Receiver] = {}
|
|
157
157
|
|
|
158
|
-
self.cache_clear_task:
|
|
159
|
-
self.update_pool_state_task:
|
|
158
|
+
self.cache_clear_task: asyncio.Task[None] | None = None
|
|
159
|
+
self.update_pool_state_task: asyncio.Task[None] | None = None
|
|
160
160
|
self.constants = consensus_constants
|
|
161
161
|
self._shut_down = False
|
|
162
162
|
self.server: Any = None
|
|
163
|
-
self.state_changed_callback:
|
|
163
|
+
self.state_changed_callback: StateChangedProtocol | None = None
|
|
164
164
|
self.log = log
|
|
165
165
|
self.log.addFilter(TimedDuplicateFilter("No pool specific authentication_token_timeout.*", 60 * 10))
|
|
166
166
|
self.log.addFilter(TimedDuplicateFilter("No pool specific difficulty has been set.*", 60 * 10))
|
|
167
167
|
|
|
168
168
|
self.started = False
|
|
169
|
-
self.harvester_handshake_task:
|
|
169
|
+
self.harvester_handshake_task: asyncio.Task[None] | None = None
|
|
170
170
|
|
|
171
171
|
# From p2_singleton_puzzle_hash to pool state dict
|
|
172
172
|
self.pool_state: dict[bytes32, dict[str, Any]] = {}
|
|
@@ -180,7 +180,7 @@ class Farmer:
|
|
|
180
180
|
self.all_root_sks: list[PrivateKey] = []
|
|
181
181
|
|
|
182
182
|
# Use to find missing signage points. (new_signage_point, time)
|
|
183
|
-
self.prev_signage_point:
|
|
183
|
+
self.prev_signage_point: tuple[uint64, farmer_protocol.NewSignagePoint] | None = None
|
|
184
184
|
|
|
185
185
|
@contextlib.asynccontextmanager
|
|
186
186
|
async def manage(self) -> AsyncIterator[None]:
|
|
@@ -219,7 +219,7 @@ class Farmer:
|
|
|
219
219
|
await asyncio.sleep(0.5) # https://docs.aiohttp.org/en/stable/client_advanced.html#graceful-shutdown
|
|
220
220
|
self.started = False
|
|
221
221
|
|
|
222
|
-
def get_connections(self, request_node_type:
|
|
222
|
+
def get_connections(self, request_node_type: NodeType | None) -> list[dict[str, Any]]:
|
|
223
223
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
224
224
|
|
|
225
225
|
async def ensure_keychain_proxy(self) -> KeychainProxy:
|
|
@@ -312,7 +312,7 @@ class Farmer:
|
|
|
312
312
|
self.harvester_handshake_task = None
|
|
313
313
|
|
|
314
314
|
if peer.connection_type is NodeType.HARVESTER:
|
|
315
|
-
self.plot_sync_receivers[peer.peer_node_id] = Receiver(peer, self.plot_sync_callback)
|
|
315
|
+
self.plot_sync_receivers[peer.peer_node_id] = Receiver(peer, self.plot_sync_callback, self.constants)
|
|
316
316
|
self.harvester_handshake_task = create_referenced_task(handshake_task())
|
|
317
317
|
|
|
318
318
|
def set_server(self, server: ChiaServer) -> None:
|
|
@@ -339,14 +339,14 @@ class Farmer:
|
|
|
339
339
|
del self.plot_sync_receivers[connection.peer_node_id]
|
|
340
340
|
self.state_changed("harvester_removed", {"node_id": connection.peer_node_id})
|
|
341
341
|
|
|
342
|
-
async def plot_sync_callback(self, peer_id: bytes32, delta:
|
|
342
|
+
async def plot_sync_callback(self, peer_id: bytes32, delta: Delta | None) -> None:
|
|
343
343
|
log.debug(f"plot_sync_callback: peer_id {peer_id}, delta {delta}")
|
|
344
344
|
receiver: Receiver = self.plot_sync_receivers[peer_id]
|
|
345
345
|
harvester_updated: bool = delta is not None and not delta.empty()
|
|
346
346
|
if receiver.initial_sync() or harvester_updated:
|
|
347
347
|
self.state_changed("harvester_update", receiver.to_dict(True))
|
|
348
348
|
|
|
349
|
-
async def _pool_get_pool_info(self, pool_config: PoolWalletConfig) ->
|
|
349
|
+
async def _pool_get_pool_info(self, pool_config: PoolWalletConfig) -> GetPoolInfoResult | None:
|
|
350
350
|
try:
|
|
351
351
|
async with aiohttp.ClientSession(trust_env=True) as session:
|
|
352
352
|
url = f"{pool_config.pool_url}/pool_info"
|
|
@@ -354,7 +354,7 @@ class Farmer:
|
|
|
354
354
|
if resp.ok:
|
|
355
355
|
response: dict[str, Any] = json.loads(await resp.text())
|
|
356
356
|
self.log.info(f"GET /pool_info response: {response}")
|
|
357
|
-
new_pool_url:
|
|
357
|
+
new_pool_url: str | None = None
|
|
358
358
|
response_url_str = f"{resp.url}"
|
|
359
359
|
if (
|
|
360
360
|
response_url_str != url
|
|
@@ -379,7 +379,7 @@ class Farmer:
|
|
|
379
379
|
|
|
380
380
|
async def _pool_get_farmer(
|
|
381
381
|
self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, authentication_sk: PrivateKey
|
|
382
|
-
) ->
|
|
382
|
+
) -> dict[str, Any] | None:
|
|
383
383
|
authentication_token = get_current_authentication_token(authentication_token_timeout)
|
|
384
384
|
message: bytes32 = std_hash(
|
|
385
385
|
AuthenticationPayload(
|
|
@@ -387,7 +387,7 @@ class Farmer:
|
|
|
387
387
|
)
|
|
388
388
|
)
|
|
389
389
|
signature: G2Element = AugSchemeMPL.sign(authentication_sk, message)
|
|
390
|
-
get_farmer_params: dict[str,
|
|
390
|
+
get_farmer_params: dict[str, str | int] = {
|
|
391
391
|
"launcher_id": pool_config.launcher_id.hex(),
|
|
392
392
|
"authentication_token": authentication_token,
|
|
393
393
|
"signature": bytes(signature).hex(),
|
|
@@ -426,8 +426,8 @@ class Farmer:
|
|
|
426
426
|
|
|
427
427
|
async def _pool_post_farmer(
|
|
428
428
|
self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, owner_sk: PrivateKey
|
|
429
|
-
) ->
|
|
430
|
-
auth_sk:
|
|
429
|
+
) -> dict[str, Any] | None:
|
|
430
|
+
auth_sk: PrivateKey | None = self.get_authentication_sk(pool_config)
|
|
431
431
|
assert auth_sk is not None
|
|
432
432
|
post_farmer_payload: PostFarmerPayload = PostFarmerPayload(
|
|
433
433
|
pool_config.launcher_id,
|
|
@@ -475,7 +475,7 @@ class Farmer:
|
|
|
475
475
|
async def _pool_put_farmer(
|
|
476
476
|
self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, owner_sk: PrivateKey
|
|
477
477
|
) -> None:
|
|
478
|
-
auth_sk:
|
|
478
|
+
auth_sk: PrivateKey | None = self.get_authentication_sk(pool_config)
|
|
479
479
|
assert auth_sk is not None
|
|
480
480
|
put_farmer_payload: PutFarmerPayload = PutFarmerPayload(
|
|
481
481
|
pool_config.launcher_id,
|
|
@@ -518,10 +518,10 @@ class Farmer:
|
|
|
518
518
|
pool_config.p2_singleton_puzzle_hash, f"Exception in PUT /farmer {pool_config.pool_url}, {e}"
|
|
519
519
|
)
|
|
520
520
|
|
|
521
|
-
def get_authentication_sk(self, pool_config: PoolWalletConfig) ->
|
|
521
|
+
def get_authentication_sk(self, pool_config: PoolWalletConfig) -> PrivateKey | None:
|
|
522
522
|
if pool_config.p2_singleton_puzzle_hash in self.authentication_keys:
|
|
523
523
|
return self.authentication_keys[pool_config.p2_singleton_puzzle_hash]
|
|
524
|
-
auth_sk:
|
|
524
|
+
auth_sk: PrivateKey | None = find_authentication_sk(self.all_root_sks, pool_config.owner_public_key)
|
|
525
525
|
if auth_sk is not None:
|
|
526
526
|
self.authentication_keys[pool_config.p2_singleton_puzzle_hash] = auth_sk
|
|
527
527
|
return auth_sk
|
|
@@ -534,7 +534,7 @@ class Farmer:
|
|
|
534
534
|
p2_singleton_puzzle_hash = pool_config.p2_singleton_puzzle_hash
|
|
535
535
|
|
|
536
536
|
try:
|
|
537
|
-
authentication_sk:
|
|
537
|
+
authentication_sk: PrivateKey | None = self.get_authentication_sk(pool_config)
|
|
538
538
|
|
|
539
539
|
if authentication_sk is None:
|
|
540
540
|
self.log.error(f"Could not find authentication sk for {p2_singleton_puzzle_hash}")
|
|
@@ -602,13 +602,13 @@ class Farmer:
|
|
|
602
602
|
pool_state["next_farmer_update"] = time.time() + UPDATE_POOL_FARMER_INFO_INTERVAL
|
|
603
603
|
authentication_token_timeout = pool_state["authentication_token_timeout"]
|
|
604
604
|
|
|
605
|
-
async def update_pool_farmer_info() -> tuple[
|
|
605
|
+
async def update_pool_farmer_info() -> tuple[GetFarmerResponse | None, PoolErrorCode | None]:
|
|
606
606
|
# Run a GET /farmer to see if the farmer is already known by the pool
|
|
607
607
|
response = await self._pool_get_farmer(
|
|
608
608
|
pool_config, authentication_token_timeout, authentication_sk
|
|
609
609
|
)
|
|
610
|
-
farmer_response:
|
|
611
|
-
error_code_response:
|
|
610
|
+
farmer_response: GetFarmerResponse | None = None
|
|
611
|
+
error_code_response: PoolErrorCode | None = None
|
|
612
612
|
if response is not None:
|
|
613
613
|
if "error_code" not in response:
|
|
614
614
|
farmer_response = GetFarmerResponse.from_json_dict(response)
|
|
@@ -701,7 +701,7 @@ class Farmer:
|
|
|
701
701
|
"pool_target": self.pool_target_encoded,
|
|
702
702
|
}
|
|
703
703
|
|
|
704
|
-
def set_reward_targets(self, farmer_target_encoded:
|
|
704
|
+
def set_reward_targets(self, farmer_target_encoded: str | None, pool_target_encoded: str | None) -> None:
|
|
705
705
|
with lock_and_load_config(self._root_path, "config.yaml") as config:
|
|
706
706
|
if farmer_target_encoded is not None:
|
|
707
707
|
self.farmer_target_encoded = farmer_target_encoded
|
|
@@ -733,13 +733,13 @@ class Farmer:
|
|
|
733
733
|
|
|
734
734
|
self.log.warning(f"Launcher id: {launcher_id} not found")
|
|
735
735
|
|
|
736
|
-
async def generate_login_link(self, launcher_id: bytes32) ->
|
|
736
|
+
async def generate_login_link(self, launcher_id: bytes32) -> str | None:
|
|
737
737
|
for pool_state in self.pool_state.values():
|
|
738
738
|
pool_config: PoolWalletConfig = pool_state["pool_config"]
|
|
739
739
|
if pool_config.launcher_id != launcher_id:
|
|
740
740
|
continue
|
|
741
741
|
|
|
742
|
-
authentication_sk:
|
|
742
|
+
authentication_sk: PrivateKey | None = self.get_authentication_sk(pool_config)
|
|
743
743
|
if authentication_sk is None:
|
|
744
744
|
self.log.error(f"Could not find authentication sk for {pool_config.p2_singleton_puzzle_hash}")
|
|
745
745
|
continue
|
|
@@ -781,14 +781,14 @@ class Farmer:
|
|
|
781
781
|
return {"harvesters": harvesters}
|
|
782
782
|
|
|
783
783
|
def get_receiver(self, node_id: bytes32) -> Receiver:
|
|
784
|
-
receiver:
|
|
784
|
+
receiver: Receiver | None = self.plot_sync_receivers.get(node_id)
|
|
785
785
|
if receiver is None:
|
|
786
786
|
raise KeyError(f"Receiver missing for {node_id}")
|
|
787
787
|
return receiver
|
|
788
788
|
|
|
789
789
|
def check_missing_signage_points(
|
|
790
790
|
self, timestamp: uint64, new_signage_point: farmer_protocol.NewSignagePoint
|
|
791
|
-
) ->
|
|
791
|
+
) -> tuple[uint64, uint32] | None:
|
|
792
792
|
if self.prev_signage_point is None:
|
|
793
793
|
self.prev_signage_point = (timestamp, new_signage_point)
|
|
794
794
|
return None
|
chia/farmer/farmer_api.py
CHANGED
|
@@ -3,10 +3,10 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
|
-
from typing import TYPE_CHECKING, Any, ClassVar
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar
|
|
7
7
|
|
|
8
8
|
import aiohttp
|
|
9
|
-
from chia_rs import AugSchemeMPL, G2Element,
|
|
9
|
+
from chia_rs import AugSchemeMPL, G2Element, PlotParam, PoolTarget, PrivateKey, ProofOfSpace
|
|
10
10
|
from chia_rs.sized_bytes import bytes32
|
|
11
11
|
from chia_rs.sized_ints import uint8, uint16, uint32, uint64
|
|
12
12
|
from packaging.version import Version
|
|
@@ -51,9 +51,11 @@ from chia.types.blockchain_format.proof_of_space import (
|
|
|
51
51
|
|
|
52
52
|
class FarmerAPI:
|
|
53
53
|
if TYPE_CHECKING:
|
|
54
|
-
from chia.
|
|
54
|
+
from chia.apis.farmer_stub import FarmerApiStub
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
# Verify this class implements the FarmerApiStub protocol
|
|
57
|
+
def _protocol_check(self: FarmerAPI) -> FarmerApiStub:
|
|
58
|
+
return self
|
|
57
59
|
|
|
58
60
|
log: logging.Logger
|
|
59
61
|
farmer: Farmer
|
|
@@ -104,6 +106,7 @@ class FarmerAPI:
|
|
|
104
106
|
new_proof_of_space.challenge_hash,
|
|
105
107
|
new_proof_of_space.sp_hash,
|
|
106
108
|
height=sp.peak_height,
|
|
109
|
+
prev_transaction_block_height=sp.last_tx_height,
|
|
107
110
|
)
|
|
108
111
|
if computed_quality_string is None:
|
|
109
112
|
plotid: bytes32 = get_plot_id(new_proof_of_space.proof)
|
|
@@ -115,11 +118,9 @@ class FarmerAPI:
|
|
|
115
118
|
required_iters: uint64 = calculate_iterations_quality(
|
|
116
119
|
self.farmer.constants,
|
|
117
120
|
computed_quality_string,
|
|
118
|
-
new_proof_of_space.proof.
|
|
121
|
+
new_proof_of_space.proof.param(),
|
|
119
122
|
sp.difficulty,
|
|
120
123
|
new_proof_of_space.sp_hash,
|
|
121
|
-
sp.sub_slot_iters,
|
|
122
|
-
sp.last_tx_height,
|
|
123
124
|
)
|
|
124
125
|
|
|
125
126
|
# If the iters are good enough to make a block, proceed with the block making flow
|
|
@@ -127,7 +128,7 @@ class FarmerAPI:
|
|
|
127
128
|
if new_proof_of_space.farmer_reward_address_override is not None:
|
|
128
129
|
self.farmer.notify_farmer_reward_taken_by_harvester_as_fee(sp, new_proof_of_space)
|
|
129
130
|
|
|
130
|
-
sp_src_data:
|
|
131
|
+
sp_src_data: list[SignatureRequestSourceData | None] | None = None
|
|
131
132
|
if (
|
|
132
133
|
new_proof_of_space.include_source_signature_data
|
|
133
134
|
or new_proof_of_space.farmer_reward_address_override is not None
|
|
@@ -224,11 +225,9 @@ class FarmerAPI:
|
|
|
224
225
|
required_iters = calculate_iterations_quality(
|
|
225
226
|
self.farmer.constants,
|
|
226
227
|
computed_quality_string,
|
|
227
|
-
new_proof_of_space.proof.
|
|
228
|
+
new_proof_of_space.proof.param(),
|
|
228
229
|
pool_state_dict["current_difficulty"],
|
|
229
230
|
new_proof_of_space.sp_hash,
|
|
230
|
-
sp.sub_slot_iters,
|
|
231
|
-
sp.last_tx_height,
|
|
232
231
|
)
|
|
233
232
|
if required_iters >= calculate_sp_interval_iters(
|
|
234
233
|
self.farmer.constants, self.farmer.constants.POOL_SUB_SLOT_ITERS
|
|
@@ -280,7 +279,7 @@ class FarmerAPI:
|
|
|
280
279
|
|
|
281
280
|
# The plot key is 2/2 so we need the harvester's half of the signature
|
|
282
281
|
m_to_sign = payload.get_hash()
|
|
283
|
-
m_src_data:
|
|
282
|
+
m_src_data: list[SignatureRequestSourceData | None] | None = None
|
|
284
283
|
|
|
285
284
|
if ( # pragma: no cover
|
|
286
285
|
new_proof_of_space.include_source_signature_data
|
|
@@ -313,7 +312,7 @@ class FarmerAPI:
|
|
|
313
312
|
|
|
314
313
|
assert len(response.message_signatures) == 1
|
|
315
314
|
|
|
316
|
-
plot_signature:
|
|
315
|
+
plot_signature: G2Element | None = None
|
|
317
316
|
for sk in self.farmer.get_private_keys():
|
|
318
317
|
pk = sk.get_g1()
|
|
319
318
|
if pk == response.farmer_pk:
|
|
@@ -328,9 +327,7 @@ class FarmerAPI:
|
|
|
328
327
|
)
|
|
329
328
|
assert AugSchemeMPL.verify(agg_pk, m_to_sign, plot_signature)
|
|
330
329
|
|
|
331
|
-
authentication_sk:
|
|
332
|
-
pool_state_dict["pool_config"]
|
|
333
|
-
)
|
|
330
|
+
authentication_sk: PrivateKey | None = self.farmer.get_authentication_sk(pool_state_dict["pool_config"])
|
|
334
331
|
if authentication_sk is None:
|
|
335
332
|
self.farmer.log.error(f"No authentication sk for {p2_singleton_puzzle_hash}")
|
|
336
333
|
increment_pool_stats(
|
|
@@ -507,11 +504,17 @@ class FarmerAPI:
|
|
|
507
504
|
|
|
508
505
|
# Process each partial proof chain through solver service to get full proofs
|
|
509
506
|
for partial_proof in partial_proof_data.partial_proofs:
|
|
510
|
-
solver_info = SolverInfo(
|
|
507
|
+
solver_info = SolverInfo(
|
|
508
|
+
partial_proof=partial_proof,
|
|
509
|
+
plot_id=partial_proof_data.plot_id,
|
|
510
|
+
strength=partial_proof_data.strength,
|
|
511
|
+
size=partial_proof_data.plot_size,
|
|
512
|
+
)
|
|
511
513
|
|
|
514
|
+
key = bytes(partial_proof)
|
|
512
515
|
try:
|
|
513
516
|
# store pending request data for matching with response
|
|
514
|
-
self.farmer.pending_solver_requests[
|
|
517
|
+
self.farmer.pending_solver_requests[key] = {
|
|
515
518
|
"proof_data": partial_proof_data,
|
|
516
519
|
"peer": peer,
|
|
517
520
|
}
|
|
@@ -519,15 +522,15 @@ class FarmerAPI:
|
|
|
519
522
|
# send solve request to all solver connections
|
|
520
523
|
msg = make_msg(ProtocolMessageTypes.solve, solver_info)
|
|
521
524
|
await self.farmer.server.send_to_all([msg], NodeType.SOLVER)
|
|
522
|
-
self.farmer.log.debug(f"Sent solve request for partial proof {partial_proof.
|
|
525
|
+
self.farmer.log.debug(f"Sent solve request for partial proof {partial_proof.proof_fragments[:5]}...")
|
|
523
526
|
|
|
524
527
|
except Exception as e:
|
|
525
528
|
self.farmer.log.error(
|
|
526
|
-
f"Failed to call solver service for partial proof {partial_proof.
|
|
529
|
+
f"Failed to call solver service for partial proof {partial_proof.proof_fragments[:5]}...: {e}"
|
|
527
530
|
)
|
|
528
531
|
# clean up pending request
|
|
529
|
-
if
|
|
530
|
-
del self.farmer.pending_solver_requests[
|
|
532
|
+
if key in self.farmer.pending_solver_requests:
|
|
533
|
+
del self.farmer.pending_solver_requests[key]
|
|
531
534
|
|
|
532
535
|
@metadata.request()
|
|
533
536
|
async def solution_response(self, response: SolverResponse, peer: WSChiaConnection) -> None:
|
|
@@ -539,14 +542,15 @@ class FarmerAPI:
|
|
|
539
542
|
|
|
540
543
|
# find the matching pending request using partial_proof
|
|
541
544
|
|
|
542
|
-
|
|
545
|
+
key = bytes(response.partial_proof)
|
|
546
|
+
if key not in self.farmer.pending_solver_requests:
|
|
543
547
|
self.farmer.log.warning(
|
|
544
|
-
f"Received solver response for unknown partial proof {response.partial_proof.
|
|
548
|
+
f"Received solver response for unknown partial proof {response.partial_proof.proof_fragments[:5]}"
|
|
545
549
|
)
|
|
546
550
|
return
|
|
547
551
|
|
|
548
552
|
# get the original request data
|
|
549
|
-
request_data = self.farmer.pending_solver_requests.pop(
|
|
553
|
+
request_data = self.farmer.pending_solver_requests.pop(key)
|
|
550
554
|
proof_data = request_data["proof_data"]
|
|
551
555
|
original_peer = request_data["peer"]
|
|
552
556
|
partial_proof = response.partial_proof
|
|
@@ -554,7 +558,9 @@ class FarmerAPI:
|
|
|
554
558
|
# create the proof of space with the solver's proof
|
|
555
559
|
proof_bytes = response.proof
|
|
556
560
|
if proof_bytes is None or len(proof_bytes) == 0:
|
|
557
|
-
self.farmer.log.warning(
|
|
561
|
+
self.farmer.log.warning(
|
|
562
|
+
f"Received empty proof from solver for proof {partial_proof.proof_fragments[:5]}..."
|
|
563
|
+
)
|
|
558
564
|
return
|
|
559
565
|
|
|
560
566
|
sp_challenge_hash = proof_data.challenge_hash
|
|
@@ -651,7 +657,7 @@ class FarmerAPI:
|
|
|
651
657
|
new_signage_point.challenge_chain_sp,
|
|
652
658
|
pool_difficulties,
|
|
653
659
|
uint8(
|
|
654
|
-
calculate_prefix_bits(self.farmer.constants, new_signage_point.peak_height,
|
|
660
|
+
calculate_prefix_bits(self.farmer.constants, new_signage_point.peak_height, PlotParam.make_v1(32))
|
|
655
661
|
),
|
|
656
662
|
)
|
|
657
663
|
|
|
@@ -692,7 +698,7 @@ class FarmerAPI:
|
|
|
692
698
|
)
|
|
693
699
|
|
|
694
700
|
@metadata.request()
|
|
695
|
-
async def request_signed_values(self, full_node_request: farmer_protocol.RequestSignedValues) ->
|
|
701
|
+
async def request_signed_values(self, full_node_request: farmer_protocol.RequestSignedValues) -> Message | None:
|
|
696
702
|
if full_node_request.quality_string not in self.farmer.quality_str_to_identifiers:
|
|
697
703
|
self.farmer.log.error(f"Do not have quality string {full_node_request.quality_string}")
|
|
698
704
|
return None
|
|
@@ -701,7 +707,7 @@ class FarmerAPI:
|
|
|
701
707
|
full_node_request.quality_string
|
|
702
708
|
]
|
|
703
709
|
|
|
704
|
-
message_data:
|
|
710
|
+
message_data: list[SignatureRequestSourceData | None] | None = None
|
|
705
711
|
|
|
706
712
|
if full_node_request.foliage_block_data is not None:
|
|
707
713
|
message_data = [
|
|
@@ -792,7 +798,7 @@ class FarmerAPI:
|
|
|
792
798
|
|
|
793
799
|
def _process_respond_signatures(
|
|
794
800
|
self, response: harvester_protocol.RespondSignatures
|
|
795
|
-
) ->
|
|
801
|
+
) -> DeclareProofOfSpace | SignedValues | None:
|
|
796
802
|
"""
|
|
797
803
|
Processing the responded signatures happens when receiving an unsolicited request for an SP or when receiving
|
|
798
804
|
the signature response for a block from a harvester.
|
|
@@ -803,6 +809,7 @@ class FarmerAPI:
|
|
|
803
809
|
is_sp_signatures: bool = False
|
|
804
810
|
sps = self.farmer.sps[response.sp_hash]
|
|
805
811
|
peak_height = sps[0].peak_height
|
|
812
|
+
last_tx_height = sps[0].last_tx_height
|
|
806
813
|
signage_point_index = sps[0].signage_point_index
|
|
807
814
|
found_sp_hash_debug = False
|
|
808
815
|
for sp_candidate in sps:
|
|
@@ -821,7 +828,12 @@ class FarmerAPI:
|
|
|
821
828
|
include_taproot: bool = pospace.pool_contract_puzzle_hash is not None
|
|
822
829
|
|
|
823
830
|
computed_quality_string = verify_and_get_quality_string(
|
|
824
|
-
pospace,
|
|
831
|
+
pospace,
|
|
832
|
+
self.farmer.constants,
|
|
833
|
+
response.challenge_hash,
|
|
834
|
+
response.sp_hash,
|
|
835
|
+
height=peak_height,
|
|
836
|
+
prev_transaction_block_height=last_tx_height,
|
|
825
837
|
)
|
|
826
838
|
if computed_quality_string is None:
|
|
827
839
|
self.farmer.log.warning(f"Have invalid PoSpace {pospace}")
|
|
@@ -867,9 +879,9 @@ class FarmerAPI:
|
|
|
867
879
|
)
|
|
868
880
|
return None
|
|
869
881
|
|
|
870
|
-
pool_target:
|
|
882
|
+
pool_target: PoolTarget | None = PoolTarget(self.farmer.pool_target, uint32(0))
|
|
871
883
|
assert pool_target is not None
|
|
872
|
-
pool_target_signature:
|
|
884
|
+
pool_target_signature: G2Element | None = AugSchemeMPL.sign(
|
|
873
885
|
self.farmer.pool_sks_map[pool_pk], bytes(pool_target)
|
|
874
886
|
)
|
|
875
887
|
else:
|
chia/farmer/farmer_rpc_api.py
CHANGED
|
@@ -2,7 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import operator
|
|
5
|
-
from
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
6
7
|
|
|
7
8
|
from chia_rs.sized_bytes import bytes32
|
|
8
9
|
from chia_rs.sized_ints import uint32
|
|
@@ -33,7 +34,7 @@ class PaginatedRequestData(Protocol):
|
|
|
33
34
|
@dataclasses.dataclass(frozen=True)
|
|
34
35
|
class FilterItem(Streamable):
|
|
35
36
|
key: str
|
|
36
|
-
value:
|
|
37
|
+
value: str | None
|
|
37
38
|
|
|
38
39
|
|
|
39
40
|
@streamable
|
|
@@ -108,7 +109,7 @@ class FarmerRpcApi:
|
|
|
108
109
|
"/connect_to_solver": self.connect_to_solver,
|
|
109
110
|
}
|
|
110
111
|
|
|
111
|
-
async def _state_changed(self, change: str, change_data:
|
|
112
|
+
async def _state_changed(self, change: str, change_data: dict[str, Any] | None) -> list[WsRpcMessage]:
|
|
112
113
|
payloads = []
|
|
113
114
|
|
|
114
115
|
if change_data is None:
|
|
@@ -363,7 +364,7 @@ class FarmerRpcApi:
|
|
|
363
364
|
|
|
364
365
|
async def get_pool_login_link(self, request: dict[str, Any]) -> EndpointResult:
|
|
365
366
|
launcher_id: bytes32 = bytes32.from_hexstr(request["launcher_id"])
|
|
366
|
-
login_link:
|
|
367
|
+
login_link: str | None = await self.service.generate_login_link(launcher_id)
|
|
367
368
|
if login_link is None:
|
|
368
369
|
raise ValueError(f"Failed to generate login link for {launcher_id.hex()}")
|
|
369
370
|
return {"login_link": login_link}
|
chia/farmer/farmer_rpc_client.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any,
|
|
3
|
+
from typing import Any, cast
|
|
4
4
|
|
|
5
5
|
from chia_rs.sized_bytes import bytes32
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ class FarmerRpcClient(RpcClient):
|
|
|
18
18
|
to the full node.
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
-
async def get_signage_point(self, sp_hash: bytes32) ->
|
|
21
|
+
async def get_signage_point(self, sp_hash: bytes32) -> dict[str, Any] | None:
|
|
22
22
|
try:
|
|
23
23
|
return await self.fetch("get_signage_point", {"sp_hash": sp_hash.hex()})
|
|
24
24
|
except ValueError: # not synced
|
|
@@ -44,8 +44,8 @@ class FarmerRpcClient(RpcClient):
|
|
|
44
44
|
|
|
45
45
|
async def set_reward_targets(
|
|
46
46
|
self,
|
|
47
|
-
farmer_target:
|
|
48
|
-
pool_target:
|
|
47
|
+
farmer_target: str | None = None,
|
|
48
|
+
pool_target: str | None = None,
|
|
49
49
|
) -> dict[str, Any]:
|
|
50
50
|
request = {}
|
|
51
51
|
if farmer_target is not None:
|
|
@@ -79,10 +79,10 @@ class FarmerRpcClient(RpcClient):
|
|
|
79
79
|
async def get_harvester_plots_duplicates(self, request: PlotPathRequestData) -> dict[str, Any]:
|
|
80
80
|
return await self.fetch("get_harvester_plots_duplicates", recurse_jsonify(request))
|
|
81
81
|
|
|
82
|
-
async def get_pool_login_link(self, launcher_id: bytes32) ->
|
|
82
|
+
async def get_pool_login_link(self, launcher_id: bytes32) -> str | None:
|
|
83
83
|
try:
|
|
84
84
|
result = await self.fetch("get_pool_login_link", {"launcher_id": launcher_id.hex()})
|
|
85
|
-
return cast(
|
|
85
|
+
return cast(str | None, result["login_link"])
|
|
86
86
|
except ValueError: # not connected to pool.
|
|
87
87
|
return None
|
|
88
88
|
|
chia/farmer/start_farmer.py
CHANGED
|
@@ -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.farmer.farmer import Farmer
|
|
@@ -36,9 +36,9 @@ def create_farmer_service(
|
|
|
36
36
|
config: dict[str, Any],
|
|
37
37
|
config_pool: dict[str, Any],
|
|
38
38
|
consensus_constants: ConsensusConstants,
|
|
39
|
-
keychain:
|
|
39
|
+
keychain: Keychain | None = None,
|
|
40
40
|
connect_to_daemon: bool = True,
|
|
41
|
-
solver_peer:
|
|
41
|
+
solver_peer: UnresolvedPeerInfo | None = None,
|
|
42
42
|
) -> FarmerService:
|
|
43
43
|
service_config = config[SERVICE_NAME]
|
|
44
44
|
|
|
@@ -52,7 +52,7 @@ def create_farmer_service(
|
|
|
52
52
|
)
|
|
53
53
|
peer_api = FarmerAPI(node)
|
|
54
54
|
|
|
55
|
-
rpc_info:
|
|
55
|
+
rpc_info: RpcInfo[FarmerRpcApi] | None = None
|
|
56
56
|
if service_config.get("start_rpc_server", True):
|
|
57
57
|
rpc_info = (FarmerRpcApi, service_config["rpc_port"])
|
|
58
58
|
|
|
@@ -73,7 +73,7 @@ def create_farmer_service(
|
|
|
73
73
|
network_id=network_id,
|
|
74
74
|
rpc_info=rpc_info,
|
|
75
75
|
connect_to_daemon=connect_to_daemon,
|
|
76
|
-
|
|
76
|
+
stub_metadata_for_type=StubMetadataRegistry,
|
|
77
77
|
)
|
|
78
78
|
|
|
79
79
|
|