chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -11,10 +11,10 @@ import sys
|
|
|
11
11
|
import tempfile
|
|
12
12
|
from dataclasses import dataclass
|
|
13
13
|
from pathlib import Path
|
|
14
|
-
from typing import Any,
|
|
14
|
+
from typing import Any, Optional, overload
|
|
15
15
|
from urllib.parse import urlparse
|
|
16
16
|
|
|
17
|
-
import boto3
|
|
17
|
+
import boto3
|
|
18
18
|
import yaml
|
|
19
19
|
from aiohttp import web
|
|
20
20
|
from botocore.exceptions import ClientError
|
|
@@ -31,17 +31,17 @@ plugin_version = "0.1.0"
|
|
|
31
31
|
class StoreConfig:
|
|
32
32
|
id: bytes32
|
|
33
33
|
bucket: Optional[str]
|
|
34
|
-
urls:
|
|
34
|
+
urls: set[str]
|
|
35
35
|
|
|
36
36
|
@classmethod
|
|
37
|
-
def unmarshal(cls, d:
|
|
37
|
+
def unmarshal(cls, d: dict[str, Any]) -> StoreConfig:
|
|
38
38
|
upload_bucket = d.get("upload_bucket", None)
|
|
39
39
|
if upload_bucket and len(upload_bucket) == 0:
|
|
40
40
|
upload_bucket = None
|
|
41
41
|
|
|
42
42
|
return StoreConfig(bytes32.from_hexstr(d["store_id"]), upload_bucket, d.get("download_urls", set()))
|
|
43
43
|
|
|
44
|
-
def marshal(self) ->
|
|
44
|
+
def marshal(self) -> dict[str, Any]:
|
|
45
45
|
return {"store_id": self.id.hex(), "upload_bucket": self.bucket, "download_urls": self.urls}
|
|
46
46
|
|
|
47
47
|
|
|
@@ -52,7 +52,7 @@ class S3Plugin:
|
|
|
52
52
|
aws_access_key_id: str
|
|
53
53
|
aws_secret_access_key: str
|
|
54
54
|
server_files_path: Path
|
|
55
|
-
stores:
|
|
55
|
+
stores: list[StoreConfig]
|
|
56
56
|
instance_name: str
|
|
57
57
|
|
|
58
58
|
def __init__(
|
|
@@ -61,7 +61,7 @@ class S3Plugin:
|
|
|
61
61
|
aws_access_key_id: str,
|
|
62
62
|
aws_secret_access_key: str,
|
|
63
63
|
server_files_path: Path,
|
|
64
|
-
stores:
|
|
64
|
+
stores: list[StoreConfig],
|
|
65
65
|
instance_name: str,
|
|
66
66
|
):
|
|
67
67
|
self.boto_resource = boto3.resource(
|
|
@@ -373,7 +373,7 @@ class S3Plugin:
|
|
|
373
373
|
shutil.move(str(tmp_path), str(path))
|
|
374
374
|
|
|
375
375
|
|
|
376
|
-
def read_store_ids_from_config(config:
|
|
376
|
+
def read_store_ids_from_config(config: dict[str, Any]) -> list[StoreConfig]:
|
|
377
377
|
stores = []
|
|
378
378
|
for store in config.get("stores", []):
|
|
379
379
|
try:
|
|
@@ -389,7 +389,7 @@ def read_store_ids_from_config(config: Dict[str, Any]) -> List[StoreConfig]:
|
|
|
389
389
|
return stores
|
|
390
390
|
|
|
391
391
|
|
|
392
|
-
def make_app(config:
|
|
392
|
+
def make_app(config: dict[str, Any], instance_name: str) -> web.Application:
|
|
393
393
|
try:
|
|
394
394
|
region = config["aws_credentials"]["region"]
|
|
395
395
|
aws_access_key_id = config["aws_credentials"]["access_key_id"]
|
chia/data_layer/util/plugin.py
CHANGED
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import List
|
|
6
5
|
|
|
7
6
|
import yaml
|
|
8
7
|
|
|
@@ -10,7 +9,7 @@ from chia.data_layer.data_layer_util import PluginRemote
|
|
|
10
9
|
from chia.util.log_exceptions import log_exceptions
|
|
11
10
|
|
|
12
11
|
|
|
13
|
-
async def load_plugin_configurations(root_path: Path, config_type: str, log: logging.Logger) ->
|
|
12
|
+
async def load_plugin_configurations(root_path: Path, config_type: str, log: logging.Logger) -> list[PluginRemote]:
|
|
14
13
|
"""
|
|
15
14
|
Loads plugin configurations from the specified directory and validates that the contents
|
|
16
15
|
are in the expected JSON format (an array of PluginRemote objects). It gracefully handles errors
|
|
@@ -21,7 +20,7 @@ async def load_plugin_configurations(root_path: Path, config_type: str, log: log
|
|
|
21
20
|
config_type (str): The type of plugins to load ('downloaders' or 'uploaders').
|
|
22
21
|
|
|
23
22
|
Returns:
|
|
24
|
-
|
|
23
|
+
list[PluginRemote]: A list of valid PluginRemote instances for the specified plugin type.
|
|
25
24
|
"""
|
|
26
25
|
config_path = root_path / "plugins" / config_type
|
|
27
26
|
config_path.mkdir(parents=True, exist_ok=True) # Ensure the config directory exists
|
chia/farmer/farmer.py
CHANGED
|
@@ -7,10 +7,11 @@ import logging
|
|
|
7
7
|
import sys
|
|
8
8
|
import time
|
|
9
9
|
import traceback
|
|
10
|
+
from collections.abc import AsyncIterator
|
|
10
11
|
from dataclasses import dataclass
|
|
11
12
|
from math import floor
|
|
12
13
|
from pathlib import Path
|
|
13
|
-
from typing import TYPE_CHECKING, Any,
|
|
14
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast
|
|
14
15
|
|
|
15
16
|
import aiohttp
|
|
16
17
|
from chia_rs import AugSchemeMPL, G1Element, G2Element, PrivateKey
|
|
@@ -49,6 +50,7 @@ from chia.util.ints import uint8, uint16, uint32, uint64
|
|
|
49
50
|
from chia.util.keychain import Keychain
|
|
50
51
|
from chia.util.logging import TimedDuplicateFilter
|
|
51
52
|
from chia.util.profiler import profile_task
|
|
53
|
+
from chia.util.task_referencer import create_referenced_task
|
|
52
54
|
from chia.wallet.derive_keys import (
|
|
53
55
|
find_authentication_sk,
|
|
54
56
|
find_owner_sk,
|
|
@@ -69,11 +71,11 @@ UPDATE_POOL_FARMER_INFO_INTERVAL: int = 300
|
|
|
69
71
|
|
|
70
72
|
@dataclass(frozen=True)
|
|
71
73
|
class GetPoolInfoResult:
|
|
72
|
-
pool_info:
|
|
74
|
+
pool_info: dict[str, Any]
|
|
73
75
|
new_pool_url: Optional[str]
|
|
74
76
|
|
|
75
77
|
|
|
76
|
-
def strip_old_entries(pairs:
|
|
78
|
+
def strip_old_entries(pairs: list[tuple[float, Any]], before: float) -> list[tuple[float, Any]]:
|
|
77
79
|
for index, [timestamp, points] in enumerate(pairs):
|
|
78
80
|
if timestamp >= before:
|
|
79
81
|
if index == 0:
|
|
@@ -84,12 +86,12 @@ def strip_old_entries(pairs: List[Tuple[float, Any]], before: float) -> List[Tup
|
|
|
84
86
|
|
|
85
87
|
|
|
86
88
|
def increment_pool_stats(
|
|
87
|
-
pool_states:
|
|
89
|
+
pool_states: dict[bytes32, Any],
|
|
88
90
|
p2_singleton_puzzlehash: bytes32,
|
|
89
91
|
name: str,
|
|
90
92
|
current_time: float,
|
|
91
93
|
count: int = 1,
|
|
92
|
-
value: Optional[Union[int,
|
|
94
|
+
value: Optional[Union[int, dict[str, Any]]] = None,
|
|
93
95
|
) -> None:
|
|
94
96
|
if p2_singleton_puzzlehash not in pool_states:
|
|
95
97
|
return
|
|
@@ -124,8 +126,8 @@ class Farmer:
|
|
|
124
126
|
def __init__(
|
|
125
127
|
self,
|
|
126
128
|
root_path: Path,
|
|
127
|
-
farmer_config:
|
|
128
|
-
pool_config:
|
|
129
|
+
farmer_config: dict[str, Any],
|
|
130
|
+
pool_config: dict[str, Any],
|
|
129
131
|
consensus_constants: ConsensusConstants,
|
|
130
132
|
local_keychain: Optional[Keychain] = None,
|
|
131
133
|
):
|
|
@@ -135,22 +137,22 @@ class Farmer:
|
|
|
135
137
|
self.config = farmer_config
|
|
136
138
|
self.pool_config = pool_config
|
|
137
139
|
# Keep track of all sps, keyed on challenge chain signage point hash
|
|
138
|
-
self.sps:
|
|
140
|
+
self.sps: dict[bytes32, list[farmer_protocol.NewSignagePoint]] = {}
|
|
139
141
|
|
|
140
142
|
# Keep track of harvester plot identifier (str), target sp index, and PoSpace for each challenge
|
|
141
|
-
self.proofs_of_space:
|
|
143
|
+
self.proofs_of_space: dict[bytes32, list[tuple[str, ProofOfSpace]]] = {}
|
|
142
144
|
|
|
143
145
|
# Quality string to plot identifier and challenge_hash, for use with harvester.RequestSignatures
|
|
144
|
-
self.quality_str_to_identifiers:
|
|
146
|
+
self.quality_str_to_identifiers: dict[bytes32, tuple[str, bytes32, bytes32, bytes32]] = {}
|
|
145
147
|
|
|
146
148
|
# number of responses to each signage point
|
|
147
|
-
self.number_of_responses:
|
|
149
|
+
self.number_of_responses: dict[bytes32, int] = {}
|
|
148
150
|
|
|
149
151
|
# A dictionary of keys to time added. These keys refer to keys in the above 4 dictionaries. This is used
|
|
150
152
|
# to periodically clear the memory
|
|
151
|
-
self.cache_add_time:
|
|
153
|
+
self.cache_add_time: dict[bytes32, uint64] = {}
|
|
152
154
|
|
|
153
|
-
self.plot_sync_receivers:
|
|
155
|
+
self.plot_sync_receivers: dict[bytes32, Receiver] = {}
|
|
154
156
|
|
|
155
157
|
self.cache_clear_task: Optional[asyncio.Task[None]] = None
|
|
156
158
|
self.update_pool_state_task: Optional[asyncio.Task[None]] = None
|
|
@@ -166,18 +168,18 @@ class Farmer:
|
|
|
166
168
|
self.harvester_handshake_task: Optional[asyncio.Task[None]] = None
|
|
167
169
|
|
|
168
170
|
# From p2_singleton_puzzle_hash to pool state dict
|
|
169
|
-
self.pool_state:
|
|
171
|
+
self.pool_state: dict[bytes32, dict[str, Any]] = {}
|
|
170
172
|
|
|
171
173
|
# From p2_singleton to auth PrivateKey
|
|
172
|
-
self.authentication_keys:
|
|
174
|
+
self.authentication_keys: dict[bytes32, PrivateKey] = {}
|
|
173
175
|
|
|
174
176
|
# Last time we updated pool_state based on the config file
|
|
175
177
|
self.last_config_access_time: float = 0
|
|
176
178
|
|
|
177
|
-
self.all_root_sks:
|
|
179
|
+
self.all_root_sks: list[PrivateKey] = []
|
|
178
180
|
|
|
179
181
|
# Use to find missing signage points. (new_signage_point, time)
|
|
180
|
-
self.prev_signage_point: Optional[
|
|
182
|
+
self.prev_signage_point: Optional[tuple[uint64, farmer_protocol.NewSignagePoint]] = None
|
|
181
183
|
|
|
182
184
|
@contextlib.asynccontextmanager
|
|
183
185
|
async def manage(self) -> AsyncIterator[None]:
|
|
@@ -186,8 +188,8 @@ class Farmer:
|
|
|
186
188
|
# succeeds or until we need to shut down.
|
|
187
189
|
while not self._shut_down:
|
|
188
190
|
if await self.setup_keys():
|
|
189
|
-
self.update_pool_state_task =
|
|
190
|
-
self.cache_clear_task =
|
|
191
|
+
self.update_pool_state_task = create_referenced_task(self._periodically_update_pool_state_task())
|
|
192
|
+
self.cache_clear_task = create_referenced_task(self._periodically_clear_cache_and_refresh_task())
|
|
191
193
|
log.debug("start_task: initialized")
|
|
192
194
|
self.started = True
|
|
193
195
|
return
|
|
@@ -197,9 +199,9 @@ class Farmer:
|
|
|
197
199
|
if sys.getprofile() is not None:
|
|
198
200
|
self.log.warning("not enabling profiler, getprofile() is already set")
|
|
199
201
|
else:
|
|
200
|
-
|
|
202
|
+
create_referenced_task(profile_task(self._root_path, "farmer", self.log), known_unreferenced=True)
|
|
201
203
|
|
|
202
|
-
|
|
204
|
+
create_referenced_task(start_task(), known_unreferenced=True)
|
|
203
205
|
try:
|
|
204
206
|
yield
|
|
205
207
|
finally:
|
|
@@ -216,7 +218,7 @@ class Farmer:
|
|
|
216
218
|
await asyncio.sleep(0.5) # https://docs.aiohttp.org/en/stable/client_advanced.html#graceful-shutdown
|
|
217
219
|
self.started = False
|
|
218
220
|
|
|
219
|
-
def get_connections(self, request_node_type: Optional[NodeType]) ->
|
|
221
|
+
def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
220
222
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
221
223
|
|
|
222
224
|
async def ensure_keychain_proxy(self) -> KeychainProxy:
|
|
@@ -229,7 +231,7 @@ class Farmer:
|
|
|
229
231
|
raise KeychainProxyConnectionFailure()
|
|
230
232
|
return self.keychain_proxy
|
|
231
233
|
|
|
232
|
-
async def get_all_private_keys(self) ->
|
|
234
|
+
async def get_all_private_keys(self) -> list[tuple[PrivateKey, bytes]]:
|
|
233
235
|
keychain_proxy = await self.ensure_keychain_proxy()
|
|
234
236
|
return await keychain_proxy.get_all_private_keys()
|
|
235
237
|
|
|
@@ -285,7 +287,8 @@ class Farmer:
|
|
|
285
287
|
async def handshake_task() -> None:
|
|
286
288
|
# Wait until the task in `Farmer._start` is done so that we have keys available for the handshake. Bail out
|
|
287
289
|
# early if we need to shut down or if the harvester is not longer connected.
|
|
288
|
-
|
|
290
|
+
# TODO: switch to event driven code
|
|
291
|
+
while not self.started and not self._shut_down and peer in self.server.get_connections(): # noqa: ASYNC110
|
|
289
292
|
await asyncio.sleep(1)
|
|
290
293
|
|
|
291
294
|
if self._shut_down:
|
|
@@ -309,12 +312,12 @@ class Farmer:
|
|
|
309
312
|
|
|
310
313
|
if peer.connection_type is NodeType.HARVESTER:
|
|
311
314
|
self.plot_sync_receivers[peer.peer_node_id] = Receiver(peer, self.plot_sync_callback)
|
|
312
|
-
self.harvester_handshake_task =
|
|
315
|
+
self.harvester_handshake_task = create_referenced_task(handshake_task())
|
|
313
316
|
|
|
314
317
|
def set_server(self, server: ChiaServer) -> None:
|
|
315
318
|
self.server = server
|
|
316
319
|
|
|
317
|
-
def state_changed(self, change: str, data:
|
|
320
|
+
def state_changed(self, change: str, data: dict[str, Any]) -> None:
|
|
318
321
|
if self.state_changed_callback is not None:
|
|
319
322
|
self.state_changed_callback(change, data)
|
|
320
323
|
|
|
@@ -348,7 +351,7 @@ class Farmer:
|
|
|
348
351
|
url = f"{pool_config.pool_url}/pool_info"
|
|
349
352
|
async with session.get(url, ssl=ssl_context_for_root(get_mozilla_ca_crt(), log=self.log)) as resp:
|
|
350
353
|
if resp.ok:
|
|
351
|
-
response:
|
|
354
|
+
response: dict[str, Any] = json.loads(await resp.text())
|
|
352
355
|
self.log.info(f"GET /pool_info response: {response}")
|
|
353
356
|
new_pool_url: Optional[str] = None
|
|
354
357
|
response_url_str = f"{resp.url}"
|
|
@@ -375,7 +378,7 @@ class Farmer:
|
|
|
375
378
|
|
|
376
379
|
async def _pool_get_farmer(
|
|
377
380
|
self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, authentication_sk: PrivateKey
|
|
378
|
-
) -> Optional[
|
|
381
|
+
) -> Optional[dict[str, Any]]:
|
|
379
382
|
authentication_token = get_current_authentication_token(authentication_token_timeout)
|
|
380
383
|
message: bytes32 = std_hash(
|
|
381
384
|
AuthenticationPayload(
|
|
@@ -396,7 +399,7 @@ class Farmer:
|
|
|
396
399
|
ssl=ssl_context_for_root(get_mozilla_ca_crt(), log=self.log),
|
|
397
400
|
) as resp:
|
|
398
401
|
if resp.ok:
|
|
399
|
-
response:
|
|
402
|
+
response: dict[str, Any] = json.loads(await resp.text())
|
|
400
403
|
log_level = logging.INFO
|
|
401
404
|
if "error_code" in response:
|
|
402
405
|
log_level = logging.WARNING
|
|
@@ -422,7 +425,7 @@ class Farmer:
|
|
|
422
425
|
|
|
423
426
|
async def _pool_post_farmer(
|
|
424
427
|
self, pool_config: PoolWalletConfig, authentication_token_timeout: uint8, owner_sk: PrivateKey
|
|
425
|
-
) -> Optional[
|
|
428
|
+
) -> Optional[dict[str, Any]]:
|
|
426
429
|
auth_sk: Optional[PrivateKey] = self.get_authentication_sk(pool_config)
|
|
427
430
|
assert auth_sk is not None
|
|
428
431
|
post_farmer_payload: PostFarmerPayload = PostFarmerPayload(
|
|
@@ -444,7 +447,7 @@ class Farmer:
|
|
|
444
447
|
ssl=ssl_context_for_root(get_mozilla_ca_crt(), log=self.log),
|
|
445
448
|
) as resp:
|
|
446
449
|
if resp.ok:
|
|
447
|
-
response:
|
|
450
|
+
response: dict[str, Any] = json.loads(await resp.text())
|
|
448
451
|
log_level = logging.INFO
|
|
449
452
|
if "error_code" in response:
|
|
450
453
|
log_level = logging.WARNING
|
|
@@ -492,7 +495,7 @@ class Farmer:
|
|
|
492
495
|
ssl=ssl_context_for_root(get_mozilla_ca_crt(), log=self.log),
|
|
493
496
|
) as resp:
|
|
494
497
|
if resp.ok:
|
|
495
|
-
response:
|
|
498
|
+
response: dict[str, Any] = json.loads(await resp.text())
|
|
496
499
|
log_level = logging.INFO
|
|
497
500
|
if "error_code" in response:
|
|
498
501
|
log_level = logging.WARNING
|
|
@@ -525,7 +528,7 @@ class Farmer:
|
|
|
525
528
|
async def update_pool_state(self) -> None:
|
|
526
529
|
config = load_config(self._root_path, "config.yaml")
|
|
527
530
|
|
|
528
|
-
pool_config_list:
|
|
531
|
+
pool_config_list: list[PoolWalletConfig] = load_pool_config(self._root_path)
|
|
529
532
|
for pool_config in pool_config_list:
|
|
530
533
|
p2_singleton_puzzle_hash = pool_config.p2_singleton_puzzle_hash
|
|
531
534
|
|
|
@@ -598,7 +601,7 @@ class Farmer:
|
|
|
598
601
|
pool_state["next_farmer_update"] = time.time() + UPDATE_POOL_FARMER_INFO_INTERVAL
|
|
599
602
|
authentication_token_timeout = pool_state["authentication_token_timeout"]
|
|
600
603
|
|
|
601
|
-
async def update_pool_farmer_info() ->
|
|
604
|
+
async def update_pool_farmer_info() -> tuple[Optional[GetFarmerResponse], Optional[PoolErrorCode]]:
|
|
602
605
|
# Run a GET /farmer to see if the farmer is already known by the pool
|
|
603
606
|
response = await self._pool_get_farmer(
|
|
604
607
|
pool_config, authentication_token_timeout, authentication_sk
|
|
@@ -662,19 +665,19 @@ class Farmer:
|
|
|
662
665
|
tb = traceback.format_exc()
|
|
663
666
|
self.log.error(f"Exception in update_pool_state for {pool_config.pool_url}, {e} {tb}")
|
|
664
667
|
|
|
665
|
-
def get_public_keys(self) ->
|
|
668
|
+
def get_public_keys(self) -> list[G1Element]:
|
|
666
669
|
return [child_sk.get_g1() for child_sk in self._private_keys]
|
|
667
670
|
|
|
668
|
-
def get_private_keys(self) ->
|
|
671
|
+
def get_private_keys(self) -> list[PrivateKey]:
|
|
669
672
|
return self._private_keys
|
|
670
673
|
|
|
671
|
-
async def get_reward_targets(self, search_for_private_key: bool, max_ph_to_search: int = 500) ->
|
|
674
|
+
async def get_reward_targets(self, search_for_private_key: bool, max_ph_to_search: int = 500) -> dict[str, Any]:
|
|
672
675
|
if search_for_private_key:
|
|
673
676
|
all_sks = await self.get_all_private_keys()
|
|
674
677
|
have_farmer_sk, have_pool_sk = False, False
|
|
675
|
-
search_addresses:
|
|
678
|
+
search_addresses: list[bytes32] = [self.farmer_target, self.pool_target]
|
|
676
679
|
for sk, _ in all_sks:
|
|
677
|
-
found_addresses:
|
|
680
|
+
found_addresses: set[bytes32] = match_address_to_sk(sk, search_addresses, max_ph_to_search)
|
|
678
681
|
|
|
679
682
|
if not have_farmer_sk and self.farmer_target in found_addresses:
|
|
680
683
|
search_addresses.remove(self.farmer_target)
|
|
@@ -763,8 +766,8 @@ class Farmer:
|
|
|
763
766
|
|
|
764
767
|
return None
|
|
765
768
|
|
|
766
|
-
async def get_harvesters(self, counts_only: bool = False) ->
|
|
767
|
-
harvesters:
|
|
769
|
+
async def get_harvesters(self, counts_only: bool = False) -> dict[str, Any]:
|
|
770
|
+
harvesters: list[dict[str, Any]] = []
|
|
768
771
|
for connection in self.server.get_connections(NodeType.HARVESTER):
|
|
769
772
|
self.log.debug(f"get_harvesters host: {connection.peer_info.host}, node_id: {connection.peer_node_id}")
|
|
770
773
|
receiver = self.plot_sync_receivers.get(connection.peer_node_id)
|
|
@@ -785,7 +788,7 @@ class Farmer:
|
|
|
785
788
|
|
|
786
789
|
def check_missing_signage_points(
|
|
787
790
|
self, timestamp: uint64, new_signage_point: farmer_protocol.NewSignagePoint
|
|
788
|
-
) -> Optional[
|
|
791
|
+
) -> Optional[tuple[uint64, uint32]]:
|
|
789
792
|
if self.prev_signage_point is None:
|
|
790
793
|
self.prev_signage_point = (timestamp, new_signage_point)
|
|
791
794
|
return None
|
|
@@ -836,7 +839,7 @@ class Farmer:
|
|
|
836
839
|
try:
|
|
837
840
|
if time_slept > self.constants.SUB_SLOT_TIME_TARGET:
|
|
838
841
|
now = time.time()
|
|
839
|
-
removed_keys:
|
|
842
|
+
removed_keys: list[bytes32] = []
|
|
840
843
|
for key, add_time in self.cache_add_time.items():
|
|
841
844
|
if now - float(add_time) > self.constants.SUB_SLOT_TIME_TARGET * 3:
|
|
842
845
|
self.sps.pop(key, None)
|
chia/farmer/farmer_api.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast
|
|
7
7
|
|
|
8
8
|
import aiohttp
|
|
9
9
|
from chia_rs import AugSchemeMPL, G2Element, PrivateKey
|
|
@@ -30,6 +30,7 @@ from chia.protocols.pool_protocol import (
|
|
|
30
30
|
get_current_authentication_token,
|
|
31
31
|
)
|
|
32
32
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
33
|
+
from chia.server.api_protocol import ApiMetadata
|
|
33
34
|
from chia.server.outbound_message import Message, NodeType, make_msg
|
|
34
35
|
from chia.server.server import ssl_context_for_root
|
|
35
36
|
from chia.server.ws_connection import WSChiaConnection
|
|
@@ -43,13 +44,18 @@ from chia.types.blockchain_format.proof_of_space import (
|
|
|
43
44
|
verify_and_get_quality_string,
|
|
44
45
|
)
|
|
45
46
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
46
|
-
from chia.util.api_decorators import api_request
|
|
47
47
|
from chia.util.ints import uint8, uint16, uint32, uint64
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
class FarmerAPI:
|
|
51
|
+
if TYPE_CHECKING:
|
|
52
|
+
from chia.server.api_protocol import ApiProtocol
|
|
53
|
+
|
|
54
|
+
_protocol_check: ClassVar[ApiProtocol] = cast("FarmerAPI", None)
|
|
55
|
+
|
|
51
56
|
log: logging.Logger
|
|
52
57
|
farmer: Farmer
|
|
58
|
+
metadata: ClassVar[ApiMetadata] = ApiMetadata()
|
|
53
59
|
|
|
54
60
|
def __init__(self, farmer: Farmer) -> None:
|
|
55
61
|
self.log = logging.getLogger(__name__)
|
|
@@ -58,7 +64,7 @@ class FarmerAPI:
|
|
|
58
64
|
def ready(self) -> bool:
|
|
59
65
|
return self.farmer.started
|
|
60
66
|
|
|
61
|
-
@
|
|
67
|
+
@metadata.request(peer_required=True)
|
|
62
68
|
async def new_proof_of_space(
|
|
63
69
|
self, new_proof_of_space: harvester_protocol.NewProofOfSpace, peer: WSChiaConnection
|
|
64
70
|
) -> None:
|
|
@@ -117,7 +123,7 @@ class FarmerAPI:
|
|
|
117
123
|
if new_proof_of_space.farmer_reward_address_override is not None:
|
|
118
124
|
self.farmer.notify_farmer_reward_taken_by_harvester_as_fee(sp, new_proof_of_space)
|
|
119
125
|
|
|
120
|
-
sp_src_data: Optional[
|
|
126
|
+
sp_src_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
|
|
121
127
|
if (
|
|
122
128
|
new_proof_of_space.include_source_signature_data
|
|
123
129
|
or new_proof_of_space.farmer_reward_address_override is not None
|
|
@@ -182,7 +188,7 @@ class FarmerAPI:
|
|
|
182
188
|
if p2_singleton_puzzle_hash not in self.farmer.pool_state:
|
|
183
189
|
self.farmer.log.info(f"Did not find pool info for {p2_singleton_puzzle_hash}")
|
|
184
190
|
return
|
|
185
|
-
pool_state_dict:
|
|
191
|
+
pool_state_dict: dict[str, Any] = self.farmer.pool_state[p2_singleton_puzzle_hash]
|
|
186
192
|
pool_url = pool_state_dict["pool_config"].pool_url
|
|
187
193
|
if pool_url == "":
|
|
188
194
|
# `pool_url == ""` means solo plotNFT farming
|
|
@@ -268,7 +274,7 @@ class FarmerAPI:
|
|
|
268
274
|
|
|
269
275
|
# The plot key is 2/2 so we need the harvester's half of the signature
|
|
270
276
|
m_to_sign = payload.get_hash()
|
|
271
|
-
m_src_data: Optional[
|
|
277
|
+
m_src_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
|
|
272
278
|
|
|
273
279
|
if ( # pragma: no cover
|
|
274
280
|
new_proof_of_space.include_source_signature_data
|
|
@@ -374,7 +380,7 @@ class FarmerAPI:
|
|
|
374
380
|
)
|
|
375
381
|
return
|
|
376
382
|
|
|
377
|
-
pool_response:
|
|
383
|
+
pool_response: dict[str, Any] = json.loads(await resp.text())
|
|
378
384
|
self.farmer.log.info(f"Pool response: {pool_response}")
|
|
379
385
|
if "error_code" in pool_response:
|
|
380
386
|
self.farmer.log.error(
|
|
@@ -471,7 +477,7 @@ class FarmerAPI:
|
|
|
471
477
|
|
|
472
478
|
return
|
|
473
479
|
|
|
474
|
-
@
|
|
480
|
+
@metadata.request()
|
|
475
481
|
async def respond_signatures(self, response: harvester_protocol.RespondSignatures) -> None:
|
|
476
482
|
request = self._process_respond_signatures(response)
|
|
477
483
|
if request is None:
|
|
@@ -489,7 +495,7 @@ class FarmerAPI:
|
|
|
489
495
|
FARMER PROTOCOL (FARMER <-> FULL NODE)
|
|
490
496
|
"""
|
|
491
497
|
|
|
492
|
-
@
|
|
498
|
+
@metadata.request()
|
|
493
499
|
async def new_signage_point(self, new_signage_point: farmer_protocol.NewSignagePoint) -> None:
|
|
494
500
|
if new_signage_point.challenge_chain_sp not in self.farmer.sps:
|
|
495
501
|
self.farmer.sps[new_signage_point.challenge_chain_sp] = []
|
|
@@ -501,7 +507,7 @@ class FarmerAPI:
|
|
|
501
507
|
self.farmer.sps[new_signage_point.challenge_chain_sp].append(new_signage_point)
|
|
502
508
|
|
|
503
509
|
try:
|
|
504
|
-
pool_difficulties:
|
|
510
|
+
pool_difficulties: list[PoolDifficulty] = []
|
|
505
511
|
for p2_singleton_puzzle_hash, pool_dict in self.farmer.pool_state.items():
|
|
506
512
|
if pool_dict["pool_config"].pool_url == "":
|
|
507
513
|
# Self pooling
|
|
@@ -558,7 +564,7 @@ class FarmerAPI:
|
|
|
558
564
|
{"sp_hash": new_signage_point.challenge_chain_sp, "missing_signage_points": missing_signage_points},
|
|
559
565
|
)
|
|
560
566
|
|
|
561
|
-
@
|
|
567
|
+
@metadata.request()
|
|
562
568
|
async def request_signed_values(self, full_node_request: farmer_protocol.RequestSignedValues) -> Optional[Message]:
|
|
563
569
|
if full_node_request.quality_string not in self.farmer.quality_str_to_identifiers:
|
|
564
570
|
self.farmer.log.error(f"Do not have quality string {full_node_request.quality_string}")
|
|
@@ -568,7 +574,7 @@ class FarmerAPI:
|
|
|
568
574
|
full_node_request.quality_string
|
|
569
575
|
]
|
|
570
576
|
|
|
571
|
-
message_data: Optional[
|
|
577
|
+
message_data: Optional[list[Optional[SignatureRequestSourceData]]] = None
|
|
572
578
|
|
|
573
579
|
if full_node_request.foliage_block_data is not None:
|
|
574
580
|
message_data = [
|
|
@@ -607,7 +613,7 @@ class FarmerAPI:
|
|
|
607
613
|
|
|
608
614
|
return make_msg(ProtocolMessageTypes.signed_values, signed_values)
|
|
609
615
|
|
|
610
|
-
@
|
|
616
|
+
@metadata.request(peer_required=True)
|
|
611
617
|
async def farming_info(self, request: farmer_protocol.FarmingInfo, peer: WSChiaConnection) -> None:
|
|
612
618
|
self.farmer.state_changed(
|
|
613
619
|
"new_farming_info",
|
|
@@ -625,35 +631,35 @@ class FarmerAPI:
|
|
|
625
631
|
},
|
|
626
632
|
)
|
|
627
633
|
|
|
628
|
-
@
|
|
634
|
+
@metadata.request(peer_required=True)
|
|
629
635
|
async def respond_plots(self, _: harvester_protocol.RespondPlots, peer: WSChiaConnection) -> None:
|
|
630
636
|
self.farmer.log.warning(f"Respond plots came too late from: {peer.get_peer_logging()}")
|
|
631
637
|
|
|
632
|
-
@
|
|
638
|
+
@metadata.request(peer_required=True)
|
|
633
639
|
async def plot_sync_start(self, message: PlotSyncStart, peer: WSChiaConnection) -> None:
|
|
634
640
|
await self.farmer.plot_sync_receivers[peer.peer_node_id].sync_started(message)
|
|
635
641
|
|
|
636
|
-
@
|
|
642
|
+
@metadata.request(peer_required=True)
|
|
637
643
|
async def plot_sync_loaded(self, message: PlotSyncPlotList, peer: WSChiaConnection) -> None:
|
|
638
644
|
await self.farmer.plot_sync_receivers[peer.peer_node_id].process_loaded(message)
|
|
639
645
|
|
|
640
|
-
@
|
|
646
|
+
@metadata.request(peer_required=True)
|
|
641
647
|
async def plot_sync_removed(self, message: PlotSyncPathList, peer: WSChiaConnection) -> None:
|
|
642
648
|
await self.farmer.plot_sync_receivers[peer.peer_node_id].process_removed(message)
|
|
643
649
|
|
|
644
|
-
@
|
|
650
|
+
@metadata.request(peer_required=True)
|
|
645
651
|
async def plot_sync_invalid(self, message: PlotSyncPathList, peer: WSChiaConnection) -> None:
|
|
646
652
|
await self.farmer.plot_sync_receivers[peer.peer_node_id].process_invalid(message)
|
|
647
653
|
|
|
648
|
-
@
|
|
654
|
+
@metadata.request(peer_required=True)
|
|
649
655
|
async def plot_sync_keys_missing(self, message: PlotSyncPathList, peer: WSChiaConnection) -> None:
|
|
650
656
|
await self.farmer.plot_sync_receivers[peer.peer_node_id].process_keys_missing(message)
|
|
651
657
|
|
|
652
|
-
@
|
|
658
|
+
@metadata.request(peer_required=True)
|
|
653
659
|
async def plot_sync_duplicates(self, message: PlotSyncPathList, peer: WSChiaConnection) -> None:
|
|
654
660
|
await self.farmer.plot_sync_receivers[peer.peer_node_id].process_duplicates(message)
|
|
655
661
|
|
|
656
|
-
@
|
|
662
|
+
@metadata.request(peer_required=True)
|
|
657
663
|
async def plot_sync_done(self, message: PlotSyncDone, peer: WSChiaConnection) -> None:
|
|
658
664
|
await self.farmer.plot_sync_receivers[peer.peer_node_id].sync_done(message)
|
|
659
665
|
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional
|
|
7
7
|
|
|
8
8
|
import aiofiles
|
|
9
9
|
|
|
@@ -20,7 +20,7 @@ log = logging.getLogger(__name__)
|
|
|
20
20
|
@streamable
|
|
21
21
|
@dataclass(frozen=True)
|
|
22
22
|
class SesCache(Streamable):
|
|
23
|
-
content:
|
|
23
|
+
content: list[tuple[uint32, bytes]]
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class BlockHeightMap:
|
|
@@ -38,7 +38,7 @@ class BlockHeightMap:
|
|
|
38
38
|
# All sub-epoch summaries that have been included in the blockchain from the beginning until and including the peak
|
|
39
39
|
# (height_included, SubEpochSummary). Note: ONLY for the blocks in the path to the peak
|
|
40
40
|
# The value is a serialized SubEpochSummary object
|
|
41
|
-
__sub_epoch_summaries:
|
|
41
|
+
__sub_epoch_summaries: dict[uint32, bytes]
|
|
42
42
|
|
|
43
43
|
# count how many blocks have been added since the cache was last written to
|
|
44
44
|
# disk
|
|
@@ -124,7 +124,7 @@ class BlockHeightMap:
|
|
|
124
124
|
|
|
125
125
|
log.info(
|
|
126
126
|
f"Loaded sub-epoch-summaries: {len(self.__sub_epoch_summaries)} "
|
|
127
|
-
f"height-to-hash: {len(self.__height_to_hash)//32}"
|
|
127
|
+
f"height-to-hash: {len(self.__height_to_hash) // 32}"
|
|
128
128
|
)
|
|
129
129
|
|
|
130
130
|
# prepopulate the height -> hash mapping
|
|
@@ -194,7 +194,7 @@ class BlockHeightMap:
|
|
|
194
194
|
async with self.db.reader_no_transaction() as conn:
|
|
195
195
|
async with conn.execute(query, (window_end, height)) as cursor:
|
|
196
196
|
# maps block-hash -> (height, prev-hash, sub-epoch-summary)
|
|
197
|
-
ordered:
|
|
197
|
+
ordered: dict[bytes32, tuple[uint32, bytes32, Optional[bytes]]] = {}
|
|
198
198
|
|
|
199
199
|
for r in await cursor.fetchall():
|
|
200
200
|
ordered[r[0]] = (r[2], r[1], r[3])
|
|
@@ -267,5 +267,5 @@ class BlockHeightMap:
|
|
|
267
267
|
def get_ses(self, height: uint32) -> SubEpochSummary:
|
|
268
268
|
return SubEpochSummary.from_bytes(self.__sub_epoch_summaries[height])
|
|
269
269
|
|
|
270
|
-
def get_ses_heights(self) ->
|
|
270
|
+
def get_ses_heights(self) -> list[uint32]:
|
|
271
271
|
return sorted(self.__sub_epoch_summaries.keys())
|