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
|
@@ -3,18 +3,21 @@ from __future__ import annotations
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import itertools
|
|
5
5
|
import time
|
|
6
|
-
from
|
|
6
|
+
from collections.abc import Collection
|
|
7
|
+
from typing import Any, Optional, Union
|
|
7
8
|
|
|
8
9
|
import anyio
|
|
9
10
|
|
|
11
|
+
from chia.consensus.block_body_validation import ForkInfo
|
|
10
12
|
from chia.consensus.block_record import BlockRecord
|
|
11
13
|
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
12
14
|
from chia.consensus.blockchain import BlockchainMutexPriority
|
|
13
|
-
from chia.consensus.multiprocess_validation import PreValidationResult,
|
|
15
|
+
from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
|
|
14
16
|
from chia.full_node.full_node import FullNode
|
|
15
17
|
from chia.full_node.full_node_api import FullNodeAPI
|
|
16
18
|
from chia.rpc.rpc_server import default_get_connections
|
|
17
19
|
from chia.server.outbound_message import NodeType
|
|
20
|
+
from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
|
|
18
21
|
from chia.simulator.block_tools import BlockTools
|
|
19
22
|
from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol
|
|
20
23
|
from chia.types.blockchain_format.coin import Coin
|
|
@@ -22,11 +25,13 @@ from chia.types.blockchain_format.sized_bytes import bytes32
|
|
|
22
25
|
from chia.types.coin_record import CoinRecord
|
|
23
26
|
from chia.types.full_block import FullBlock
|
|
24
27
|
from chia.types.spend_bundle import SpendBundle
|
|
28
|
+
from chia.types.validation_state import ValidationState
|
|
29
|
+
from chia.util.augmented_chain import AugmentedBlockchain
|
|
25
30
|
from chia.util.config import lock_and_load_config, save_config
|
|
26
31
|
from chia.util.ints import uint8, uint32, uint64, uint128
|
|
27
32
|
from chia.util.timing import adjusted_timeout, backoff_times
|
|
28
33
|
from chia.wallet.payment import Payment
|
|
29
|
-
from chia.wallet.transaction_record import TransactionRecord
|
|
34
|
+
from chia.wallet.transaction_record import LightTransactionRecord, TransactionRecord
|
|
30
35
|
from chia.wallet.util.tx_config import DEFAULT_TX_CONFIG
|
|
31
36
|
from chia.wallet.wallet import Wallet
|
|
32
37
|
from chia.wallet.wallet_node import WalletNode
|
|
@@ -42,7 +47,7 @@ default = _Default()
|
|
|
42
47
|
timeout_per_block = 5
|
|
43
48
|
|
|
44
49
|
|
|
45
|
-
async def wait_for_coins_in_wallet(coins:
|
|
50
|
+
async def wait_for_coins_in_wallet(coins: set[Coin], wallet: Wallet, timeout: Optional[float] = 5):
|
|
46
51
|
"""Wait until all of the specified coins are simultaneously reported as spendable
|
|
47
52
|
by the wallet.
|
|
48
53
|
|
|
@@ -64,7 +69,7 @@ async def wait_for_coins_in_wallet(coins: Set[Coin], wallet: Wallet, timeout: Op
|
|
|
64
69
|
|
|
65
70
|
|
|
66
71
|
class FullNodeSimulator(FullNodeAPI):
|
|
67
|
-
def __init__(self, full_node: FullNode, block_tools: BlockTools, config:
|
|
72
|
+
def __init__(self, full_node: FullNode, block_tools: BlockTools, config: dict) -> None:
|
|
68
73
|
super().__init__(full_node)
|
|
69
74
|
self.bt = block_tools
|
|
70
75
|
self.full_node = full_node
|
|
@@ -74,10 +79,10 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
74
79
|
self.use_current_time: bool = self.config.get("simulator", {}).get("use_current_time", False)
|
|
75
80
|
self.auto_farm: bool = self.config.get("simulator", {}).get("auto_farm", False)
|
|
76
81
|
|
|
77
|
-
def get_connections(self, request_node_type: Optional[NodeType]) ->
|
|
82
|
+
def get_connections(self, request_node_type: Optional[NodeType]) -> list[dict[str, Any]]:
|
|
78
83
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
79
84
|
|
|
80
|
-
async def get_all_full_blocks(self) ->
|
|
85
|
+
async def get_all_full_blocks(self) -> list[FullBlock]:
|
|
81
86
|
peak: Optional[BlockRecord] = self.full_node.blockchain.get_peak()
|
|
82
87
|
if peak is None:
|
|
83
88
|
return []
|
|
@@ -119,7 +124,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
119
124
|
await self.farm_new_transaction_block(FarmNewBlockProtocol(self.bt.farmer_ph))
|
|
120
125
|
return self.auto_farm
|
|
121
126
|
|
|
122
|
-
async def get_all_coins(self, request: GetAllCoinsProtocol) ->
|
|
127
|
+
async def get_all_coins(self, request: GetAllCoinsProtocol) -> list[CoinRecord]:
|
|
123
128
|
return await self.full_node.coin_store.get_all_coins(request.include_spent_coins)
|
|
124
129
|
|
|
125
130
|
async def revert_block_height(self, new_height: uint32) -> None:
|
|
@@ -148,15 +153,15 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
148
153
|
# reload mempool
|
|
149
154
|
await self.full_node.mempool_manager.new_peak(block_record, None)
|
|
150
155
|
|
|
151
|
-
async def get_all_puzzle_hashes(self) ->
|
|
156
|
+
async def get_all_puzzle_hashes(self) -> dict[bytes32, tuple[uint128, int]]:
|
|
152
157
|
# puzzle_hash, (total_amount, num_transactions)
|
|
153
|
-
ph_total_amount:
|
|
154
|
-
all_non_spent_coins:
|
|
158
|
+
ph_total_amount: dict[bytes32, tuple[uint128, int]] = {}
|
|
159
|
+
all_non_spent_coins: list[CoinRecord] = await self.get_all_coins(GetAllCoinsProtocol(False))
|
|
155
160
|
for cr in all_non_spent_coins:
|
|
156
161
|
if cr.coin.puzzle_hash not in ph_total_amount:
|
|
157
162
|
ph_total_amount[cr.coin.puzzle_hash] = (uint128(cr.coin.amount), 1)
|
|
158
163
|
else:
|
|
159
|
-
dict_value:
|
|
164
|
+
dict_value: tuple[uint128, int] = ph_total_amount[cr.coin.puzzle_hash]
|
|
160
165
|
ph_total_amount[cr.coin.puzzle_hash] = (uint128(cr.coin.amount + dict_value[0]), dict_value[1] + 1)
|
|
161
166
|
return ph_total_amount
|
|
162
167
|
|
|
@@ -170,23 +175,21 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
170
175
|
current_blocks = await self.get_all_full_blocks()
|
|
171
176
|
if len(current_blocks) == 0:
|
|
172
177
|
genesis = self.bt.get_consecutive_blocks(uint8(1))[0]
|
|
173
|
-
|
|
178
|
+
future = await pre_validate_block(
|
|
174
179
|
self.full_node.blockchain.constants,
|
|
175
|
-
self.full_node.blockchain,
|
|
176
|
-
|
|
180
|
+
AugmentedBlockchain(self.full_node.blockchain),
|
|
181
|
+
genesis,
|
|
177
182
|
self.full_node.blockchain.pool,
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
difficulty=diff,
|
|
181
|
-
prev_ses_block=None,
|
|
182
|
-
validate_signatures=True,
|
|
183
|
+
None,
|
|
184
|
+
ValidationState(ssi, diff, None),
|
|
183
185
|
)
|
|
184
|
-
|
|
186
|
+
pre_validation_result: PreValidationResult = await future
|
|
187
|
+
fork_info = ForkInfo(-1, -1, self.full_node.constants.GENESIS_CHALLENGE)
|
|
185
188
|
await self.full_node.blockchain.add_block(
|
|
186
189
|
genesis,
|
|
187
|
-
|
|
188
|
-
self.full_node._bls_cache,
|
|
190
|
+
pre_validation_result,
|
|
189
191
|
self.full_node.constants.SUB_SLOT_ITERS_STARTING,
|
|
192
|
+
fork_info,
|
|
190
193
|
)
|
|
191
194
|
|
|
192
195
|
peak = self.full_node.blockchain.get_peak()
|
|
@@ -227,30 +230,23 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
227
230
|
|
|
228
231
|
async def farm_new_block(self, request: FarmNewBlockProtocol, force_wait_for_timestamp: bool = False):
|
|
229
232
|
ssi = self.full_node.constants.SUB_SLOT_ITERS_STARTING
|
|
230
|
-
|
|
233
|
+
diff = self.full_node.constants.DIFFICULTY_STARTING
|
|
231
234
|
async with self.full_node.blockchain.priority_mutex.acquire(priority=BlockchainMutexPriority.high):
|
|
232
235
|
self.log.info("Farming new block!")
|
|
233
236
|
current_blocks = await self.get_all_full_blocks()
|
|
234
237
|
if len(current_blocks) == 0:
|
|
235
238
|
genesis = self.bt.get_consecutive_blocks(uint8(1))[0]
|
|
236
|
-
|
|
239
|
+
future = await pre_validate_block(
|
|
237
240
|
self.full_node.blockchain.constants,
|
|
238
|
-
self.full_node.blockchain,
|
|
239
|
-
[genesis],
|
|
240
|
-
self.full_node.blockchain.pool,
|
|
241
|
-
{},
|
|
242
|
-
sub_slot_iters=ssi,
|
|
243
|
-
difficulty=diffculty,
|
|
244
|
-
prev_ses_block=None,
|
|
245
|
-
validate_signatures=True,
|
|
246
|
-
)
|
|
247
|
-
assert pre_validation_results is not None
|
|
248
|
-
await self.full_node.blockchain.add_block(
|
|
241
|
+
AugmentedBlockchain(self.full_node.blockchain),
|
|
249
242
|
genesis,
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
ssi,
|
|
243
|
+
self.full_node.blockchain.pool,
|
|
244
|
+
None,
|
|
245
|
+
ValidationState(ssi, diff, None),
|
|
253
246
|
)
|
|
247
|
+
pre_validation_result: PreValidationResult = await future
|
|
248
|
+
fork_info = ForkInfo(-1, -1, self.full_node.constants.GENESIS_CHALLENGE)
|
|
249
|
+
await self.full_node.blockchain.add_block(genesis, pre_validation_result, ssi, fork_info)
|
|
254
250
|
peak = self.full_node.blockchain.get_peak()
|
|
255
251
|
assert peak is not None
|
|
256
252
|
curr: BlockRecord = peak
|
|
@@ -304,16 +300,14 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
304
300
|
guarantee_transaction_block=True,
|
|
305
301
|
seed=seed,
|
|
306
302
|
)
|
|
307
|
-
|
|
308
|
-
for block in more_blocks:
|
|
309
|
-
await self.full_node.add_block(block)
|
|
303
|
+
await add_blocks_in_batches(more_blocks[old_index + 1 :], self.full_node)
|
|
310
304
|
|
|
311
305
|
async def farm_blocks_to_puzzlehash(
|
|
312
306
|
self,
|
|
313
307
|
count: int,
|
|
314
|
-
farm_to: bytes32 = bytes32
|
|
308
|
+
farm_to: bytes32 = bytes32.zeros,
|
|
315
309
|
guarantee_transaction_blocks: bool = False,
|
|
316
|
-
timeout: Union[
|
|
310
|
+
timeout: Union[_Default, float, None] = default,
|
|
317
311
|
_wait_for_synced: bool = True,
|
|
318
312
|
) -> int:
|
|
319
313
|
"""Process the requested number of blocks including farming to the passed puzzle
|
|
@@ -357,7 +351,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
357
351
|
self,
|
|
358
352
|
count: int,
|
|
359
353
|
wallet: Wallet,
|
|
360
|
-
timeout: Union[
|
|
354
|
+
timeout: Union[_Default, float, None] = default,
|
|
361
355
|
_wait_for_synced: bool = True,
|
|
362
356
|
) -> int:
|
|
363
357
|
"""Farm the requested number of blocks to the passed wallet. This will
|
|
@@ -429,7 +423,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
429
423
|
self,
|
|
430
424
|
amount: int,
|
|
431
425
|
wallet: Wallet,
|
|
432
|
-
timeout: Union[
|
|
426
|
+
timeout: Union[_Default, float, None] = default,
|
|
433
427
|
) -> int:
|
|
434
428
|
"""Farm at least the requested amount of mojos to the passed wallet. Extra
|
|
435
429
|
mojos will be received based on the block rewards at the present block height.
|
|
@@ -469,8 +463,8 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
469
463
|
|
|
470
464
|
async def wait_transaction_records_entered_mempool(
|
|
471
465
|
self,
|
|
472
|
-
records: Collection[TransactionRecord],
|
|
473
|
-
timeout: Union[
|
|
466
|
+
records: Collection[Union[TransactionRecord, LightTransactionRecord]],
|
|
467
|
+
timeout: Union[float, None] = 5,
|
|
474
468
|
) -> None:
|
|
475
469
|
"""Wait until the transaction records have entered the mempool. Transaction
|
|
476
470
|
records with no spend bundle are ignored.
|
|
@@ -479,7 +473,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
479
473
|
records: The transaction records to wait for.
|
|
480
474
|
"""
|
|
481
475
|
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
482
|
-
ids_to_check:
|
|
476
|
+
ids_to_check: set[bytes32] = set()
|
|
483
477
|
for record in records:
|
|
484
478
|
if record.spend_bundle is None:
|
|
485
479
|
continue
|
|
@@ -502,7 +496,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
502
496
|
async def wait_bundle_ids_in_mempool(
|
|
503
497
|
self,
|
|
504
498
|
bundle_ids: Collection[bytes32],
|
|
505
|
-
timeout: Union[
|
|
499
|
+
timeout: Union[float, None] = 5,
|
|
506
500
|
) -> None:
|
|
507
501
|
"""Wait until the ids of specific spend bundles have entered the mempool.
|
|
508
502
|
|
|
@@ -510,7 +504,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
510
504
|
records: The bundle ids to wait for.
|
|
511
505
|
"""
|
|
512
506
|
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
513
|
-
ids_to_check:
|
|
507
|
+
ids_to_check: set[bytes32] = set(bundle_ids)
|
|
514
508
|
|
|
515
509
|
for backoff in backoff_times():
|
|
516
510
|
found = set()
|
|
@@ -529,7 +523,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
529
523
|
self,
|
|
530
524
|
record_ids: Collection[bytes32],
|
|
531
525
|
wallet_node: WalletNode,
|
|
532
|
-
timeout: Union[
|
|
526
|
+
timeout: Union[float, None] = 10,
|
|
533
527
|
) -> None:
|
|
534
528
|
"""Wait until the transaction records have been marked that they have made it into the mempool. Transaction
|
|
535
529
|
records with no spend bundle are ignored.
|
|
@@ -538,7 +532,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
538
532
|
records: The transaction records to wait for.
|
|
539
533
|
"""
|
|
540
534
|
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
541
|
-
ids_to_check:
|
|
535
|
+
ids_to_check: set[bytes32] = set(record_ids)
|
|
542
536
|
|
|
543
537
|
for backoff in backoff_times():
|
|
544
538
|
found = set()
|
|
@@ -556,7 +550,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
556
550
|
async def process_transaction_records(
|
|
557
551
|
self,
|
|
558
552
|
records: Collection[TransactionRecord],
|
|
559
|
-
timeout: Union[
|
|
553
|
+
timeout: Union[float, None] = (2 * timeout_per_block) + 5,
|
|
560
554
|
) -> None:
|
|
561
555
|
"""Process the specified transaction records and wait until they have been
|
|
562
556
|
included in a block.
|
|
@@ -567,7 +561,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
567
561
|
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
568
562
|
await self.wait_for_self_synced(timeout=None)
|
|
569
563
|
|
|
570
|
-
coins_to_wait_for:
|
|
564
|
+
coins_to_wait_for: set[Coin] = set()
|
|
571
565
|
for record in records:
|
|
572
566
|
if record.spend_bundle is None:
|
|
573
567
|
continue
|
|
@@ -581,7 +575,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
581
575
|
async def process_spend_bundles(
|
|
582
576
|
self,
|
|
583
577
|
bundles: Collection[SpendBundle],
|
|
584
|
-
timeout: Union[
|
|
578
|
+
timeout: Union[float, None] = (2 * timeout_per_block) + 5,
|
|
585
579
|
) -> None:
|
|
586
580
|
"""Process the specified spend bundles and wait until they have been included
|
|
587
581
|
in a block.
|
|
@@ -591,13 +585,13 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
591
585
|
"""
|
|
592
586
|
|
|
593
587
|
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
594
|
-
coins_to_wait_for:
|
|
588
|
+
coins_to_wait_for: set[Coin] = {addition for bundle in bundles for addition in bundle.additions()}
|
|
595
589
|
return await self.process_coin_spends(coins=coins_to_wait_for, timeout=None)
|
|
596
590
|
|
|
597
591
|
async def process_coin_spends(
|
|
598
592
|
self,
|
|
599
593
|
coins: Collection[Coin],
|
|
600
|
-
timeout: Union[
|
|
594
|
+
timeout: Union[float, None] = (2 * timeout_per_block) + 5,
|
|
601
595
|
) -> None:
|
|
602
596
|
"""Process the specified coin names and wait until they have been created in a
|
|
603
597
|
block.
|
|
@@ -613,7 +607,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
613
607
|
while True:
|
|
614
608
|
await self.farm_blocks_to_puzzlehash(count=1, guarantee_transaction_blocks=True, timeout=None)
|
|
615
609
|
|
|
616
|
-
found:
|
|
610
|
+
found: set[Coin] = set()
|
|
617
611
|
for coin in coin_set:
|
|
618
612
|
# TODO: is this the proper check?
|
|
619
613
|
if await coin_store.get_coin_record(coin.name()) is not None:
|
|
@@ -649,15 +643,13 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
649
643
|
async def check_transactions_confirmed(
|
|
650
644
|
self,
|
|
651
645
|
wallet_state_manager: WalletStateManager,
|
|
652
|
-
transactions:
|
|
646
|
+
transactions: Union[list[TransactionRecord], list[LightTransactionRecord]],
|
|
653
647
|
timeout: Optional[float] = 5,
|
|
654
648
|
) -> None:
|
|
655
|
-
transactions_left:
|
|
649
|
+
transactions_left: set[bytes32] = {tx.name for tx in transactions}
|
|
656
650
|
with anyio.fail_after(delay=adjusted_timeout(timeout)):
|
|
657
651
|
for backoff in backoff_times():
|
|
658
|
-
transactions_left
|
|
659
|
-
tx.name for tx in await wallet_state_manager.tx_store.get_all_unconfirmed()
|
|
660
|
-
}
|
|
652
|
+
transactions_left &= {tx.name for tx in await wallet_state_manager.tx_store.get_all_unconfirmed()}
|
|
661
653
|
if len(transactions_left) == 0:
|
|
662
654
|
break
|
|
663
655
|
|
|
@@ -666,11 +658,11 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
666
658
|
|
|
667
659
|
async def create_coins_with_amounts(
|
|
668
660
|
self,
|
|
669
|
-
amounts:
|
|
661
|
+
amounts: list[uint64],
|
|
670
662
|
wallet: Wallet,
|
|
671
663
|
per_transaction_record_group: int = 50,
|
|
672
|
-
timeout: Union[
|
|
673
|
-
) ->
|
|
664
|
+
timeout: Union[float, None] = 15,
|
|
665
|
+
) -> set[Coin]:
|
|
674
666
|
"""Create coins with the requested amount. This is useful when you need a
|
|
675
667
|
bunch of coins for a test and don't need to farm that many.
|
|
676
668
|
|
|
@@ -694,8 +686,8 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
694
686
|
if len(amounts) == 0:
|
|
695
687
|
return set()
|
|
696
688
|
|
|
697
|
-
outputs:
|
|
698
|
-
amounts_seen:
|
|
689
|
+
outputs: list[Payment] = []
|
|
690
|
+
amounts_seen: set[uint64] = set()
|
|
699
691
|
for amount in amounts:
|
|
700
692
|
# We need unique puzzle hash amount combos so we'll only generate a new puzzle hash when we've already
|
|
701
693
|
# seen that amount sent to that puzzle hash
|
|
@@ -703,7 +695,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
703
695
|
outputs.append(Payment(puzzle_hash, amount))
|
|
704
696
|
amounts_seen.add(amount)
|
|
705
697
|
|
|
706
|
-
transaction_records:
|
|
698
|
+
transaction_records: list[TransactionRecord] = []
|
|
707
699
|
outputs_iterator = iter(outputs)
|
|
708
700
|
while True:
|
|
709
701
|
# The outputs iterator must be second in the zip() call otherwise we lose
|
|
@@ -739,14 +731,14 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
739
731
|
spendbundle = self.full_node.mempool_manager.get_spendbundle(bundle_hash=tx_id)
|
|
740
732
|
return spendbundle is not None
|
|
741
733
|
|
|
742
|
-
def txs_in_mempool(self, txs:
|
|
734
|
+
def txs_in_mempool(self, txs: list[TransactionRecord]) -> bool:
|
|
743
735
|
return all(self.tx_id_in_mempool(tx_id=tx.spend_bundle.name()) for tx in txs if tx.spend_bundle is not None)
|
|
744
736
|
|
|
745
737
|
async def self_is_synced(self) -> bool:
|
|
746
738
|
return await self.full_node.synced()
|
|
747
739
|
|
|
748
740
|
async def wallet_is_synced(self, wallet_node: WalletNode, peak_height: Optional[uint32] = None) -> bool:
|
|
749
|
-
if not self.self_is_synced():
|
|
741
|
+
if not await self.self_is_synced():
|
|
750
742
|
# Depending on races, may not be covered every time
|
|
751
743
|
return False # pragma: no cover
|
|
752
744
|
if not await wallet_node.wallet_state_manager.synced():
|
|
@@ -770,7 +762,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
770
762
|
break
|
|
771
763
|
await asyncio.sleep(backoff_time)
|
|
772
764
|
|
|
773
|
-
async def wallets_are_synced(self, wallet_nodes:
|
|
765
|
+
async def wallets_are_synced(self, wallet_nodes: list[WalletNode], peak_height: Optional[uint32] = None) -> bool:
|
|
774
766
|
return all(
|
|
775
767
|
[
|
|
776
768
|
await self.wallet_is_synced(wallet_node=wallet_node, peak_height=peak_height)
|
|
@@ -780,7 +772,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
780
772
|
|
|
781
773
|
async def wait_for_wallets_synced(
|
|
782
774
|
self,
|
|
783
|
-
wallet_nodes:
|
|
775
|
+
wallet_nodes: list[WalletNode],
|
|
784
776
|
timeout: Optional[float] = 5,
|
|
785
777
|
peak_height: Optional[uint32] = None,
|
|
786
778
|
) -> None:
|
chia/simulator/setup_services.py
CHANGED
|
@@ -5,11 +5,11 @@ import gc
|
|
|
5
5
|
import logging
|
|
6
6
|
import signal
|
|
7
7
|
import sqlite3
|
|
8
|
-
import
|
|
8
|
+
from collections.abc import AsyncGenerator, AsyncIterator, Iterator
|
|
9
9
|
from contextlib import asynccontextmanager, contextmanager
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from types import FrameType
|
|
12
|
-
from typing import Any,
|
|
12
|
+
from typing import Any, Optional, Union
|
|
13
13
|
|
|
14
14
|
from chia.cmds.init_funcs import init
|
|
15
15
|
from chia.consensus.constants import ConsensusConstants, replace_str_to_bytes
|
|
@@ -48,12 +48,13 @@ from chia.util.db_wrapper import generate_in_memory_db_uri
|
|
|
48
48
|
from chia.util.ints import uint16
|
|
49
49
|
from chia.util.keychain import bytes_to_mnemonic
|
|
50
50
|
from chia.util.lock import Lockfile
|
|
51
|
+
from chia.util.task_referencer import create_referenced_task
|
|
51
52
|
|
|
52
53
|
log = logging.getLogger(__name__)
|
|
53
54
|
|
|
54
55
|
|
|
55
56
|
@contextmanager
|
|
56
|
-
def create_lock_and_load_config(certs_path: Path, root_path: Path) -> Iterator[
|
|
57
|
+
def create_lock_and_load_config(certs_path: Path, root_path: Path) -> Iterator[dict[str, Any]]:
|
|
57
58
|
init(None, root_path)
|
|
58
59
|
init(certs_path, root_path)
|
|
59
60
|
path = config_path_for_filename(root_path=root_path, filename="config.yaml")
|
|
@@ -63,7 +64,7 @@ def create_lock_and_load_config(certs_path: Path, root_path: Path) -> Iterator[D
|
|
|
63
64
|
yield config
|
|
64
65
|
|
|
65
66
|
|
|
66
|
-
def get_capability_overrides(node_type: NodeType, disabled_capabilities:
|
|
67
|
+
def get_capability_overrides(node_type: NodeType, disabled_capabilities: list[Capability]) -> list[tuple[uint16, str]]:
|
|
67
68
|
return [
|
|
68
69
|
(
|
|
69
70
|
capability
|
|
@@ -102,7 +103,7 @@ async def setup_full_node(
|
|
|
102
103
|
sanitize_weight_proof_only: bool = False,
|
|
103
104
|
connect_to_daemon: bool = False,
|
|
104
105
|
db_version: int = 1,
|
|
105
|
-
disable_capabilities: Optional[
|
|
106
|
+
disable_capabilities: Optional[list[Capability]] = None,
|
|
106
107
|
*,
|
|
107
108
|
reuse_db: bool = False,
|
|
108
109
|
) -> AsyncGenerator[Union[FullNodeService, SimulatorFullNodeService], None]:
|
|
@@ -309,7 +310,7 @@ async def setup_wallet_node(
|
|
|
309
310
|
break
|
|
310
311
|
except PermissionError as e:
|
|
311
312
|
print(f"db_path.unlink(): {e}")
|
|
312
|
-
|
|
313
|
+
await asyncio.sleep(0.1)
|
|
313
314
|
# filesystem operations are async on windows
|
|
314
315
|
# [WinError 32] The process cannot access the file because it is
|
|
315
316
|
# being used by another process
|
|
@@ -413,7 +414,7 @@ async def setup_introducer(bt: BlockTools, port: int) -> AsyncGenerator[Introduc
|
|
|
413
414
|
async def setup_vdf_client(bt: BlockTools, self_hostname: str, port: int) -> AsyncIterator[None]:
|
|
414
415
|
find_vdf_client() # raises FileNotFoundError if not found
|
|
415
416
|
process_mgr = VDFClientProcessMgr()
|
|
416
|
-
vdf_task_1 =
|
|
417
|
+
vdf_task_1 = create_referenced_task(
|
|
417
418
|
spawn_process(self_hostname, port, 1, process_mgr, prefer_ipv6=bt.config.get("prefer_ipv6", False)),
|
|
418
419
|
name="vdf_client_1",
|
|
419
420
|
)
|
|
@@ -447,7 +448,7 @@ async def setup_vdf_clients(bt: BlockTools, self_hostname: str, port: int) -> As
|
|
|
447
448
|
prefer_ipv6 = bt.config.get("prefer_ipv6", False)
|
|
448
449
|
for i in range(1, 4):
|
|
449
450
|
tasks.append(
|
|
450
|
-
|
|
451
|
+
create_referenced_task(
|
|
451
452
|
spawn_process(
|
|
452
453
|
host=self_hostname, port=port, counter=i, process_mgr=process_mgr, prefer_ipv6=prefer_ipv6
|
|
453
454
|
),
|
|
@@ -482,7 +483,7 @@ async def setup_timelord(
|
|
|
482
483
|
full_node_port: int,
|
|
483
484
|
sanitizer: bool,
|
|
484
485
|
consensus_constants: ConsensusConstants,
|
|
485
|
-
config:
|
|
486
|
+
config: dict[str, Any],
|
|
486
487
|
root_path: Path,
|
|
487
488
|
vdf_port: uint16 = uint16(0),
|
|
488
489
|
) -> AsyncGenerator[TimelordService, None]:
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Dict, List
|
|
4
|
-
|
|
5
3
|
from chia.rpc.full_node_rpc_api import FullNodeRpcApi
|
|
6
4
|
from chia.rpc.rpc_server import Endpoint, EndpointResult
|
|
7
5
|
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
@@ -19,7 +17,7 @@ class SimulatorFullNodeRpcApi(FullNodeRpcApi):
|
|
|
19
17
|
assert isinstance(self.service.server.api, FullNodeSimulator)
|
|
20
18
|
return self.service.server.api
|
|
21
19
|
|
|
22
|
-
def get_routes(self) ->
|
|
20
|
+
def get_routes(self) -> dict[str, Endpoint]:
|
|
23
21
|
routes = super().get_routes()
|
|
24
22
|
routes["/get_all_blocks"] = self.get_all_blocks
|
|
25
23
|
routes["/farm_block"] = self.farm_block
|
|
@@ -32,11 +30,11 @@ class SimulatorFullNodeRpcApi(FullNodeRpcApi):
|
|
|
32
30
|
routes["/reorg_blocks"] = self.reorg_blocks
|
|
33
31
|
return routes
|
|
34
32
|
|
|
35
|
-
async def get_all_blocks(self, _request:
|
|
36
|
-
all_blocks:
|
|
33
|
+
async def get_all_blocks(self, _request: dict[str, object]) -> EndpointResult:
|
|
34
|
+
all_blocks: list[FullBlock] = await self.simulator_api.get_all_full_blocks()
|
|
37
35
|
return {"blocks": [block.to_json_dict() for block in all_blocks]}
|
|
38
36
|
|
|
39
|
-
async def farm_block(self, _request:
|
|
37
|
+
async def farm_block(self, _request: dict[str, object]) -> EndpointResult:
|
|
40
38
|
request_address = str(_request["address"])
|
|
41
39
|
guarantee_tx_block = bool(_request.get("guarantee_tx_block", False))
|
|
42
40
|
blocks = int(str(_request.get("blocks", 1))) # mypy made me do this
|
|
@@ -51,29 +49,29 @@ class SimulatorFullNodeRpcApi(FullNodeRpcApi):
|
|
|
51
49
|
await self.simulator_api.farm_new_block(req)
|
|
52
50
|
return {"new_peak_height": (cur_height if cur_height is not None else 0) + blocks}
|
|
53
51
|
|
|
54
|
-
async def set_auto_farming(self, _request:
|
|
52
|
+
async def set_auto_farming(self, _request: dict[str, object]) -> EndpointResult:
|
|
55
53
|
auto_farm = bool(_request["auto_farm"])
|
|
56
54
|
result = await self.simulator_api.update_autofarm_config(auto_farm)
|
|
57
55
|
return {"auto_farm_enabled": result}
|
|
58
56
|
|
|
59
|
-
async def get_auto_farming(self, _request:
|
|
57
|
+
async def get_auto_farming(self, _request: dict[str, object]) -> EndpointResult:
|
|
60
58
|
return {"auto_farm_enabled": self.simulator_api.auto_farm}
|
|
61
59
|
|
|
62
|
-
async def get_farming_ph(self, _request:
|
|
60
|
+
async def get_farming_ph(self, _request: dict[str, object]) -> EndpointResult:
|
|
63
61
|
return {"puzzle_hash": self.simulator_api.bt.farmer_ph.hex()}
|
|
64
62
|
|
|
65
|
-
async def get_all_coins(self, _request:
|
|
63
|
+
async def get_all_coins(self, _request: dict[str, object]) -> EndpointResult:
|
|
66
64
|
p_request = GetAllCoinsProtocol(bool(_request.get("include_spent_coins", False)))
|
|
67
|
-
result:
|
|
65
|
+
result: list[CoinRecord] = await self.simulator_api.get_all_coins(p_request)
|
|
68
66
|
return {"coin_records": [coin_record.to_json_dict() for coin_record in result]}
|
|
69
67
|
|
|
70
|
-
async def get_all_puzzle_hashes(self, _request:
|
|
68
|
+
async def get_all_puzzle_hashes(self, _request: dict[str, object]) -> EndpointResult:
|
|
71
69
|
result = await self.simulator_api.get_all_puzzle_hashes()
|
|
72
70
|
return {
|
|
73
71
|
"puzzle_hashes": {puzzle_hash.hex(): (amount, num_tx) for (puzzle_hash, (amount, num_tx)) in result.items()}
|
|
74
72
|
}
|
|
75
73
|
|
|
76
|
-
async def revert_blocks(self, _request:
|
|
74
|
+
async def revert_blocks(self, _request: dict[str, object]) -> EndpointResult:
|
|
77
75
|
blocks = int(str(_request.get("num_of_blocks", 1))) # number of blocks to revert
|
|
78
76
|
all_blocks = bool(_request.get("delete_all_blocks", False)) # revert all blocks
|
|
79
77
|
height = self.service.blockchain.get_peak_height()
|
|
@@ -84,7 +82,7 @@ class SimulatorFullNodeRpcApi(FullNodeRpcApi):
|
|
|
84
82
|
await self.simulator_api.revert_block_height(uint32(new_height))
|
|
85
83
|
return {"new_peak_height": new_height}
|
|
86
84
|
|
|
87
|
-
async def reorg_blocks(self, _request:
|
|
85
|
+
async def reorg_blocks(self, _request: dict[str, object]) -> EndpointResult:
|
|
88
86
|
fork_blocks = int(str(_request.get("num_of_blocks_to_rev", 1))) # number of blocks to go back
|
|
89
87
|
new_blocks = int(str(_request.get("num_of_new_blocks", 1))) # how many extra blocks should we add
|
|
90
88
|
all_blocks = bool(_request.get("revert_all_blocks", False)) # fork all blocks
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Dict, List, Tuple
|
|
4
|
-
|
|
5
3
|
from chia.rpc.full_node_rpc_client import FullNodeRpcClient
|
|
6
4
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
7
5
|
from chia.types.coin_record import CoinRecord
|
|
@@ -11,7 +9,7 @@ from chia.util.ints import uint128
|
|
|
11
9
|
|
|
12
10
|
|
|
13
11
|
class SimulatorFullNodeRpcClient(FullNodeRpcClient):
|
|
14
|
-
async def get_all_blocks(self) ->
|
|
12
|
+
async def get_all_blocks(self) -> list[FullBlock]:
|
|
15
13
|
json_blocks = (await self.fetch("get_all_blocks", {}))["blocks"]
|
|
16
14
|
return [FullBlock.from_json_dict(block) for block in json_blocks]
|
|
17
15
|
|
|
@@ -34,11 +32,11 @@ class SimulatorFullNodeRpcClient(FullNodeRpcClient):
|
|
|
34
32
|
result = await self.fetch("get_farming_ph", {})
|
|
35
33
|
return bytes32.from_hexstr(result["puzzle_hash"])
|
|
36
34
|
|
|
37
|
-
async def get_all_coins(self, include_spent_coins: bool = False) ->
|
|
35
|
+
async def get_all_coins(self, include_spent_coins: bool = False) -> list[CoinRecord]:
|
|
38
36
|
json_result = await self.fetch("get_all_coins", {"include_spent_coins": include_spent_coins})
|
|
39
37
|
return [CoinRecord.from_json_dict(coin_records) for coin_records in json_result["coin_records"]]
|
|
40
38
|
|
|
41
|
-
async def get_all_puzzle_hashes(self) ->
|
|
39
|
+
async def get_all_puzzle_hashes(self) -> dict[bytes32, tuple[uint128, int]]:
|
|
42
40
|
str_result = (await self.fetch("get_all_puzzle_hashes", {}))["puzzle_hashes"]
|
|
43
41
|
return {bytes32.from_hexstr(ph): (uint128(amount), num_tx) for (ph, (amount, num_tx)) in str_result.items()}
|
|
44
42
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
|
+
from collections.abc import AsyncGenerator
|
|
4
5
|
from pathlib import Path
|
|
5
|
-
from typing import Any,
|
|
6
|
+
from typing import Any, Optional
|
|
6
7
|
|
|
7
8
|
from chia_rs import PrivateKey
|
|
8
9
|
|
|
@@ -34,7 +35,7 @@ These functions are used to test the simulator.
|
|
|
34
35
|
"""
|
|
35
36
|
|
|
36
37
|
|
|
37
|
-
def mnemonic_fingerprint(keychain: Keychain) ->
|
|
38
|
+
def mnemonic_fingerprint(keychain: Keychain) -> tuple[str, int]:
|
|
38
39
|
mnemonic = (
|
|
39
40
|
"today grape album ticket joy idle supreme sausage "
|
|
40
41
|
"oppose voice angle roast you oven betray exact "
|
|
@@ -62,10 +63,10 @@ def get_puzzle_hash_from_key(keychain: Keychain, fingerprint: int, key_id: int =
|
|
|
62
63
|
def create_config(
|
|
63
64
|
chia_root: Path,
|
|
64
65
|
fingerprint: int,
|
|
65
|
-
private_ca_crt_and_key:
|
|
66
|
-
node_certs_and_keys:
|
|
66
|
+
private_ca_crt_and_key: tuple[bytes, bytes],
|
|
67
|
+
node_certs_and_keys: dict[str, dict[str, dict[str, bytes]]],
|
|
67
68
|
keychain: Keychain,
|
|
68
|
-
) ->
|
|
69
|
+
) -> dict[str, Any]:
|
|
69
70
|
# create chia directories
|
|
70
71
|
create_default_chia_config(chia_root)
|
|
71
72
|
create_all_ssl(
|
|
@@ -119,8 +120,8 @@ async def get_full_chia_simulator(
|
|
|
119
120
|
chia_root: Path,
|
|
120
121
|
keychain: Optional[Keychain] = None,
|
|
121
122
|
automated_testing: bool = False,
|
|
122
|
-
config: Optional[
|
|
123
|
-
) -> AsyncGenerator[
|
|
123
|
+
config: Optional[dict[str, Any]] = None,
|
|
124
|
+
) -> AsyncGenerator[tuple[FullNodeSimulator, Path, dict[str, Any], str, int, Keychain], None]:
|
|
124
125
|
"""
|
|
125
126
|
A chia root Path is required.
|
|
126
127
|
The chia root Path can be a temporary directory (tempfile.TemporaryDirectory)
|
chia/simulator/socket.py
CHANGED
|
@@ -2,14 +2,11 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import socket
|
|
4
4
|
from contextlib import closing
|
|
5
|
-
from typing import Set
|
|
6
5
|
|
|
7
|
-
recent_ports:
|
|
6
|
+
recent_ports: set[int] = set()
|
|
8
7
|
|
|
9
8
|
|
|
10
9
|
def find_available_listen_port(name: str = "free") -> int:
|
|
11
|
-
global recent_ports
|
|
12
|
-
|
|
13
10
|
while True:
|
|
14
11
|
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
|
|
15
12
|
try:
|