chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/timelord/timelord.py
CHANGED
|
@@ -7,11 +7,13 @@ import io
|
|
|
7
7
|
import logging
|
|
8
8
|
import os
|
|
9
9
|
import random
|
|
10
|
+
import tempfile
|
|
10
11
|
import time
|
|
11
12
|
import traceback
|
|
13
|
+
from collections.abc import AsyncIterator
|
|
12
14
|
from concurrent.futures import ThreadPoolExecutor
|
|
13
15
|
from pathlib import Path
|
|
14
|
-
from typing import TYPE_CHECKING, Any,
|
|
16
|
+
from typing import IO, TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
15
17
|
|
|
16
18
|
from chiavdf import create_discriminant, prove
|
|
17
19
|
|
|
@@ -40,6 +42,7 @@ from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
|
|
|
40
42
|
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
41
43
|
from chia.util.ints import uint8, uint16, uint32, uint64, uint128
|
|
42
44
|
from chia.util.streamable import Streamable, streamable
|
|
45
|
+
from chia.util.task_referencer import create_referenced_task
|
|
43
46
|
|
|
44
47
|
log = logging.getLogger(__name__)
|
|
45
48
|
|
|
@@ -52,7 +55,7 @@ class BlueboxProcessData(Streamable):
|
|
|
52
55
|
iters: uint64
|
|
53
56
|
|
|
54
57
|
|
|
55
|
-
def prove_bluebox_slow(payload: bytes) -> bytes:
|
|
58
|
+
def prove_bluebox_slow(payload: bytes, executor_shutdown_tempfile_name: str) -> bytes:
|
|
56
59
|
bluebox_process_data = BlueboxProcessData.from_bytes(payload)
|
|
57
60
|
initial_el = b"\x08" + (b"\x00" * 99)
|
|
58
61
|
return cast(
|
|
@@ -62,10 +65,15 @@ def prove_bluebox_slow(payload: bytes) -> bytes:
|
|
|
62
65
|
initial_el,
|
|
63
66
|
bluebox_process_data.size_bits,
|
|
64
67
|
bluebox_process_data.iters,
|
|
68
|
+
executor_shutdown_tempfile_name,
|
|
65
69
|
),
|
|
66
70
|
)
|
|
67
71
|
|
|
68
72
|
|
|
73
|
+
def _create_shutdown_file() -> IO[bytes]:
|
|
74
|
+
return tempfile.NamedTemporaryFile(prefix="chia_timelord_executor_shutdown_trigger")
|
|
75
|
+
|
|
76
|
+
|
|
69
77
|
class Timelord:
|
|
70
78
|
if TYPE_CHECKING:
|
|
71
79
|
from chia.rpc.rpc_server import RpcServiceProtocol
|
|
@@ -81,50 +89,50 @@ class Timelord:
|
|
|
81
89
|
|
|
82
90
|
return self._server
|
|
83
91
|
|
|
84
|
-
def __init__(self, root_path: Path, config:
|
|
92
|
+
def __init__(self, root_path: Path, config: dict[str, Any], constants: ConsensusConstants) -> None:
|
|
85
93
|
self.config = config
|
|
86
94
|
self.root_path = root_path
|
|
87
95
|
self.constants = constants
|
|
88
96
|
self._shut_down = False
|
|
89
|
-
self.free_clients:
|
|
97
|
+
self.free_clients: list[tuple[str, asyncio.StreamReader, asyncio.StreamWriter]] = []
|
|
90
98
|
self.ip_whitelist = self.config["vdf_clients"]["ip"]
|
|
91
99
|
self._server: Optional[ChiaServer] = None
|
|
92
|
-
self.chain_type_to_stream:
|
|
93
|
-
self.chain_start_time:
|
|
100
|
+
self.chain_type_to_stream: dict[Chain, tuple[str, asyncio.StreamReader, asyncio.StreamWriter]] = {}
|
|
101
|
+
self.chain_start_time: dict[Chain, float] = {}
|
|
94
102
|
# Chains that currently don't have a vdf_client.
|
|
95
|
-
self.unspawned_chains:
|
|
103
|
+
self.unspawned_chains: list[Chain] = [
|
|
96
104
|
Chain.CHALLENGE_CHAIN,
|
|
97
105
|
Chain.REWARD_CHAIN,
|
|
98
106
|
Chain.INFUSED_CHALLENGE_CHAIN,
|
|
99
107
|
]
|
|
100
108
|
# Chains that currently accept iterations.
|
|
101
|
-
self.allows_iters:
|
|
109
|
+
self.allows_iters: list[Chain] = []
|
|
102
110
|
# Last peak received, None if it's already processed.
|
|
103
111
|
self.new_peak: Optional[timelord_protocol.NewPeakTimelord] = None
|
|
104
112
|
# Last state received. Can either be a new peak or a new EndOfSubslotBundle.
|
|
105
113
|
# Unfinished block info, iters adjusted to the last peak.
|
|
106
|
-
self.unfinished_blocks:
|
|
114
|
+
self.unfinished_blocks: list[timelord_protocol.NewUnfinishedBlockTimelord] = []
|
|
107
115
|
# Signage points iters, adjusted to the last peak.
|
|
108
|
-
self.signage_point_iters:
|
|
116
|
+
self.signage_point_iters: list[tuple[uint64, uint8]] = []
|
|
109
117
|
# For each chain, send those info when the process spawns.
|
|
110
|
-
self.iters_to_submit:
|
|
111
|
-
self.iters_submitted:
|
|
112
|
-
self.iters_finished:
|
|
118
|
+
self.iters_to_submit: dict[Chain, list[uint64]] = {}
|
|
119
|
+
self.iters_submitted: dict[Chain, list[uint64]] = {}
|
|
120
|
+
self.iters_finished: set[uint64] = set()
|
|
113
121
|
# For each iteration submitted, know if it's a signage point, an infusion point or an end of slot.
|
|
114
|
-
self.iteration_to_proof_type:
|
|
122
|
+
self.iteration_to_proof_type: dict[uint64, IterationType] = {}
|
|
115
123
|
# List of proofs finished.
|
|
116
|
-
self.proofs_finished:
|
|
124
|
+
self.proofs_finished: list[tuple[Chain, VDFInfo, VDFProof, int]] = []
|
|
117
125
|
# Data to send at vdf_client initialization.
|
|
118
|
-
self.overflow_blocks:
|
|
126
|
+
self.overflow_blocks: list[timelord_protocol.NewUnfinishedBlockTimelord] = []
|
|
119
127
|
# Incremented each time `reset_chains` has been called.
|
|
120
128
|
# Used to label proofs in `finished_proofs` and to only filter proofs corresponding to the most recent state.
|
|
121
129
|
self.num_resets: int = 0
|
|
122
130
|
|
|
123
|
-
self.process_communication_tasks:
|
|
131
|
+
self.process_communication_tasks: list[asyncio.Task[None]] = []
|
|
124
132
|
self.main_loop: Optional[asyncio.Task[None]] = None
|
|
125
133
|
self.vdf_server: Optional[asyncio.base_events.Server] = None
|
|
126
134
|
self._shut_down = False
|
|
127
|
-
self.vdf_failures:
|
|
135
|
+
self.vdf_failures: list[tuple[Chain, Optional[int]]] = []
|
|
128
136
|
self.vdf_failures_count: int = 0
|
|
129
137
|
self.vdf_failure_time: float = 0
|
|
130
138
|
self.total_unfinished: int = 0
|
|
@@ -134,9 +142,10 @@ class Timelord:
|
|
|
134
142
|
# Support backwards compatibility for the old `config.yaml` that has field `sanitizer_mode`.
|
|
135
143
|
if not self.bluebox_mode:
|
|
136
144
|
self.bluebox_mode = self.config.get("sanitizer_mode", False)
|
|
137
|
-
self.pending_bluebox_info:
|
|
145
|
+
self.pending_bluebox_info: list[tuple[float, timelord_protocol.RequestCompactProofOfTime]] = []
|
|
138
146
|
self.last_active_time = time.time()
|
|
139
147
|
self.max_allowed_inactivity_time = 60
|
|
148
|
+
self._executor_shutdown_tempfile: Optional[IO[bytes]] = None
|
|
140
149
|
self.bluebox_pool: Optional[ThreadPoolExecutor] = None
|
|
141
150
|
|
|
142
151
|
@contextlib.asynccontextmanager
|
|
@@ -150,24 +159,27 @@ class Timelord:
|
|
|
150
159
|
self.last_state: LastState = LastState(self.constants)
|
|
151
160
|
slow_bluebox = self.config.get("slow_bluebox", False)
|
|
152
161
|
if not self.bluebox_mode:
|
|
153
|
-
self.main_loop =
|
|
162
|
+
self.main_loop = create_referenced_task(self._manage_chains())
|
|
154
163
|
else:
|
|
155
164
|
if os.name == "nt" or slow_bluebox:
|
|
156
165
|
# `vdf_client` doesn't build on windows, use `prove()` from chiavdf.
|
|
157
166
|
workers = self.config.get("slow_bluebox_process_count", 1)
|
|
167
|
+
self._executor_shutdown_tempfile = _create_shutdown_file()
|
|
158
168
|
self.bluebox_pool = ThreadPoolExecutor(
|
|
159
169
|
max_workers=workers,
|
|
160
170
|
)
|
|
161
|
-
self.main_loop =
|
|
171
|
+
self.main_loop = create_referenced_task(
|
|
162
172
|
self._start_manage_discriminant_queue_sanitizer_slow(self.bluebox_pool, workers)
|
|
163
173
|
)
|
|
164
174
|
else:
|
|
165
|
-
self.main_loop =
|
|
175
|
+
self.main_loop = create_referenced_task(self._manage_discriminant_queue_sanitizer())
|
|
166
176
|
log.info(f"Started timelord, listening on port {self.get_vdf_server_port()}")
|
|
167
177
|
try:
|
|
168
178
|
yield
|
|
169
179
|
finally:
|
|
170
180
|
self._shut_down = True
|
|
181
|
+
if self._executor_shutdown_tempfile is not None:
|
|
182
|
+
self._executor_shutdown_tempfile.close()
|
|
171
183
|
for task in self.process_communication_tasks:
|
|
172
184
|
task.cancel()
|
|
173
185
|
if self.main_loop is not None:
|
|
@@ -175,7 +187,7 @@ class Timelord:
|
|
|
175
187
|
if self.bluebox_pool is not None:
|
|
176
188
|
self.bluebox_pool.shutdown()
|
|
177
189
|
|
|
178
|
-
def get_connections(self, request_node_type: Optional[NodeType]) ->
|
|
190
|
+
def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
179
191
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
180
192
|
|
|
181
193
|
async def on_connect(self, connection: WSChiaConnection) -> None:
|
|
@@ -189,7 +201,7 @@ class Timelord:
|
|
|
189
201
|
def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
|
|
190
202
|
self.state_changed_callback = callback
|
|
191
203
|
|
|
192
|
-
def state_changed(self, change: str, change_data: Optional[
|
|
204
|
+
def state_changed(self, change: str, change_data: Optional[dict[str, Any]] = None) -> None:
|
|
193
205
|
if self.state_changed_callback is not None:
|
|
194
206
|
self.state_changed_callback(change, change_data)
|
|
195
207
|
|
|
@@ -206,18 +218,17 @@ class Timelord:
|
|
|
206
218
|
|
|
207
219
|
async def _stop_chain(self, chain: Chain) -> None:
|
|
208
220
|
try:
|
|
209
|
-
_, _, stop_writer = self.chain_type_to_stream
|
|
221
|
+
_, _, stop_writer = self.chain_type_to_stream.pop(chain)
|
|
222
|
+
if chain not in self.unspawned_chains:
|
|
223
|
+
self.unspawned_chains.append(chain)
|
|
210
224
|
if chain in self.allows_iters:
|
|
225
|
+
self.allows_iters.remove(chain)
|
|
211
226
|
stop_writer.write(b"010")
|
|
212
227
|
await stop_writer.drain()
|
|
213
|
-
self.allows_iters.remove(chain)
|
|
214
228
|
else:
|
|
215
229
|
log.error(f"Trying to stop {chain} before its initialization.")
|
|
216
230
|
stop_writer.close()
|
|
217
231
|
await stop_writer.wait_closed()
|
|
218
|
-
if chain not in self.unspawned_chains:
|
|
219
|
-
self.unspawned_chains.append(chain)
|
|
220
|
-
del self.chain_type_to_stream[chain]
|
|
221
232
|
except ConnectionResetError as e:
|
|
222
233
|
log.error(f"{e}")
|
|
223
234
|
except Exception as e:
|
|
@@ -326,6 +337,11 @@ class Timelord:
|
|
|
326
337
|
self.iteration_to_proof_type[new_block_iters] = IterationType.INFUSION_POINT
|
|
327
338
|
# Remove all unfinished blocks that have already passed.
|
|
328
339
|
self.unfinished_blocks = new_unfinished_blocks
|
|
340
|
+
|
|
341
|
+
# remove overflow blocks that were moved to unfinished cache
|
|
342
|
+
for block in new_unfinished_blocks:
|
|
343
|
+
if block in self.overflow_blocks:
|
|
344
|
+
self.overflow_blocks.remove(block)
|
|
329
345
|
# Signage points.
|
|
330
346
|
if not only_eos and len(self.signage_point_iters) > 0:
|
|
331
347
|
count_signage = 0
|
|
@@ -407,7 +423,7 @@ class Timelord:
|
|
|
407
423
|
assert challenge is not None
|
|
408
424
|
assert initial_form is not None
|
|
409
425
|
self.process_communication_tasks.append(
|
|
410
|
-
|
|
426
|
+
create_referenced_task(
|
|
411
427
|
self._do_process_communication(
|
|
412
428
|
picked_chain, challenge, initial_form, ip, reader, writer, proof_label=self.num_resets
|
|
413
429
|
)
|
|
@@ -431,7 +447,7 @@ class Timelord:
|
|
|
431
447
|
writer.write(iter_str.encode())
|
|
432
448
|
await writer.drain()
|
|
433
449
|
|
|
434
|
-
def _clear_proof_list(self, iters: uint64) ->
|
|
450
|
+
def _clear_proof_list(self, iters: uint64) -> list[tuple[Chain, VDFInfo, VDFProof, int]]:
|
|
435
451
|
return [
|
|
436
452
|
(chain, info, proof, label)
|
|
437
453
|
for chain, info, proof, label in self.proofs_finished
|
|
@@ -1082,6 +1098,8 @@ class Timelord:
|
|
|
1082
1098
|
|
|
1083
1099
|
except ConnectionResetError as e:
|
|
1084
1100
|
log.debug(f"Connection reset with VDF client {e}")
|
|
1101
|
+
except Exception:
|
|
1102
|
+
log.exception("VDF client communication terminated abruptly")
|
|
1085
1103
|
|
|
1086
1104
|
async def _manage_discriminant_queue_sanitizer(self) -> None:
|
|
1087
1105
|
while not self._shut_down:
|
|
@@ -1101,7 +1119,7 @@ class Timelord:
|
|
|
1101
1119
|
info = self.pending_bluebox_info[0]
|
|
1102
1120
|
ip, reader, writer = self.free_clients[0]
|
|
1103
1121
|
self.process_communication_tasks.append(
|
|
1104
|
-
|
|
1122
|
+
create_referenced_task(
|
|
1105
1123
|
self._do_process_communication(
|
|
1106
1124
|
Chain.BLUEBOX,
|
|
1107
1125
|
info[1].new_proof_of_time.challenge,
|
|
@@ -1125,7 +1143,7 @@ class Timelord:
|
|
|
1125
1143
|
async def _start_manage_discriminant_queue_sanitizer_slow(self, pool: ThreadPoolExecutor, counter: int) -> None:
|
|
1126
1144
|
tasks = []
|
|
1127
1145
|
for _ in range(counter):
|
|
1128
|
-
tasks.append(
|
|
1146
|
+
tasks.append(create_referenced_task(self._manage_discriminant_queue_sanitizer_slow(pool)))
|
|
1129
1147
|
for task in tasks:
|
|
1130
1148
|
await task
|
|
1131
1149
|
|
|
@@ -1167,6 +1185,7 @@ class Timelord:
|
|
|
1167
1185
|
pool,
|
|
1168
1186
|
prove_bluebox_slow,
|
|
1169
1187
|
bytes(bluebox_process_data),
|
|
1188
|
+
"" if self._executor_shutdown_tempfile is None else self._executor_shutdown_tempfile.name,
|
|
1170
1189
|
)
|
|
1171
1190
|
t2 = time.time()
|
|
1172
1191
|
delta = t2 - t1
|
|
@@ -1174,6 +1193,11 @@ class Timelord:
|
|
|
1174
1193
|
ips = picked_info.new_proof_of_time.number_of_iterations / delta
|
|
1175
1194
|
else:
|
|
1176
1195
|
ips = 0
|
|
1196
|
+
|
|
1197
|
+
if len(proof) == 0:
|
|
1198
|
+
log.info(f"Empty VDF proof returned: {picked_info.height}. Time: {delta}s. IPS: {ips}.")
|
|
1199
|
+
return
|
|
1200
|
+
|
|
1177
1201
|
log.info(f"Finished compact proof: {picked_info.height}. Time: {delta}s. IPS: {ips}.")
|
|
1178
1202
|
output = proof[:100]
|
|
1179
1203
|
proof_part = proof[100:200]
|
chia/timelord/timelord_api.py
CHANGED
|
@@ -2,23 +2,29 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import time
|
|
5
|
-
from typing import Optional
|
|
5
|
+
from typing import TYPE_CHECKING, ClassVar, Optional, cast
|
|
6
6
|
|
|
7
7
|
from chia.protocols import timelord_protocol
|
|
8
8
|
from chia.protocols.timelord_protocol import NewPeakTimelord
|
|
9
9
|
from chia.rpc.rpc_server import StateChangedProtocol
|
|
10
|
+
from chia.server.api_protocol import ApiMetadata
|
|
10
11
|
from chia.timelord.iters_from_block import iters_from_block
|
|
11
12
|
from chia.timelord.timelord import Timelord
|
|
12
13
|
from chia.timelord.types import Chain, IterationType
|
|
13
|
-
from chia.util.api_decorators import api_request
|
|
14
14
|
from chia.util.ints import uint64
|
|
15
15
|
|
|
16
16
|
log = logging.getLogger(__name__)
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class TimelordAPI:
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from chia.server.api_protocol import ApiProtocol
|
|
22
|
+
|
|
23
|
+
_protocol_check: ClassVar[ApiProtocol] = cast("TimelordAPI", None)
|
|
24
|
+
|
|
20
25
|
log: logging.Logger
|
|
21
26
|
timelord: Timelord
|
|
27
|
+
metadata: ClassVar[ApiMetadata] = ApiMetadata()
|
|
22
28
|
|
|
23
29
|
def __init__(self, timelord) -> None:
|
|
24
30
|
self.log = logging.getLogger(__name__)
|
|
@@ -30,7 +36,7 @@ class TimelordAPI:
|
|
|
30
36
|
def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
|
|
31
37
|
self.timelord.state_changed_callback = callback
|
|
32
38
|
|
|
33
|
-
@
|
|
39
|
+
@metadata.request()
|
|
34
40
|
async def new_peak_timelord(self, new_peak: timelord_protocol.NewPeakTimelord) -> None:
|
|
35
41
|
if self.timelord.last_state is None:
|
|
36
42
|
return None
|
|
@@ -52,7 +58,7 @@ class TimelordAPI:
|
|
|
52
58
|
new_peak.reward_chain_block.height == self.timelord.last_state.last_height + 1
|
|
53
59
|
and self.check_orphaned_unfinished_block(new_peak) is True
|
|
54
60
|
):
|
|
55
|
-
log.info("there is an unfinished block that this peak would orphan -
|
|
61
|
+
log.info("there is an unfinished block that this peak would orphan - skip peak")
|
|
56
62
|
self.timelord.state_changed("skipping_peak", {"height": new_peak.reward_chain_block.height})
|
|
57
63
|
return
|
|
58
64
|
|
|
@@ -87,7 +93,7 @@ class TimelordAPI:
|
|
|
87
93
|
return True
|
|
88
94
|
return False
|
|
89
95
|
|
|
90
|
-
@
|
|
96
|
+
@metadata.request()
|
|
91
97
|
async def new_unfinished_block_timelord(self, new_unfinished_block: timelord_protocol.NewUnfinishedBlockTimelord):
|
|
92
98
|
if self.timelord.last_state is None:
|
|
93
99
|
return None
|
|
@@ -120,7 +126,7 @@ class TimelordAPI:
|
|
|
120
126
|
self.timelord.total_unfinished += 1
|
|
121
127
|
log.debug(f"Non-overflow unfinished block, total {self.timelord.total_unfinished}")
|
|
122
128
|
|
|
123
|
-
@
|
|
129
|
+
@metadata.request()
|
|
124
130
|
async def request_compact_proof_of_time(self, vdf_info: timelord_protocol.RequestCompactProofOfTime):
|
|
125
131
|
async with self.timelord.lock:
|
|
126
132
|
if not self.timelord.bluebox_mode:
|
|
@@ -7,15 +7,16 @@ import pathlib
|
|
|
7
7
|
import signal
|
|
8
8
|
import sys
|
|
9
9
|
import time
|
|
10
|
+
from collections.abc import AsyncIterator
|
|
10
11
|
from contextlib import asynccontextmanager
|
|
11
12
|
from dataclasses import dataclass, field
|
|
12
13
|
from types import FrameType
|
|
13
|
-
from typing import Any,
|
|
14
|
+
from typing import Any, Optional
|
|
14
15
|
|
|
15
16
|
from chia.server.signal_handlers import SignalHandlers
|
|
16
17
|
from chia.util.chia_logging import initialize_logging
|
|
17
18
|
from chia.util.config import load_config
|
|
18
|
-
from chia.util.default_root import
|
|
19
|
+
from chia.util.default_root import resolve_root_path
|
|
19
20
|
from chia.util.network import resolve
|
|
20
21
|
from chia.util.setproctitle import setproctitle
|
|
21
22
|
|
|
@@ -26,7 +27,7 @@ log = logging.getLogger(__name__)
|
|
|
26
27
|
class VDFClientProcessMgr:
|
|
27
28
|
lock: asyncio.Lock = field(default_factory=asyncio.Lock)
|
|
28
29
|
stopped: bool = False
|
|
29
|
-
active_processes:
|
|
30
|
+
active_processes: list[asyncio.subprocess.Process] = field(default_factory=list)
|
|
30
31
|
|
|
31
32
|
async def remove_process(self, proc: asyncio.subprocess.Process) -> None:
|
|
32
33
|
async with self.lock:
|
|
@@ -131,7 +132,7 @@ async def spawn_process(
|
|
|
131
132
|
await proc.communicate()
|
|
132
133
|
|
|
133
134
|
|
|
134
|
-
async def spawn_all_processes(config:
|
|
135
|
+
async def spawn_all_processes(config: dict, net_config: dict, process_mgr: VDFClientProcessMgr):
|
|
135
136
|
await asyncio.sleep(5)
|
|
136
137
|
hostname = net_config["self_hostname"] if "host" not in config else config["host"]
|
|
137
138
|
port = config["port"]
|
|
@@ -152,7 +153,7 @@ async def spawn_all_processes(config: Dict, net_config: Dict, process_mgr: VDFCl
|
|
|
152
153
|
await asyncio.gather(*awaitables)
|
|
153
154
|
|
|
154
155
|
|
|
155
|
-
async def async_main(config:
|
|
156
|
+
async def async_main(config: dict[str, Any], net_config: dict[str, Any]) -> None:
|
|
156
157
|
process_mgr = VDFClientProcessMgr()
|
|
157
158
|
|
|
158
159
|
async def stop(
|
|
@@ -174,8 +175,9 @@ async def async_main(config: Dict[str, Any], net_config: Dict[str, Any]) -> None
|
|
|
174
175
|
def main():
|
|
175
176
|
if os.name == "nt":
|
|
176
177
|
log.info("Timelord launcher not supported on Windows.")
|
|
177
|
-
return
|
|
178
|
-
root_path =
|
|
178
|
+
return 1
|
|
179
|
+
root_path = resolve_root_path(override=None)
|
|
180
|
+
|
|
179
181
|
setproctitle("chia_timelord_launcher")
|
|
180
182
|
net_config = load_config(root_path, "config.yaml")
|
|
181
183
|
config = net_config["timelord_launcher"]
|
|
@@ -185,4 +187,4 @@ def main():
|
|
|
185
187
|
|
|
186
188
|
|
|
187
189
|
if __name__ == "__main__":
|
|
188
|
-
main()
|
|
190
|
+
sys.exit(main())
|
chia/timelord/timelord_state.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional, Union
|
|
5
5
|
|
|
6
6
|
from chia.consensus.constants import ConsensusConstants
|
|
7
7
|
from chia.protocols import timelord_protocol
|
|
@@ -44,7 +44,7 @@ class LastState:
|
|
|
44
44
|
self.last_peak_challenge: bytes32 = constants.GENESIS_CHALLENGE
|
|
45
45
|
self.difficulty: uint64 = constants.DIFFICULTY_STARTING
|
|
46
46
|
self.sub_slot_iters: uint64 = constants.SUB_SLOT_ITERS_STARTING
|
|
47
|
-
self.reward_challenge_cache:
|
|
47
|
+
self.reward_challenge_cache: list[tuple[bytes32, uint128]] = [(constants.GENESIS_CHALLENGE, uint128(0))]
|
|
48
48
|
self.new_epoch = False
|
|
49
49
|
self.passed_ses_height_but_not_yet_included = False
|
|
50
50
|
self.infused_ses = False
|
|
@@ -121,7 +121,7 @@ class LastState:
|
|
|
121
121
|
if overflow and self.new_epoch:
|
|
122
122
|
# No overflows in new epoch
|
|
123
123
|
return False
|
|
124
|
-
if self.state_type
|
|
124
|
+
if self.state_type in {StateType.FIRST_SUB_SLOT, StateType.END_OF_SUB_SLOT}:
|
|
125
125
|
return True
|
|
126
126
|
ss_start_iters = self.get_total_iters() - self.get_last_ip()
|
|
127
127
|
already_infused_count: int = 0
|
|
@@ -160,7 +160,7 @@ class LastState:
|
|
|
160
160
|
return self.state_type == StateType.END_OF_SUB_SLOT and self.infused_ses
|
|
161
161
|
|
|
162
162
|
def get_next_sub_epoch_summary(self) -> Optional[SubEpochSummary]:
|
|
163
|
-
if self.state_type
|
|
163
|
+
if self.state_type in {StateType.FIRST_SUB_SLOT, StateType.END_OF_SUB_SLOT}:
|
|
164
164
|
# Can only infuse SES after a peak (in an end of sub slot)
|
|
165
165
|
return None
|
|
166
166
|
assert self.peak is not None
|
|
@@ -233,7 +233,7 @@ class LastState:
|
|
|
233
233
|
else:
|
|
234
234
|
return None
|
|
235
235
|
elif self.state_type == StateType.END_OF_SUB_SLOT:
|
|
236
|
-
if chain
|
|
236
|
+
if chain in {Chain.CHALLENGE_CHAIN, Chain.REWARD_CHAIN}:
|
|
237
237
|
return ClassgroupElement.get_default_element()
|
|
238
238
|
if chain == Chain.INFUSED_CHALLENGE_CHAIN:
|
|
239
239
|
assert self.subslot_end is not None
|
chia/types/block_protocol.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Optional
|
|
4
4
|
|
|
5
5
|
from typing_extensions import Protocol
|
|
6
6
|
|
|
@@ -17,4 +17,4 @@ class BlockInfo(Protocol):
|
|
|
17
17
|
def transactions_generator(self) -> Optional[SerializedProgram]: ...
|
|
18
18
|
|
|
19
19
|
@property
|
|
20
|
-
def transactions_generator_ref_list(self) ->
|
|
20
|
+
def transactions_generator_ref_list(self) -> list[uint32]: ...
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Union
|
|
4
4
|
|
|
5
5
|
from chia_rs import Coin
|
|
6
6
|
|
|
@@ -11,11 +11,11 @@ from chia.util.ints import uint64
|
|
|
11
11
|
__all__ = ["Coin", "coin_as_list", "hash_coin_ids"]
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def coin_as_list(c: Coin) ->
|
|
14
|
+
def coin_as_list(c: Coin) -> list[Union[bytes32, uint64]]:
|
|
15
15
|
return [c.parent_coin_info, c.puzzle_hash, uint64(c.amount)]
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
def hash_coin_ids(coin_ids:
|
|
18
|
+
def hash_coin_ids(coin_ids: list[bytes32]) -> bytes32:
|
|
19
19
|
if len(coin_ids) == 1:
|
|
20
20
|
return std_hash(coin_ids[0])
|
|
21
21
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import io
|
|
4
|
-
from typing import TYPE_CHECKING, Any, Callable,
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar
|
|
5
5
|
|
|
6
|
-
from chia_rs import
|
|
6
|
+
from chia_rs import MEMPOOL_MODE, run_chia_program, tree_hash
|
|
7
7
|
from clvm.casts import int_from_bytes
|
|
8
8
|
from clvm.CLVMObject import CLVMStorage
|
|
9
9
|
from clvm.EvalError import EvalError
|
|
@@ -11,11 +11,10 @@ from clvm.serialize import sexp_from_stream, sexp_to_stream
|
|
|
11
11
|
from clvm.SExp import SExp
|
|
12
12
|
|
|
13
13
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
14
|
+
from chia.types.blockchain_format.tree_hash import sha256_treehash
|
|
14
15
|
from chia.util.byte_types import hexstr_to_bytes
|
|
15
16
|
from chia.util.hash import std_hash
|
|
16
17
|
|
|
17
|
-
from .tree_hash import sha256_treehash
|
|
18
|
-
|
|
19
18
|
INFINITE_COST = 11000000000
|
|
20
19
|
|
|
21
20
|
DEFAULT_FLAGS = MEMPOOL_MODE
|
|
@@ -30,32 +29,32 @@ class Program(SExp):
|
|
|
30
29
|
"""
|
|
31
30
|
|
|
32
31
|
@classmethod
|
|
33
|
-
def parse(cls:
|
|
32
|
+
def parse(cls: type[T_Program], f) -> T_Program:
|
|
34
33
|
return sexp_from_stream(f, cls.to)
|
|
35
34
|
|
|
36
35
|
def stream(self, f):
|
|
37
36
|
sexp_to_stream(self, f)
|
|
38
37
|
|
|
39
38
|
@classmethod
|
|
40
|
-
def from_bytes(cls:
|
|
39
|
+
def from_bytes(cls: type[T_Program], blob: bytes) -> T_Program:
|
|
41
40
|
# this runs the program "1", which just returns the first argument.
|
|
42
41
|
# the first argument is the buffer we want to parse. This effectively
|
|
43
42
|
# leverages the rust parser and LazyNode, making it a lot faster to
|
|
44
43
|
# parse serialized programs into a python compatible structure
|
|
45
|
-
|
|
44
|
+
_cost, ret = run_chia_program(
|
|
46
45
|
b"\x01",
|
|
47
46
|
blob,
|
|
48
47
|
50,
|
|
49
|
-
|
|
48
|
+
0,
|
|
50
49
|
)
|
|
51
50
|
return cls.to(ret)
|
|
52
51
|
|
|
53
52
|
@classmethod
|
|
54
|
-
def fromhex(cls:
|
|
53
|
+
def fromhex(cls: type[T_Program], hexstr: str) -> T_Program:
|
|
55
54
|
return cls.from_bytes(hexstr_to_bytes(hexstr))
|
|
56
55
|
|
|
57
56
|
@classmethod
|
|
58
|
-
def from_json_dict(cls:
|
|
57
|
+
def from_json_dict(cls: type[Program], json_dict: Any) -> Program:
|
|
59
58
|
if isinstance(json_dict, cls):
|
|
60
59
|
return json_dict
|
|
61
60
|
item = hexstr_to_bytes(json_dict)
|
|
@@ -66,7 +65,7 @@ class Program(SExp):
|
|
|
66
65
|
|
|
67
66
|
def __bytes__(self) -> bytes:
|
|
68
67
|
f = io.BytesIO()
|
|
69
|
-
self.stream(f)
|
|
68
|
+
self.stream(f)
|
|
70
69
|
return f.getvalue()
|
|
71
70
|
|
|
72
71
|
def __str__(self) -> str:
|
|
@@ -124,21 +123,21 @@ class Program(SExp):
|
|
|
124
123
|
def get_tree_hash(self) -> bytes32:
|
|
125
124
|
return bytes32(tree_hash(bytes(self)))
|
|
126
125
|
|
|
127
|
-
def _run(self, max_cost: int, flags: int, args: Any) ->
|
|
126
|
+
def _run(self, max_cost: int, flags: int, args: Any) -> tuple[int, Program]:
|
|
128
127
|
prog_args = Program.to(args)
|
|
129
128
|
cost, r = run_chia_program(self.as_bin(), prog_args.as_bin(), max_cost, flags)
|
|
130
129
|
return cost, Program.to(r)
|
|
131
130
|
|
|
132
|
-
def run_with_cost(self, max_cost: int, args: Any, flags=DEFAULT_FLAGS) ->
|
|
131
|
+
def run_with_cost(self, max_cost: int, args: Any, flags=DEFAULT_FLAGS) -> tuple[int, Program]:
|
|
133
132
|
# when running puzzles in the wallet, default to enabling all soft-forks
|
|
134
133
|
# as well as enabling mempool-mode (i.e. strict mode)
|
|
135
134
|
return self._run(max_cost, flags, args)
|
|
136
135
|
|
|
137
136
|
def run(self, args: Any, max_cost=INFINITE_COST, flags=DEFAULT_FLAGS) -> Program:
|
|
138
|
-
|
|
137
|
+
_cost, r = self._run(max_cost, flags, args)
|
|
139
138
|
return r
|
|
140
139
|
|
|
141
|
-
def run_with_flags(self, max_cost: int, flags: int, args: Any) ->
|
|
140
|
+
def run_with_flags(self, max_cost: int, flags: int, args: Any) -> tuple[int, Program]:
|
|
142
141
|
return self._run(max_cost, flags, args)
|
|
143
142
|
|
|
144
143
|
# Replicates the curry function from clvm_tools, taking advantage of *args
|
|
@@ -163,7 +162,7 @@ class Program(SExp):
|
|
|
163
162
|
fixed_args = [4, (1, arg), fixed_args]
|
|
164
163
|
return Program.to([2, (1, self), fixed_args])
|
|
165
164
|
|
|
166
|
-
def uncurry(self) ->
|
|
165
|
+
def uncurry(self) -> tuple[Program, Program]:
|
|
167
166
|
def match(o: CLVMStorage, expected: bytes) -> None:
|
|
168
167
|
if o.atom != expected:
|
|
169
168
|
raise ValueError(f"expected: {expected.hex()}")
|
|
@@ -216,7 +215,7 @@ class Program(SExp):
|
|
|
216
215
|
EvalError = EvalError
|
|
217
216
|
|
|
218
217
|
|
|
219
|
-
def _tree_hash(node: SExp, precalculated:
|
|
218
|
+
def _tree_hash(node: SExp, precalculated: set[bytes32]) -> bytes32:
|
|
220
219
|
"""
|
|
221
220
|
Hash values in `precalculated` are presumed to have been hashed already.
|
|
222
221
|
"""
|
|
@@ -252,7 +251,7 @@ def _sexp_replace(sexp: T_CLVMStorage, to_sexp: Callable[[Any], T_Program], **kw
|
|
|
252
251
|
# Now split `kwargs` into two groups: those
|
|
253
252
|
# that start with `f` and those that start with `r`
|
|
254
253
|
|
|
255
|
-
args_by_prefix:
|
|
254
|
+
args_by_prefix: dict[str, dict[str, Any]] = {}
|
|
256
255
|
for k, v in kwargs.items():
|
|
257
256
|
c = k[0]
|
|
258
257
|
if c not in "fr":
|
|
@@ -8,7 +8,7 @@ have to worry about blowing out the python stack.
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
-
from typing import Callable,
|
|
11
|
+
from typing import Callable, Optional, Union
|
|
12
12
|
|
|
13
13
|
from clvm.CLVMObject import CLVMStorage
|
|
14
14
|
from clvm.SExp import SExp
|
|
@@ -17,12 +17,12 @@ from chia.types.blockchain_format.sized_bytes import bytes32
|
|
|
17
17
|
from chia.util.hash import std_hash
|
|
18
18
|
|
|
19
19
|
ValueType = Union[bytes, CLVMStorage]
|
|
20
|
-
ValueStackType =
|
|
21
|
-
Op = Callable[[ValueStackType, "OpStackType",
|
|
22
|
-
OpStackType =
|
|
20
|
+
ValueStackType = list[ValueType]
|
|
21
|
+
Op = Callable[[ValueStackType, "OpStackType", set[bytes32]], None]
|
|
22
|
+
OpStackType = list[Op]
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def sha256_treehash(sexp: CLVMStorage, precalculated: Optional[
|
|
25
|
+
def sha256_treehash(sexp: CLVMStorage, precalculated: Optional[set[bytes32]] = None) -> bytes32:
|
|
26
26
|
"""
|
|
27
27
|
Hash values in `precalculated` are presumed to have been hashed already.
|
|
28
28
|
"""
|
|
@@ -30,7 +30,7 @@ def sha256_treehash(sexp: CLVMStorage, precalculated: Optional[Set[bytes32]] = N
|
|
|
30
30
|
if precalculated is None:
|
|
31
31
|
precalculated = set()
|
|
32
32
|
|
|
33
|
-
def handle_sexp(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated:
|
|
33
|
+
def handle_sexp(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: set[bytes32]) -> None:
|
|
34
34
|
# just trusting it is right, otherwise we get an attribute error
|
|
35
35
|
sexp: SExp = sexp_stack.pop() # type: ignore[assignment]
|
|
36
36
|
if sexp.pair:
|
|
@@ -50,20 +50,20 @@ def sha256_treehash(sexp: CLVMStorage, precalculated: Optional[Set[bytes32]] = N
|
|
|
50
50
|
r = std_hash(b"\1" + atom)
|
|
51
51
|
sexp_stack.append(r)
|
|
52
52
|
|
|
53
|
-
def handle_pair(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated:
|
|
53
|
+
def handle_pair(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: set[bytes32]) -> None:
|
|
54
54
|
# just trusting it is right, otherwise we get a type error
|
|
55
55
|
p0: bytes = sexp_stack.pop() # type: ignore[assignment]
|
|
56
56
|
p1: bytes = sexp_stack.pop() # type: ignore[assignment]
|
|
57
57
|
sexp_stack.append(std_hash(b"\2" + p0 + p1))
|
|
58
58
|
|
|
59
|
-
def roll(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated:
|
|
59
|
+
def roll(sexp_stack: ValueStackType, op_stack: OpStackType, precalculated: set[bytes32]) -> None:
|
|
60
60
|
p0 = sexp_stack.pop()
|
|
61
61
|
p1 = sexp_stack.pop()
|
|
62
62
|
sexp_stack.append(p0)
|
|
63
63
|
sexp_stack.append(p1)
|
|
64
64
|
|
|
65
65
|
sexp_stack: ValueStackType = [sexp]
|
|
66
|
-
op_stack:
|
|
66
|
+
op_stack: list[Op] = [handle_sexp]
|
|
67
67
|
while len(op_stack) > 0:
|
|
68
68
|
op = op_stack.pop()
|
|
69
69
|
op(sexp_stack, op_stack, precalculated)
|