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
chia/util/service_groups.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Generator, Iterable, KeysView
|
|
4
4
|
|
|
5
|
-
SERVICES_FOR_GROUP:
|
|
5
|
+
SERVICES_FOR_GROUP: dict[str, list[str]] = {
|
|
6
6
|
"all": [
|
|
7
7
|
"chia_harvester",
|
|
8
8
|
"chia_timelord_launcher",
|
chia/util/setproctitle.py
CHANGED
chia/util/significant_bits.py
CHANGED
chia/util/ssl_check.py
CHANGED
|
@@ -5,7 +5,7 @@ import stat
|
|
|
5
5
|
import sys
|
|
6
6
|
from logging import Logger
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import
|
|
8
|
+
from typing import Optional
|
|
9
9
|
|
|
10
10
|
from chia.util.config import load_config, traverse_dict
|
|
11
11
|
from chia.util.permissions import octal_mode_string, verify_file_permissions
|
|
@@ -60,15 +60,15 @@ KEY_CONFIG_KEY_PATHS = [
|
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
# Set to keep track of which files we've already warned about
|
|
63
|
-
warned_ssl_files:
|
|
63
|
+
warned_ssl_files: set[Path] = set()
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def get_all_ssl_file_paths(root_path: Path) ->
|
|
66
|
+
def get_all_ssl_file_paths(root_path: Path) -> tuple[list[Path], list[Path]]:
|
|
67
67
|
"""Lookup config values and append to a list of files whose permissions we need to check"""
|
|
68
68
|
from chia.ssl.create_ssl import get_mozilla_ca_crt
|
|
69
69
|
|
|
70
|
-
all_certs:
|
|
71
|
-
all_keys:
|
|
70
|
+
all_certs: list[Path] = []
|
|
71
|
+
all_keys: list[Path] = []
|
|
72
72
|
|
|
73
73
|
try:
|
|
74
74
|
config = load_config(root_path, "config.yaml", exit_on_error=False, fill_missing_services=True)
|
|
@@ -99,16 +99,16 @@ def get_ssl_perm_warning(path: Path, actual_mode: int, expected_mode: int) -> st
|
|
|
99
99
|
|
|
100
100
|
|
|
101
101
|
def verify_ssl_certs_and_keys(
|
|
102
|
-
cert_paths:
|
|
103
|
-
) ->
|
|
102
|
+
cert_paths: list[Path], key_paths: list[Path], log: Optional[Logger] = None
|
|
103
|
+
) -> list[tuple[Path, int, int]]:
|
|
104
104
|
"""Check that file permissions are properly set for the provided SSL cert and key files"""
|
|
105
105
|
if sys.platform == "win32" or sys.platform == "cygwin":
|
|
106
106
|
# TODO: ACLs for SSL certs/keys on Windows
|
|
107
107
|
return []
|
|
108
108
|
|
|
109
|
-
invalid_files_and_modes:
|
|
109
|
+
invalid_files_and_modes: list[tuple[Path, int, int]] = []
|
|
110
110
|
|
|
111
|
-
def verify_paths(paths:
|
|
111
|
+
def verify_paths(paths: list[Path], restrict_mask: int, expected_permissions: int) -> None:
|
|
112
112
|
nonlocal invalid_files_and_modes
|
|
113
113
|
for path in paths:
|
|
114
114
|
try:
|
|
@@ -157,7 +157,7 @@ def check_ssl(root_path: Path) -> None:
|
|
|
157
157
|
print("\n".join(lines), file=sys.stderr)
|
|
158
158
|
|
|
159
159
|
|
|
160
|
-
def check_and_fix_permissions_for_ssl_file(file: Path, mask: int, updated_mode: int) ->
|
|
160
|
+
def check_and_fix_permissions_for_ssl_file(file: Path, mask: int, updated_mode: int) -> tuple[bool, bool]:
|
|
161
161
|
"""Check file permissions and attempt to fix them if found to be too open"""
|
|
162
162
|
if sys.platform == "win32" or sys.platform == "cygwin":
|
|
163
163
|
# TODO: ACLs for SSL certs/keys on Windows
|
|
@@ -168,7 +168,7 @@ def check_and_fix_permissions_for_ssl_file(file: Path, mask: int, updated_mode:
|
|
|
168
168
|
|
|
169
169
|
# Check that the file permissions are not too permissive
|
|
170
170
|
try:
|
|
171
|
-
(good_perms,
|
|
171
|
+
(good_perms, _mode) = verify_file_permissions(file, mask)
|
|
172
172
|
if not good_perms:
|
|
173
173
|
valid = False
|
|
174
174
|
print(
|
chia/util/streamable.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
import dataclasses
|
|
@@ -5,30 +7,16 @@ import io
|
|
|
5
7
|
import os
|
|
6
8
|
import pprint
|
|
7
9
|
import traceback
|
|
10
|
+
from collections.abc import Collection
|
|
8
11
|
from enum import Enum
|
|
9
|
-
from typing import
|
|
10
|
-
TYPE_CHECKING,
|
|
11
|
-
Any,
|
|
12
|
-
BinaryIO,
|
|
13
|
-
Callable,
|
|
14
|
-
ClassVar,
|
|
15
|
-
Collection,
|
|
16
|
-
Dict,
|
|
17
|
-
List,
|
|
18
|
-
Optional,
|
|
19
|
-
Tuple,
|
|
20
|
-
Type,
|
|
21
|
-
TypeVar,
|
|
22
|
-
Union,
|
|
23
|
-
get_type_hints,
|
|
24
|
-
)
|
|
12
|
+
from typing import TYPE_CHECKING, Any, BinaryIO, Callable, ClassVar, Optional, TypeVar, Union, get_type_hints
|
|
25
13
|
|
|
14
|
+
from chia_rs.sized_bytes import bytes32
|
|
15
|
+
from chia_rs.sized_ints import uint16, uint32, uint64
|
|
26
16
|
from typing_extensions import Literal, get_args, get_origin
|
|
27
17
|
|
|
28
|
-
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
29
18
|
from chia.util.byte_types import hexstr_to_bytes
|
|
30
19
|
from chia.util.hash import std_hash
|
|
31
|
-
from chia.util.ints import uint16, uint32, uint64
|
|
32
20
|
|
|
33
21
|
if TYPE_CHECKING:
|
|
34
22
|
from _typeshed import DataclassInstance
|
|
@@ -45,7 +33,7 @@ class UnsupportedType(StreamableError):
|
|
|
45
33
|
|
|
46
34
|
|
|
47
35
|
class DefinitionError(StreamableError):
|
|
48
|
-
def __init__(self, message: str, cls:
|
|
36
|
+
def __init__(self, message: str, cls: type[object]):
|
|
49
37
|
super().__init__(
|
|
50
38
|
f"{message} Correct usage is:\n\n"
|
|
51
39
|
f"@streamable\n@dataclass(frozen=True)\nclass {cls.__name__}(Streamable):\n ..."
|
|
@@ -53,7 +41,7 @@ class DefinitionError(StreamableError):
|
|
|
53
41
|
|
|
54
42
|
|
|
55
43
|
class ParameterMissingError(StreamableError):
|
|
56
|
-
def __init__(self, cls: type, missing:
|
|
44
|
+
def __init__(self, cls: type, missing: list[str]):
|
|
57
45
|
super().__init__(
|
|
58
46
|
f"{len(missing)} field{'s' if len(missing) != 1 else ''} missing for {cls.__name__}: {', '.join(missing)}"
|
|
59
47
|
)
|
|
@@ -91,7 +79,7 @@ ConvertFunctionType = Callable[[object], object]
|
|
|
91
79
|
@dataclasses.dataclass(frozen=True)
|
|
92
80
|
class Field:
|
|
93
81
|
name: str
|
|
94
|
-
type:
|
|
82
|
+
type: type[object]
|
|
95
83
|
has_default: bool
|
|
96
84
|
stream_function: StreamFunctionType
|
|
97
85
|
parse_function: ParseFunctionType
|
|
@@ -99,10 +87,10 @@ class Field:
|
|
|
99
87
|
post_init_function: ConvertFunctionType
|
|
100
88
|
|
|
101
89
|
|
|
102
|
-
StreamableFields =
|
|
90
|
+
StreamableFields = tuple[Field, ...]
|
|
103
91
|
|
|
104
92
|
|
|
105
|
-
def create_fields(cls:
|
|
93
|
+
def create_fields(cls: type[DataclassInstance]) -> StreamableFields:
|
|
106
94
|
hints = get_type_hints(cls)
|
|
107
95
|
fields = []
|
|
108
96
|
for field in dataclasses.fields(cls):
|
|
@@ -124,7 +112,7 @@ def create_fields(cls: Type[DataclassInstance]) -> StreamableFields:
|
|
|
124
112
|
|
|
125
113
|
|
|
126
114
|
def is_type_List(f_type: object) -> bool:
|
|
127
|
-
return get_origin(f_type)
|
|
115
|
+
return get_origin(f_type) is list or f_type is list
|
|
128
116
|
|
|
129
117
|
|
|
130
118
|
def is_type_SpecificOptional(f_type: object) -> bool:
|
|
@@ -135,7 +123,7 @@ def is_type_SpecificOptional(f_type: object) -> bool:
|
|
|
135
123
|
|
|
136
124
|
|
|
137
125
|
def is_type_Tuple(f_type: object) -> bool:
|
|
138
|
-
return get_origin(f_type)
|
|
126
|
+
return get_origin(f_type) is tuple or f_type is tuple
|
|
139
127
|
|
|
140
128
|
|
|
141
129
|
def convert_optional(convert_func: ConvertFunctionType, item: Any) -> Any:
|
|
@@ -144,7 +132,7 @@ def convert_optional(convert_func: ConvertFunctionType, item: Any) -> Any:
|
|
|
144
132
|
return convert_func(item)
|
|
145
133
|
|
|
146
134
|
|
|
147
|
-
def convert_tuple(convert_funcs:
|
|
135
|
+
def convert_tuple(convert_funcs: list[ConvertFunctionType], items: Collection[Any]) -> tuple[Any, ...]:
|
|
148
136
|
if not isinstance(items, (list, tuple)):
|
|
149
137
|
raise InvalidTypeError(tuple, type(items))
|
|
150
138
|
if len(items) != len(convert_funcs):
|
|
@@ -152,7 +140,7 @@ def convert_tuple(convert_funcs: List[ConvertFunctionType], items: Collection[An
|
|
|
152
140
|
return tuple(convert_func(item) for convert_func, item in zip(convert_funcs, items))
|
|
153
141
|
|
|
154
142
|
|
|
155
|
-
def convert_list(convert_func: ConvertFunctionType, items:
|
|
143
|
+
def convert_list(convert_func: ConvertFunctionType, items: list[Any]) -> list[Any]:
|
|
156
144
|
if not isinstance(items, list):
|
|
157
145
|
raise InvalidTypeError(list, type(items))
|
|
158
146
|
return [convert_func(item) for item in items]
|
|
@@ -167,7 +155,7 @@ def convert_hex_string(item: str) -> bytes:
|
|
|
167
155
|
raise ConversionError(item, bytes, e) from e
|
|
168
156
|
|
|
169
157
|
|
|
170
|
-
def convert_byte_type(f_type:
|
|
158
|
+
def convert_byte_type(f_type: type[Any], item: Any) -> Any:
|
|
171
159
|
if isinstance(item, f_type):
|
|
172
160
|
return item
|
|
173
161
|
if not isinstance(item, bytes):
|
|
@@ -178,7 +166,7 @@ def convert_byte_type(f_type: Type[Any], item: Any) -> Any:
|
|
|
178
166
|
raise ConversionError(item, f_type, e) from e
|
|
179
167
|
|
|
180
168
|
|
|
181
|
-
def convert_primitive(f_type:
|
|
169
|
+
def convert_primitive(f_type: type[Any], item: Any) -> Any:
|
|
182
170
|
if isinstance(item, f_type):
|
|
183
171
|
return item
|
|
184
172
|
try:
|
|
@@ -187,7 +175,7 @@ def convert_primitive(f_type: Type[Any], item: Any) -> Any:
|
|
|
187
175
|
raise ConversionError(item, f_type, e) from e
|
|
188
176
|
|
|
189
177
|
|
|
190
|
-
def streamable_from_dict(klass:
|
|
178
|
+
def streamable_from_dict(klass: type[_T_Streamable], item: Any) -> _T_Streamable:
|
|
191
179
|
"""
|
|
192
180
|
Converts a dictionary based on a dataclass, into an instance of that dataclass.
|
|
193
181
|
Recursively goes through lists, optionals, and dictionaries.
|
|
@@ -208,7 +196,7 @@ def streamable_from_dict(klass: Type[_T_Streamable], item: Any) -> _T_Streamable
|
|
|
208
196
|
|
|
209
197
|
|
|
210
198
|
def function_to_convert_one_item(
|
|
211
|
-
f_type:
|
|
199
|
+
f_type: type[Any], json_parser: Optional[Callable[[object], Streamable]] = None
|
|
212
200
|
) -> ConvertFunctionType:
|
|
213
201
|
if is_type_SpecificOptional(f_type):
|
|
214
202
|
convert_inner_func = function_to_convert_one_item(get_args(f_type)[0], json_parser)
|
|
@@ -228,7 +216,7 @@ def function_to_convert_one_item(
|
|
|
228
216
|
elif hasattr(f_type, "from_json_dict"):
|
|
229
217
|
if json_parser is None:
|
|
230
218
|
json_parser = f_type.from_json_dict
|
|
231
|
-
return
|
|
219
|
+
return json_parser
|
|
232
220
|
elif issubclass(f_type, bytes):
|
|
233
221
|
# Type is bytes, data is a hex string or bytes
|
|
234
222
|
return lambda item: convert_byte_type(f_type, item)
|
|
@@ -237,7 +225,7 @@ def function_to_convert_one_item(
|
|
|
237
225
|
return lambda item: convert_primitive(f_type, item)
|
|
238
226
|
|
|
239
227
|
|
|
240
|
-
def post_init_process_item(f_type:
|
|
228
|
+
def post_init_process_item(f_type: type[Any], item: Any) -> object:
|
|
241
229
|
if not isinstance(item, f_type):
|
|
242
230
|
try:
|
|
243
231
|
item = f_type(item)
|
|
@@ -255,7 +243,7 @@ def post_init_process_item(f_type: Type[Any], item: Any) -> object:
|
|
|
255
243
|
return item
|
|
256
244
|
|
|
257
245
|
|
|
258
|
-
def function_to_post_init_process_one_item(f_type:
|
|
246
|
+
def function_to_post_init_process_one_item(f_type: type[object]) -> ConvertFunctionType:
|
|
259
247
|
if is_type_SpecificOptional(f_type):
|
|
260
248
|
process_inner_func = function_to_post_init_process_one_item(get_args(f_type)[0])
|
|
261
249
|
return lambda item: convert_optional(process_inner_func, item)
|
|
@@ -309,7 +297,7 @@ def recurse_jsonify(
|
|
|
309
297
|
elif d is None or type(d) is str:
|
|
310
298
|
return d
|
|
311
299
|
elif hasattr(d, "to_json_dict"):
|
|
312
|
-
ret: Union[
|
|
300
|
+
ret: Union[list[Any], dict[str, Any], str, int, None] = d.to_json_dict()
|
|
313
301
|
return ret
|
|
314
302
|
raise UnsupportedType(f"failed to jsonify {d} (type: {type(d)})")
|
|
315
303
|
|
|
@@ -346,7 +334,7 @@ def parse_optional(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> Option
|
|
|
346
334
|
raise ValueError("Optional must be 0 or 1")
|
|
347
335
|
|
|
348
336
|
|
|
349
|
-
def parse_rust(f: BinaryIO, f_type:
|
|
337
|
+
def parse_rust(f: BinaryIO, f_type: type[Any]) -> Any:
|
|
350
338
|
assert isinstance(f, io.BytesIO)
|
|
351
339
|
buf = f.getbuffer()
|
|
352
340
|
ret, advance = f_type.parse_rust(buf[f.tell() :])
|
|
@@ -361,8 +349,8 @@ def parse_bytes(f: BinaryIO) -> bytes:
|
|
|
361
349
|
return bytes_read
|
|
362
350
|
|
|
363
351
|
|
|
364
|
-
def parse_list(f: BinaryIO, parse_inner_type_f: ParseFunctionType) ->
|
|
365
|
-
full_list:
|
|
352
|
+
def parse_list(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> list[object]:
|
|
353
|
+
full_list: list[object] = []
|
|
366
354
|
# wjb assert inner_type != get_args(List)[0]
|
|
367
355
|
list_size = parse_uint32(f)
|
|
368
356
|
for list_index in range(list_size):
|
|
@@ -370,8 +358,8 @@ def parse_list(f: BinaryIO, parse_inner_type_f: ParseFunctionType) -> List[objec
|
|
|
370
358
|
return full_list
|
|
371
359
|
|
|
372
360
|
|
|
373
|
-
def parse_tuple(f: BinaryIO, list_parse_inner_type_f:
|
|
374
|
-
full_list:
|
|
361
|
+
def parse_tuple(f: BinaryIO, list_parse_inner_type_f: list[ParseFunctionType]) -> tuple[object, ...]:
|
|
362
|
+
full_list: list[object] = []
|
|
375
363
|
for parse_f in list_parse_inner_type_f:
|
|
376
364
|
full_list.append(parse_f(f))
|
|
377
365
|
return tuple(full_list)
|
|
@@ -384,12 +372,12 @@ def parse_str(f: BinaryIO) -> str:
|
|
|
384
372
|
return bytes.decode(str_read_bytes, "utf-8")
|
|
385
373
|
|
|
386
374
|
|
|
387
|
-
def function_to_parse_one_item(f_type:
|
|
375
|
+
def function_to_parse_one_item(f_type: type[Any]) -> ParseFunctionType:
|
|
388
376
|
"""
|
|
389
377
|
This function returns a function taking one argument `f: BinaryIO` that parses
|
|
390
378
|
and returns a value of the given type.
|
|
391
379
|
"""
|
|
392
|
-
inner_type:
|
|
380
|
+
inner_type: type[Any]
|
|
393
381
|
if f_type is bool:
|
|
394
382
|
return parse_bool
|
|
395
383
|
if is_type_SpecificOptional(f_type):
|
|
@@ -401,7 +389,7 @@ def function_to_parse_one_item(f_type: Type[Any]) -> ParseFunctionType:
|
|
|
401
389
|
if hasattr(f_type, "parse"):
|
|
402
390
|
# Ignoring for now as the proper solution isn't obvious
|
|
403
391
|
return f_type.parse # type: ignore[no-any-return]
|
|
404
|
-
if f_type
|
|
392
|
+
if f_type is bytes:
|
|
405
393
|
return parse_bytes
|
|
406
394
|
if is_type_List(f_type):
|
|
407
395
|
inner_type = get_args(f_type)[0]
|
|
@@ -435,7 +423,7 @@ def stream_list(stream_inner_type_func: StreamFunctionType, item: Any, f: Binary
|
|
|
435
423
|
stream_inner_type_func(element, f)
|
|
436
424
|
|
|
437
425
|
|
|
438
|
-
def stream_tuple(stream_inner_type_funcs:
|
|
426
|
+
def stream_tuple(stream_inner_type_funcs: list[StreamFunctionType], item: Any, f: BinaryIO) -> None:
|
|
439
427
|
assert len(stream_inner_type_funcs) == len(item)
|
|
440
428
|
for i in range(len(item)):
|
|
441
429
|
stream_inner_type_funcs[i](item[i], f)
|
|
@@ -459,13 +447,13 @@ def stream_byte_convertible(item: object, f: BinaryIO) -> None:
|
|
|
459
447
|
f.write(getattr(item, "__bytes__")())
|
|
460
448
|
|
|
461
449
|
|
|
462
|
-
def function_to_stream_one_item(f_type:
|
|
463
|
-
inner_type:
|
|
450
|
+
def function_to_stream_one_item(f_type: type[Any]) -> StreamFunctionType:
|
|
451
|
+
inner_type: type[Any]
|
|
464
452
|
if is_type_SpecificOptional(f_type):
|
|
465
453
|
inner_type = get_args(f_type)[0]
|
|
466
454
|
stream_inner_type_func = function_to_stream_one_item(inner_type)
|
|
467
455
|
return lambda item, f: stream_optional(stream_inner_type_func, item, f)
|
|
468
|
-
elif f_type
|
|
456
|
+
elif f_type is bytes:
|
|
469
457
|
return stream_bytes
|
|
470
458
|
elif hasattr(f_type, "stream"):
|
|
471
459
|
return stream_streamable
|
|
@@ -489,7 +477,7 @@ def function_to_stream_one_item(f_type: Type[Any]) -> StreamFunctionType:
|
|
|
489
477
|
raise UnsupportedType(f"can't stream {f_type}")
|
|
490
478
|
|
|
491
479
|
|
|
492
|
-
def streamable(cls:
|
|
480
|
+
def streamable(cls: type[_T_Streamable]) -> type[_T_Streamable]:
|
|
493
481
|
"""
|
|
494
482
|
This decorator forces correct streamable protocol syntax/usage and populates the caches for types hints and
|
|
495
483
|
(de)serialization methods for all members of the class. The correct usage is:
|
|
@@ -528,7 +516,7 @@ def streamable(cls: Type[_T_Streamable]) -> Type[_T_Streamable]:
|
|
|
528
516
|
class Streamable:
|
|
529
517
|
"""
|
|
530
518
|
This class defines a simple serialization format, and adds methods to parse from/to bytes and json. It also
|
|
531
|
-
validates and parses all fields at construction in
|
|
519
|
+
validates and parses all fields at construction in `__post_init__` to make sure all fields have the correct type
|
|
532
520
|
and can be streamed/parsed properly.
|
|
533
521
|
|
|
534
522
|
The available primitives are:
|
|
@@ -542,8 +530,8 @@ class Streamable:
|
|
|
542
530
|
|
|
543
531
|
An item is one of:
|
|
544
532
|
* primitive
|
|
545
|
-
*
|
|
546
|
-
*
|
|
533
|
+
* tuple[item1, .. itemx]
|
|
534
|
+
* list[item1, .. itemx]
|
|
547
535
|
* Optional[item]
|
|
548
536
|
* Custom item
|
|
549
537
|
|
|
@@ -587,7 +575,7 @@ class Streamable:
|
|
|
587
575
|
raise
|
|
588
576
|
|
|
589
577
|
@classmethod
|
|
590
|
-
def parse(cls:
|
|
578
|
+
def parse(cls: type[_T_Streamable], f: BinaryIO) -> _T_Streamable:
|
|
591
579
|
# Create the object without calling __init__() to avoid unnecessary post-init checks in strictdataclass
|
|
592
580
|
obj: _T_Streamable = object.__new__(cls)
|
|
593
581
|
for field in cls._streamable_fields:
|
|
@@ -602,7 +590,7 @@ class Streamable:
|
|
|
602
590
|
return std_hash(bytes(self), skip_bytes_conversion=True)
|
|
603
591
|
|
|
604
592
|
@classmethod
|
|
605
|
-
def from_bytes(cls:
|
|
593
|
+
def from_bytes(cls: type[_T_Streamable], blob: bytes) -> _T_Streamable:
|
|
606
594
|
f = io.BytesIO(blob)
|
|
607
595
|
parsed = cls.parse(f)
|
|
608
596
|
assert f.read() == b""
|
|
@@ -624,12 +612,12 @@ class Streamable:
|
|
|
624
612
|
def __repr__(self: Any) -> str:
|
|
625
613
|
return pp.pformat(recurse_jsonify(self))
|
|
626
614
|
|
|
627
|
-
def to_json_dict(self) ->
|
|
628
|
-
ret:
|
|
615
|
+
def to_json_dict(self) -> dict[str, Any]:
|
|
616
|
+
ret: dict[str, Any] = recurse_jsonify(self)
|
|
629
617
|
return ret
|
|
630
618
|
|
|
631
619
|
@classmethod
|
|
632
|
-
def from_json_dict(cls:
|
|
620
|
+
def from_json_dict(cls: type[_T_Streamable], json_dict: dict[str, Any]) -> _T_Streamable:
|
|
633
621
|
return streamable_from_dict(cls, json_dict)
|
|
634
622
|
|
|
635
623
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# TODO: this should not exist, it is a bad task group that doesn't require
|
|
2
|
+
# any responsibility of the requestor.
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import asyncio
|
|
7
|
+
import dataclasses
|
|
8
|
+
import logging
|
|
9
|
+
import typing
|
|
10
|
+
|
|
11
|
+
T = typing.TypeVar("T")
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclasses.dataclass(frozen=True)
|
|
17
|
+
class _TaskInfo:
|
|
18
|
+
task: asyncio.Task[object]
|
|
19
|
+
# retained for potential debugging use
|
|
20
|
+
known_unreferenced: bool
|
|
21
|
+
|
|
22
|
+
def __str__(self) -> str:
|
|
23
|
+
return self.task.get_name()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclasses.dataclass
|
|
27
|
+
class _TaskReferencer:
|
|
28
|
+
"""Holds strong references to tasks until they are done. This compensates for
|
|
29
|
+
asyncio holding only weak references. This should be replaced by patterns using
|
|
30
|
+
task groups such as from anyio.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
tasks: dict[asyncio.Task[object], _TaskInfo] = dataclasses.field(default_factory=dict)
|
|
34
|
+
|
|
35
|
+
def create_task(
|
|
36
|
+
self,
|
|
37
|
+
coroutine: typing.Coroutine[object, object, T],
|
|
38
|
+
*,
|
|
39
|
+
name: typing.Optional[str] = None,
|
|
40
|
+
known_unreferenced: bool = False,
|
|
41
|
+
) -> asyncio.Task[T]:
|
|
42
|
+
task = asyncio.create_task(coro=coroutine, name=name) # noqa: TID251
|
|
43
|
+
task.add_done_callback(self._task_done)
|
|
44
|
+
|
|
45
|
+
self.tasks[task] = _TaskInfo(task=task, known_unreferenced=known_unreferenced)
|
|
46
|
+
|
|
47
|
+
return task
|
|
48
|
+
|
|
49
|
+
def _task_done(self, task: asyncio.Task[object]) -> None:
|
|
50
|
+
# TODO: consider collecting results and logging errors
|
|
51
|
+
try:
|
|
52
|
+
del self.tasks[task]
|
|
53
|
+
except KeyError:
|
|
54
|
+
logger.warning("Task not found in task referencer: %s", task)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
_global_task_referencer = _TaskReferencer()
|
|
58
|
+
|
|
59
|
+
create_referenced_task = _global_task_referencer.create_task
|
chia/util/task_timing.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
import asyncio
|
|
@@ -6,8 +8,9 @@ import inspect
|
|
|
6
8
|
import os
|
|
7
9
|
import sys
|
|
8
10
|
import time
|
|
11
|
+
from collections.abc import Iterator
|
|
9
12
|
from types import FrameType
|
|
10
|
-
from typing import Any
|
|
13
|
+
from typing import Any
|
|
11
14
|
|
|
12
15
|
# This is a development utility that instruments tasks (coroutines) and records
|
|
13
16
|
# wall-clock time they spend in various functions. Since it relies on
|
|
@@ -15,7 +18,12 @@ from typing import Any, Dict, Iterator, List
|
|
|
15
18
|
|
|
16
19
|
# to enable this instrumentation, set one of the environment variables:
|
|
17
20
|
|
|
18
|
-
#
|
|
21
|
+
# CHIA_INSTRUMENT_DATA_LAYER=1
|
|
22
|
+
# CHIA_INSTRUMENT_FARMER=1
|
|
23
|
+
# CHIA_INSTRUMENT_FULL_NODE=1
|
|
24
|
+
# CHIA_INSTRUMENT_HARVESTER=1
|
|
25
|
+
# CHIA_INSTRUMENT_INTRODUCER=1
|
|
26
|
+
# CHIA_INSTRUMENT_TIMELORD=1
|
|
19
27
|
# CHIA_INSTRUMENT_WALLET=1
|
|
20
28
|
|
|
21
29
|
# Before starting the daemon.
|
|
@@ -49,7 +57,7 @@ class CallInfo:
|
|
|
49
57
|
|
|
50
58
|
|
|
51
59
|
class TaskInfo:
|
|
52
|
-
stack:
|
|
60
|
+
stack: dict[FrameType, FrameInfo]
|
|
53
61
|
stack_pos: int
|
|
54
62
|
|
|
55
63
|
def __init__(self) -> None:
|
|
@@ -65,7 +73,7 @@ class FunctionInfo:
|
|
|
65
73
|
file: str
|
|
66
74
|
num_calls: int
|
|
67
75
|
duration: float
|
|
68
|
-
callers:
|
|
76
|
+
callers: dict[str, CallInfo]
|
|
69
77
|
fun_id: int
|
|
70
78
|
|
|
71
79
|
def __init__(self, name: str, file: str) -> None:
|
|
@@ -81,9 +89,9 @@ class FunctionInfo:
|
|
|
81
89
|
|
|
82
90
|
|
|
83
91
|
# maps tasks to call-treea
|
|
84
|
-
g_function_infos:
|
|
92
|
+
g_function_infos: dict[str, dict[str, FunctionInfo]] = {}
|
|
85
93
|
|
|
86
|
-
g_tasks:
|
|
94
|
+
g_tasks: dict[asyncio.Task[Any], TaskInfo] = {}
|
|
87
95
|
|
|
88
96
|
g_cwd = os.getcwd() + "/"
|
|
89
97
|
|
|
@@ -125,7 +133,7 @@ g_cwd = os.getcwd() + "/"
|
|
|
125
133
|
def get_stack(frame: FrameType) -> str:
|
|
126
134
|
ret = ""
|
|
127
135
|
code = frame.f_code
|
|
128
|
-
while code.co_flags & inspect.CO_COROUTINE:
|
|
136
|
+
while code.co_flags & inspect.CO_COROUTINE:
|
|
129
137
|
ret = f"/{code.co_name}{ret}"
|
|
130
138
|
if frame.f_back is None:
|
|
131
139
|
break
|
|
@@ -155,11 +163,11 @@ def get_file(frame: FrameType) -> str:
|
|
|
155
163
|
|
|
156
164
|
|
|
157
165
|
def trace_fun(frame: FrameType, event: str, arg: Any) -> None:
|
|
158
|
-
if event in
|
|
166
|
+
if event in {"c_call", "c_return", "c_exception"}:
|
|
159
167
|
return
|
|
160
168
|
|
|
161
169
|
# we only care about instrumenting co-routines
|
|
162
|
-
if (frame.f_code.co_flags & inspect.CO_COROUTINE) == 0:
|
|
170
|
+
if (frame.f_code.co_flags & inspect.CO_COROUTINE) == 0:
|
|
163
171
|
# with open("instrumentation.log", "a") as f:
|
|
164
172
|
# f.write(f"[1] {event} {get_fun(frame)}\n")
|
|
165
173
|
return
|
|
@@ -168,9 +176,6 @@ def trace_fun(frame: FrameType, event: str, arg: Any) -> None:
|
|
|
168
176
|
if task is None:
|
|
169
177
|
return
|
|
170
178
|
|
|
171
|
-
global g_tasks
|
|
172
|
-
global g_function_infos
|
|
173
|
-
|
|
174
179
|
ti = g_tasks.get(task)
|
|
175
180
|
if ti is None:
|
|
176
181
|
ti = TaskInfo()
|
|
@@ -245,7 +250,7 @@ def start_task_instrumentation() -> None:
|
|
|
245
250
|
|
|
246
251
|
def color(pct: float) -> str:
|
|
247
252
|
assert pct >= 0 and pct <= 100
|
|
248
|
-
return f"{int((100
|
|
253
|
+
return f"{int((100. - pct) // 10) + 1}"
|
|
249
254
|
|
|
250
255
|
|
|
251
256
|
def fontcolor(pct: float) -> str:
|
|
@@ -257,7 +262,6 @@ def fontcolor(pct: float) -> str:
|
|
|
257
262
|
|
|
258
263
|
def stop_task_instrumentation(target_dir: str = f"task-profile-{os.getpid()}") -> None:
|
|
259
264
|
sys.setprofile(None)
|
|
260
|
-
global g_function_infos
|
|
261
265
|
|
|
262
266
|
try:
|
|
263
267
|
os.mkdir(target_dir)
|
|
@@ -297,7 +301,7 @@ def stop_task_instrumentation(target_dir: str = f"task-profile-{os.getpid()}") -
|
|
|
297
301
|
f'frame_{fun_info.fun_id} [shape=box, label="{fun_info.name}()\\l'
|
|
298
302
|
f"{fun_info.file}\\l"
|
|
299
303
|
f"{percent:0.2f}%\\n"
|
|
300
|
-
f"{fun_info.duration*1000:0.2f}ms\\n"
|
|
304
|
+
f"{fun_info.duration * 1000:0.2f}ms\\n"
|
|
301
305
|
f'{fun_info.num_calls}x\\n",'
|
|
302
306
|
f"fillcolor={color(percent)}, "
|
|
303
307
|
f"color={color(percent)}, "
|
|
@@ -324,7 +328,7 @@ def stop_task_instrumentation(target_dir: str = f"task-profile-{os.getpid()}") -
|
|
|
324
328
|
f.write(
|
|
325
329
|
f"frame_{caller_info.fun_id} -> frame_{fun_info.fun_id} "
|
|
326
330
|
f'[label="{percent:0.2f}%\\n{ci.calls}x",'
|
|
327
|
-
f"penwidth={0.3+(ci.duration*6/total_duration):0.2f},"
|
|
331
|
+
f"penwidth={0.3 + (ci.duration * 6 / total_duration):0.2f},"
|
|
328
332
|
f"color={color(percent)}]\n"
|
|
329
333
|
)
|
|
330
334
|
f.write("}\n")
|
|
@@ -348,13 +352,13 @@ def maybe_manage_task_instrumentation(enable: bool) -> Iterator[None]:
|
|
|
348
352
|
yield
|
|
349
353
|
|
|
350
354
|
|
|
351
|
-
def main(args:
|
|
355
|
+
def main(args: list[str]) -> int:
|
|
352
356
|
import glob
|
|
353
357
|
import pathlib
|
|
354
358
|
import subprocess
|
|
355
359
|
|
|
356
360
|
profile_dir = pathlib.Path(args[0])
|
|
357
|
-
queue:
|
|
361
|
+
queue: list[subprocess.Popen[bytes]] = []
|
|
358
362
|
for file in glob.glob(str(profile_dir / "*.dot")):
|
|
359
363
|
print(file)
|
|
360
364
|
if os.path.exists(file + ".png"):
|
chia/util/timing.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
# Package: utils
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
5
|
import os
|
|
4
6
|
import sys
|
|
5
7
|
import time
|
|
6
|
-
from
|
|
8
|
+
from collections.abc import Iterator
|
|
9
|
+
from typing import Callable, Optional, overload
|
|
7
10
|
|
|
8
11
|
system_delays = {
|
|
9
12
|
# based on data from https://github.com/Chia-Network/chia-blockchain/pull/13724
|
chia/util/vdf_prover.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Tuple
|
|
4
|
-
|
|
5
3
|
from chiavdf import prove
|
|
6
4
|
|
|
7
5
|
from chia.consensus.constants import ConsensusConstants
|
|
@@ -17,13 +15,14 @@ def get_vdf_info_and_proof(
|
|
|
17
15
|
challenge_hash: bytes32,
|
|
18
16
|
number_iters: uint64,
|
|
19
17
|
normalized_to_identity: bool = False,
|
|
20
|
-
) ->
|
|
18
|
+
) -> tuple[VDFInfo, VDFProof]:
|
|
21
19
|
form_size = ClassgroupElement.get_size()
|
|
22
20
|
result: bytes = prove(
|
|
23
21
|
bytes(challenge_hash),
|
|
24
22
|
vdf_input.data,
|
|
25
23
|
constants.DISCRIMINANT_SIZE_BITS,
|
|
26
24
|
number_iters,
|
|
25
|
+
"",
|
|
27
26
|
)
|
|
28
27
|
|
|
29
28
|
output = ClassgroupElement.create(result[:form_size])
|