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
|
@@ -7,10 +7,11 @@ import random
|
|
|
7
7
|
import re
|
|
8
8
|
import statistics
|
|
9
9
|
import time
|
|
10
|
+
from collections.abc import Awaitable
|
|
10
11
|
from dataclasses import dataclass
|
|
11
12
|
from pathlib import Path
|
|
12
13
|
from random import Random
|
|
13
|
-
from typing import Any,
|
|
14
|
+
from typing import Any, Callable, Optional, cast
|
|
14
15
|
|
|
15
16
|
import aiohttp
|
|
16
17
|
import aiosqlite
|
|
@@ -55,7 +56,7 @@ log = logging.getLogger(__name__)
|
|
|
55
56
|
pytestmark = pytest.mark.data_layer
|
|
56
57
|
|
|
57
58
|
|
|
58
|
-
table_columns:
|
|
59
|
+
table_columns: dict[str, list[str]] = {
|
|
59
60
|
"node": ["hash", "node_type", "left", "right", "key", "value"],
|
|
60
61
|
"root": ["tree_id", "generation", "node_hash", "status"],
|
|
61
62
|
}
|
|
@@ -66,7 +67,7 @@ table_columns: Dict[str, List[str]] = {
|
|
|
66
67
|
|
|
67
68
|
|
|
68
69
|
@pytest.mark.anyio
|
|
69
|
-
async def test_valid_node_values_fixture_are_valid(data_store: DataStore, valid_node_values:
|
|
70
|
+
async def test_valid_node_values_fixture_are_valid(data_store: DataStore, valid_node_values: dict[str, Any]) -> None:
|
|
70
71
|
async with data_store.db_wrapper.writer() as writer:
|
|
71
72
|
await writer.execute(
|
|
72
73
|
"""
|
|
@@ -80,7 +81,7 @@ async def test_valid_node_values_fixture_are_valid(data_store: DataStore, valid_
|
|
|
80
81
|
@pytest.mark.parametrize(argnames=["table_name", "expected_columns"], argvalues=table_columns.items())
|
|
81
82
|
@pytest.mark.anyio
|
|
82
83
|
async def test_create_creates_tables_and_columns(
|
|
83
|
-
database_uri: str, table_name: str, expected_columns:
|
|
84
|
+
database_uri: str, table_name: str, expected_columns: list[str]
|
|
84
85
|
) -> None:
|
|
85
86
|
# Never string-interpolate sql queries... Except maybe in tests when it does not
|
|
86
87
|
# allow you to parametrize the query.
|
|
@@ -101,7 +102,7 @@ async def test_create_creates_tables_and_columns(
|
|
|
101
102
|
|
|
102
103
|
@pytest.mark.anyio
|
|
103
104
|
async def test_create_tree_accepts_bytes32(raw_data_store: DataStore) -> None:
|
|
104
|
-
store_id = bytes32
|
|
105
|
+
store_id = bytes32.zeros
|
|
105
106
|
|
|
106
107
|
await raw_data_store.create_tree(store_id=store_id)
|
|
107
108
|
|
|
@@ -298,7 +299,7 @@ async def test_get_ancestors(data_store: DataStore, store_id: bytes32) -> None:
|
|
|
298
299
|
|
|
299
300
|
@pytest.mark.anyio
|
|
300
301
|
async def test_get_ancestors_optimized(data_store: DataStore, store_id: bytes32) -> None:
|
|
301
|
-
ancestors:
|
|
302
|
+
ancestors: list[tuple[int, bytes32, list[InternalNode]]] = []
|
|
302
303
|
random = Random()
|
|
303
304
|
random.seed(100, version=2)
|
|
304
305
|
|
|
@@ -385,23 +386,23 @@ async def test_batch_update(
|
|
|
385
386
|
) -> None:
|
|
386
387
|
total_operations = 1000 if use_optimized else 100
|
|
387
388
|
num_ops_per_batch = total_operations // num_batches
|
|
388
|
-
saved_batches:
|
|
389
|
-
saved_kv:
|
|
389
|
+
saved_batches: list[list[dict[str, Any]]] = []
|
|
390
|
+
saved_kv: list[list[TerminalNode]] = []
|
|
390
391
|
db_uri = generate_in_memory_db_uri()
|
|
391
392
|
async with DataStore.managed(database=db_uri, uri=True) as single_op_data_store:
|
|
392
393
|
await single_op_data_store.create_tree(store_id, status=Status.COMMITTED)
|
|
393
394
|
random = Random()
|
|
394
395
|
random.seed(100, version=2)
|
|
395
396
|
|
|
396
|
-
batch:
|
|
397
|
-
keys_values:
|
|
397
|
+
batch: list[dict[str, Any]] = []
|
|
398
|
+
keys_values: dict[bytes, bytes] = {}
|
|
398
399
|
for operation in range(num_batches * num_ops_per_batch):
|
|
399
400
|
[op_type] = random.choices(
|
|
400
401
|
["insert", "upsert-insert", "upsert-update", "delete"],
|
|
401
402
|
[0.4, 0.2, 0.2, 0.2],
|
|
402
403
|
k=1,
|
|
403
404
|
)
|
|
404
|
-
if op_type
|
|
405
|
+
if op_type in {"insert", "upsert-insert"} or len(keys_values) == 0:
|
|
405
406
|
if len(keys_values) == 0:
|
|
406
407
|
op_type = "insert"
|
|
407
408
|
key = operation.to_bytes(4, byteorder="big")
|
|
@@ -468,8 +469,8 @@ async def test_batch_update(
|
|
|
468
469
|
assert {node.key: node.value for node in current_kv} == {
|
|
469
470
|
node.key: node.value for node in saved_kv[batch_number]
|
|
470
471
|
}
|
|
471
|
-
queue:
|
|
472
|
-
ancestors:
|
|
472
|
+
queue: list[bytes32] = [root.node_hash]
|
|
473
|
+
ancestors: dict[bytes32, bytes32] = {}
|
|
473
474
|
while len(queue) > 0:
|
|
474
475
|
node_hash = queue.pop(0)
|
|
475
476
|
expected_ancestors = []
|
|
@@ -722,7 +723,7 @@ async def test_autoinsert_balances_gaps(data_store: DataStore, store_id: bytes32
|
|
|
722
723
|
if i == 0 or i > 10:
|
|
723
724
|
insert_result = await data_store.autoinsert(key, value, store_id, status=Status.COMMITTED)
|
|
724
725
|
else:
|
|
725
|
-
reference_node_hash = await data_store.get_terminal_node_for_seed(store_id, bytes32
|
|
726
|
+
reference_node_hash = await data_store.get_terminal_node_for_seed(store_id, bytes32.zeros)
|
|
726
727
|
insert_result = await data_store.insert(
|
|
727
728
|
key=key,
|
|
728
729
|
value=value,
|
|
@@ -1124,7 +1125,7 @@ async def test_kv_diff(data_store: DataStore, store_id: bytes32) -> None:
|
|
|
1124
1125
|
random = Random()
|
|
1125
1126
|
random.seed(100, version=2)
|
|
1126
1127
|
insertions = 0
|
|
1127
|
-
expected_diff:
|
|
1128
|
+
expected_diff: set[DiffData] = set()
|
|
1128
1129
|
root_start = None
|
|
1129
1130
|
for i in range(500):
|
|
1130
1131
|
key = (i + 100).to_bytes(4, byteorder="big")
|
|
@@ -1175,7 +1176,7 @@ async def test_kv_diff_2(data_store: DataStore, store_id: bytes32) -> None:
|
|
|
1175
1176
|
reference_node_hash=None,
|
|
1176
1177
|
side=None,
|
|
1177
1178
|
)
|
|
1178
|
-
empty_hash = bytes32
|
|
1179
|
+
empty_hash = bytes32.zeros
|
|
1179
1180
|
invalid_hash = bytes32([0] * 31 + [1])
|
|
1180
1181
|
diff_1 = await data_store.get_kv_diff(store_id, empty_hash, insert_result.node_hash)
|
|
1181
1182
|
assert diff_1 == {DiffData(OperationType.INSERT, b"000", b"000")}
|
|
@@ -1251,7 +1252,7 @@ async def test_subscribe_unsubscribe(data_store: DataStore, store_id: bytes32) -
|
|
|
1251
1252
|
|
|
1252
1253
|
await data_store.unsubscribe(store_id)
|
|
1253
1254
|
assert await data_store.get_subscriptions() == []
|
|
1254
|
-
store_id2 = bytes32
|
|
1255
|
+
store_id2 = bytes32.zeros
|
|
1255
1256
|
|
|
1256
1257
|
await data_store.subscribe(
|
|
1257
1258
|
Subscription(
|
|
@@ -1422,7 +1423,7 @@ async def test_data_server_files(
|
|
|
1422
1423
|
group_files_by_store: bool,
|
|
1423
1424
|
tmp_path: Path,
|
|
1424
1425
|
) -> None:
|
|
1425
|
-
roots:
|
|
1426
|
+
roots: list[Root] = []
|
|
1426
1427
|
num_batches = 10
|
|
1427
1428
|
num_ops_per_batch = 100
|
|
1428
1429
|
|
|
@@ -1432,11 +1433,11 @@ async def test_data_server_files(
|
|
|
1432
1433
|
random = Random()
|
|
1433
1434
|
random.seed(100, version=2)
|
|
1434
1435
|
|
|
1435
|
-
keys:
|
|
1436
|
+
keys: list[bytes] = []
|
|
1436
1437
|
counter = 0
|
|
1437
1438
|
|
|
1438
1439
|
for batch in range(num_batches):
|
|
1439
|
-
changelist:
|
|
1440
|
+
changelist: list[dict[str, Any]] = []
|
|
1440
1441
|
for operation in range(num_ops_per_batch):
|
|
1441
1442
|
if random.randint(0, 4) > 0 or len(keys) == 0:
|
|
1442
1443
|
key = counter.to_bytes(4, byteorder="big")
|
|
@@ -1649,7 +1650,7 @@ async def test_benchmark_batch_insert_speed_multiple_batches(
|
|
|
1649
1650
|
|
|
1650
1651
|
@pytest.mark.anyio
|
|
1651
1652
|
async def test_delete_store_data(raw_data_store: DataStore) -> None:
|
|
1652
|
-
store_id = bytes32
|
|
1653
|
+
store_id = bytes32.zeros
|
|
1653
1654
|
store_id_2 = bytes32(b"\0" * 31 + b"\1")
|
|
1654
1655
|
await raw_data_store.create_tree(store_id=store_id, status=Status.COMMITTED)
|
|
1655
1656
|
await raw_data_store.create_tree(store_id=store_id_2, status=Status.COMMITTED)
|
|
@@ -1864,7 +1865,7 @@ async def test_insert_from_delta_file(
|
|
|
1864
1865
|
for generation in range(1, num_files + 2):
|
|
1865
1866
|
root = await data_store.get_tree_root(store_id=store_id, generation=generation)
|
|
1866
1867
|
await write_files_for_root(data_store, store_id, root, tmp_path_1, 0, False, group_files_by_store)
|
|
1867
|
-
root_hashes.append(bytes32
|
|
1868
|
+
root_hashes.append(bytes32.zeros if root.node_hash is None else root.node_hash)
|
|
1868
1869
|
store_path = tmp_path_1.joinpath(f"{store_id}") if group_files_by_store else tmp_path_1
|
|
1869
1870
|
with os.scandir(store_path) as entries:
|
|
1870
1871
|
filenames = {entry.name for entry in entries}
|
|
@@ -2019,7 +2020,7 @@ async def test_insert_from_delta_file_correct_file_exists(
|
|
|
2019
2020
|
for generation in range(1, num_files + 2):
|
|
2020
2021
|
root = await data_store.get_tree_root(store_id=store_id, generation=generation)
|
|
2021
2022
|
await write_files_for_root(data_store, store_id, root, tmp_path, 0, group_by_store=group_files_by_store)
|
|
2022
|
-
root_hashes.append(bytes32
|
|
2023
|
+
root_hashes.append(bytes32.zeros if root.node_hash is None else root.node_hash)
|
|
2023
2024
|
store_path = tmp_path.joinpath(f"{store_id}") if group_files_by_store else tmp_path
|
|
2024
2025
|
with os.scandir(store_path) as entries:
|
|
2025
2026
|
filenames = {entry.name for entry in entries}
|
|
@@ -2156,7 +2157,7 @@ async def test_update_keys(data_store: DataStore, store_id: bytes32, use_upsert:
|
|
|
2156
2157
|
num_values = 10
|
|
2157
2158
|
new_keys = 10
|
|
2158
2159
|
for value in range(num_values):
|
|
2159
|
-
changelist:
|
|
2160
|
+
changelist: list[dict[str, Any]] = []
|
|
2160
2161
|
bytes_value = value.to_bytes(4, byteorder="big")
|
|
2161
2162
|
if use_upsert:
|
|
2162
2163
|
for key in range(num_keys):
|
|
@@ -2201,10 +2202,10 @@ async def test_migration_unknown_version(data_store: DataStore) -> None:
|
|
|
2201
2202
|
|
|
2202
2203
|
async def _check_ancestors(
|
|
2203
2204
|
data_store: DataStore, store_id: bytes32, root_hash: bytes32
|
|
2204
|
-
) ->
|
|
2205
|
-
ancestors:
|
|
2205
|
+
) -> dict[bytes32, Optional[bytes32]]:
|
|
2206
|
+
ancestors: dict[bytes32, Optional[bytes32]] = {}
|
|
2206
2207
|
root_node: Node = await data_store.get_node(root_hash)
|
|
2207
|
-
queue:
|
|
2208
|
+
queue: list[Node] = [root_node]
|
|
2208
2209
|
|
|
2209
2210
|
while queue:
|
|
2210
2211
|
node = queue.pop(0)
|
|
@@ -2231,7 +2232,7 @@ async def _check_ancestors(
|
|
|
2231
2232
|
@pytest.mark.anyio
|
|
2232
2233
|
async def test_build_ancestor_table(data_store: DataStore, store_id: bytes32) -> None:
|
|
2233
2234
|
num_values = 1000
|
|
2234
|
-
changelist:
|
|
2235
|
+
changelist: list[dict[str, Any]] = []
|
|
2235
2236
|
for value in range(num_values):
|
|
2236
2237
|
value_bytes = value.to_bytes(4, byteorder="big")
|
|
2237
2238
|
changelist.append({"action": "upsert", "key": value_bytes, "value": value_bytes})
|
|
@@ -2295,12 +2296,12 @@ async def test_sparse_ancestor_table(data_store: DataStore, store_id: bytes32) -
|
|
|
2295
2296
|
assert previous_generation_count == 184
|
|
2296
2297
|
|
|
2297
2298
|
|
|
2298
|
-
async def get_all_nodes(data_store: DataStore, store_id: bytes32) ->
|
|
2299
|
+
async def get_all_nodes(data_store: DataStore, store_id: bytes32) -> list[Node]:
|
|
2299
2300
|
root = await data_store.get_tree_root(store_id)
|
|
2300
2301
|
assert root.node_hash is not None
|
|
2301
2302
|
root_node = await data_store.get_node(root.node_hash)
|
|
2302
|
-
nodes:
|
|
2303
|
-
queue:
|
|
2303
|
+
nodes: list[Node] = []
|
|
2304
|
+
queue: list[Node] = [root_node]
|
|
2304
2305
|
|
|
2305
2306
|
while len(queue) > 0:
|
|
2306
2307
|
node = queue.pop(0)
|
|
@@ -2317,7 +2318,7 @@ async def get_all_nodes(data_store: DataStore, store_id: bytes32) -> List[Node]:
|
|
|
2317
2318
|
@pytest.mark.anyio
|
|
2318
2319
|
async def test_get_nodes(data_store: DataStore, store_id: bytes32) -> None:
|
|
2319
2320
|
num_values = 50
|
|
2320
|
-
changelist:
|
|
2321
|
+
changelist: list[dict[str, Any]] = []
|
|
2321
2322
|
|
|
2322
2323
|
for value in range(num_values):
|
|
2323
2324
|
value_bytes = value.to_bytes(4, byteorder="big")
|
|
@@ -2332,7 +2333,7 @@ async def test_get_nodes(data_store: DataStore, store_id: bytes32) -> None:
|
|
|
2332
2333
|
nodes = await data_store.get_nodes([node.hash for node in expected_nodes])
|
|
2333
2334
|
assert nodes == expected_nodes
|
|
2334
2335
|
|
|
2335
|
-
node_hash = bytes32
|
|
2336
|
+
node_hash = bytes32.zeros
|
|
2336
2337
|
node_hash_2 = bytes32([0] * 31 + [1])
|
|
2337
2338
|
with pytest.raises(Exception, match=f"^Nodes not found for hashes: {node_hash.hex()}, {node_hash_2.hex()}"):
|
|
2338
2339
|
await data_store.get_nodes([node_hash, node_hash_2] + [node.hash for node in expected_nodes])
|
|
@@ -2349,11 +2350,11 @@ async def test_get_leaf_at_minimum_height(
|
|
|
2349
2350
|
) -> None:
|
|
2350
2351
|
num_values = 1000
|
|
2351
2352
|
value_offset = 1000000
|
|
2352
|
-
all_min_leafs:
|
|
2353
|
+
all_min_leafs: set[TerminalNode] = set()
|
|
2353
2354
|
|
|
2354
2355
|
if pre > 0:
|
|
2355
2356
|
# This builds a complete binary tree, in order to test more than one batch in the queue before finding the leaf
|
|
2356
|
-
changelist:
|
|
2357
|
+
changelist: list[dict[str, Any]] = []
|
|
2357
2358
|
|
|
2358
2359
|
for value in range(pre):
|
|
2359
2360
|
value_bytes = (value * value).to_bytes(8, byteorder="big")
|
|
@@ -2375,12 +2376,12 @@ async def test_get_leaf_at_minimum_height(
|
|
|
2375
2376
|
)
|
|
2376
2377
|
|
|
2377
2378
|
if (value + 1) % batch_size == 0:
|
|
2378
|
-
hash_to_parent:
|
|
2379
|
+
hash_to_parent: dict[bytes32, InternalNode] = {}
|
|
2379
2380
|
root = await data_store.get_tree_root(store_id)
|
|
2380
2381
|
assert root.node_hash is not None
|
|
2381
2382
|
min_leaf = await data_store.get_leaf_at_minimum_height(root.node_hash, hash_to_parent)
|
|
2382
2383
|
all_nodes = await get_all_nodes(data_store, store_id)
|
|
2383
|
-
heights:
|
|
2384
|
+
heights: dict[bytes32, int] = {}
|
|
2384
2385
|
heights[root.node_hash] = 0
|
|
2385
2386
|
min_leaf_height = None
|
|
2386
2387
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import sqlite3
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
7
7
|
|
|
@@ -35,7 +35,7 @@ async def test_node_hash_must_be_32(
|
|
|
35
35
|
data_store: DataStore,
|
|
36
36
|
store_id: bytes32,
|
|
37
37
|
length: int,
|
|
38
|
-
valid_node_values:
|
|
38
|
+
valid_node_values: dict[str, Any],
|
|
39
39
|
) -> None:
|
|
40
40
|
valid_node_values["hash"] = bytes([0] * length)
|
|
41
41
|
|
|
@@ -54,7 +54,7 @@ async def test_node_hash_must_be_32(
|
|
|
54
54
|
async def test_node_hash_must_not_be_null(
|
|
55
55
|
data_store: DataStore,
|
|
56
56
|
store_id: bytes32,
|
|
57
|
-
valid_node_values:
|
|
57
|
+
valid_node_values: dict[str, Any],
|
|
58
58
|
) -> None:
|
|
59
59
|
valid_node_values["hash"] = None
|
|
60
60
|
|
|
@@ -74,7 +74,7 @@ async def test_node_type_must_be_valid(
|
|
|
74
74
|
data_store: DataStore,
|
|
75
75
|
node_type: NodeType,
|
|
76
76
|
bad_node_type: int,
|
|
77
|
-
valid_node_values:
|
|
77
|
+
valid_node_values: dict[str, Any],
|
|
78
78
|
) -> None:
|
|
79
79
|
valid_node_values["node_type"] = bad_node_type
|
|
80
80
|
|
|
@@ -212,7 +212,7 @@ async def test_root_generation_must_not_be_less_than_zero(
|
|
|
212
212
|
) -> None:
|
|
213
213
|
example = await add_01234567_example(data_store=data_store, store_id=store_id)
|
|
214
214
|
values = {
|
|
215
|
-
"tree_id": bytes32
|
|
215
|
+
"tree_id": bytes32.zeros,
|
|
216
216
|
"generation": generation,
|
|
217
217
|
"node_hash": example.terminal_nodes[0],
|
|
218
218
|
"status": Status.PENDING,
|
|
@@ -233,7 +233,7 @@ async def test_root_generation_must_not_be_less_than_zero(
|
|
|
233
233
|
async def test_root_generation_must_not_be_null(data_store: DataStore, store_id: bytes32) -> None:
|
|
234
234
|
example = await add_01234567_example(data_store=data_store, store_id=store_id)
|
|
235
235
|
values = {
|
|
236
|
-
"tree_id": bytes32
|
|
236
|
+
"tree_id": bytes32.zeros,
|
|
237
237
|
"generation": None,
|
|
238
238
|
"node_hash": example.terminal_nodes[0],
|
|
239
239
|
"status": Status.PENDING,
|
|
@@ -252,7 +252,7 @@ async def test_root_generation_must_not_be_null(data_store: DataStore, store_id:
|
|
|
252
252
|
|
|
253
253
|
@pytest.mark.anyio
|
|
254
254
|
async def test_root_node_hash_must_reference(data_store: DataStore) -> None:
|
|
255
|
-
values = {"tree_id": bytes32
|
|
255
|
+
values = {"tree_id": bytes32.zeros, "generation": 0, "node_hash": bytes32.zeros, "status": Status.PENDING}
|
|
256
256
|
|
|
257
257
|
async with data_store.db_wrapper.writer() as writer:
|
|
258
258
|
with pytest.raises(sqlite3.IntegrityError, match=r"^FOREIGN KEY constraint failed$"):
|
|
@@ -270,7 +270,7 @@ async def test_root_node_hash_must_reference(data_store: DataStore) -> None:
|
|
|
270
270
|
async def test_root_status_must_be_valid(data_store: DataStore, store_id: bytes32, bad_status: int) -> None:
|
|
271
271
|
example = await add_01234567_example(data_store=data_store, store_id=store_id)
|
|
272
272
|
values = {
|
|
273
|
-
"tree_id": bytes32
|
|
273
|
+
"tree_id": bytes32.zeros,
|
|
274
274
|
"generation": 0,
|
|
275
275
|
"node_hash": example.terminal_nodes[0],
|
|
276
276
|
"status": bad_status,
|
|
@@ -290,7 +290,7 @@ async def test_root_status_must_be_valid(data_store: DataStore, store_id: bytes3
|
|
|
290
290
|
@pytest.mark.anyio
|
|
291
291
|
async def test_root_status_must_not_be_null(data_store: DataStore, store_id: bytes32) -> None:
|
|
292
292
|
example = await add_01234567_example(data_store=data_store, store_id=store_id)
|
|
293
|
-
values = {"tree_id": bytes32
|
|
293
|
+
values = {"tree_id": bytes32.zeros, "generation": 0, "node_hash": example.terminal_nodes[0], "status": None}
|
|
294
294
|
|
|
295
295
|
async with data_store.db_wrapper.writer() as writer:
|
|
296
296
|
with pytest.raises(sqlite3.IntegrityError, match=r"^NOT NULL constraint failed: root.status$"):
|
|
@@ -334,7 +334,7 @@ async def test_ancestors_ancestor_must_be_32(
|
|
|
334
334
|
INSERT INTO ancestors(hash, ancestor, tree_id, generation)
|
|
335
335
|
VALUES(:hash, :ancestor, :tree_id, :generation)
|
|
336
336
|
""",
|
|
337
|
-
{"hash": node_hash, "ancestor": bytes([0] * length), "tree_id": bytes32
|
|
337
|
+
{"hash": node_hash, "ancestor": bytes([0] * length), "tree_id": bytes32.zeros, "generation": 0},
|
|
338
338
|
)
|
|
339
339
|
|
|
340
340
|
|
|
@@ -353,7 +353,7 @@ async def test_ancestors_store_id_must_be_32(
|
|
|
353
353
|
INSERT INTO ancestors(hash, ancestor, tree_id, generation)
|
|
354
354
|
VALUES(:hash, :ancestor, :tree_id, :generation)
|
|
355
355
|
""",
|
|
356
|
-
{"hash": node_hash, "ancestor": bytes32
|
|
356
|
+
{"hash": node_hash, "ancestor": bytes32.zeros, "tree_id": bytes([0] * length), "generation": 0},
|
|
357
357
|
)
|
|
358
358
|
|
|
359
359
|
|
|
@@ -6,8 +6,9 @@ import os
|
|
|
6
6
|
import pathlib
|
|
7
7
|
import shutil
|
|
8
8
|
import subprocess
|
|
9
|
+
from collections.abc import Iterator
|
|
9
10
|
from dataclasses import dataclass
|
|
10
|
-
from typing import IO, TYPE_CHECKING, Any,
|
|
11
|
+
from typing import IO, TYPE_CHECKING, Any, Literal, Optional, Union, overload
|
|
11
12
|
|
|
12
13
|
from chia.data_layer.data_layer_util import InternalNode, Node, NodeType, Side, Status, TerminalNode
|
|
13
14
|
from chia.data_layer.data_store import DataStore
|
|
@@ -15,7 +16,7 @@ from chia.types.blockchain_format.program import Program
|
|
|
15
16
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
16
17
|
|
|
17
18
|
# from subprocess.pyi
|
|
18
|
-
_FILE = Union[
|
|
19
|
+
_FILE = Union[int, IO[Any], None]
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
if TYPE_CHECKING:
|
|
@@ -49,7 +50,7 @@ async def general_insert(
|
|
|
49
50
|
@dataclass(frozen=True)
|
|
50
51
|
class Example:
|
|
51
52
|
expected: Node
|
|
52
|
-
terminal_nodes:
|
|
53
|
+
terminal_nodes: list[bytes32]
|
|
53
54
|
|
|
54
55
|
|
|
55
56
|
async def add_0123_example(data_store: DataStore, store_id: bytes32) -> Example:
|
|
@@ -121,7 +122,7 @@ class ChiaRoot:
|
|
|
121
122
|
|
|
122
123
|
def run(
|
|
123
124
|
self,
|
|
124
|
-
args:
|
|
125
|
+
args: list[Union[str, os_PathLike_str]],
|
|
125
126
|
*other_args: Any,
|
|
126
127
|
check: bool = True,
|
|
127
128
|
encoding: str = "utf-8",
|
|
@@ -141,13 +142,13 @@ class ChiaRoot:
|
|
|
141
142
|
chia_executable = shutil.which("chia")
|
|
142
143
|
if chia_executable is None:
|
|
143
144
|
chia_executable = "chia"
|
|
144
|
-
modified_args:
|
|
145
|
+
modified_args: list[Union[str, os_PathLike_str]] = [
|
|
145
146
|
self.scripts_path.joinpath(chia_executable),
|
|
146
147
|
"--root-path",
|
|
147
148
|
self.path,
|
|
148
149
|
*args,
|
|
149
150
|
]
|
|
150
|
-
processed_args:
|
|
151
|
+
processed_args: list[str] = [os.fspath(element) for element in modified_args]
|
|
151
152
|
final_args = [processed_args, *other_args]
|
|
152
153
|
|
|
153
154
|
kwargs["check"] = check
|
|
@@ -156,7 +157,7 @@ class ChiaRoot:
|
|
|
156
157
|
kwargs["stderr"] = stderr
|
|
157
158
|
|
|
158
159
|
try:
|
|
159
|
-
return subprocess.run(*final_args, **kwargs)
|
|
160
|
+
return subprocess.run(*final_args, **kwargs) # noqa: PLW1510
|
|
160
161
|
except OSError as e:
|
|
161
162
|
raise Exception(f"failed to run:\n {final_args}\n {kwargs}") from e
|
|
162
163
|
|
|
@@ -191,20 +192,20 @@ def create_valid_node_values(
|
|
|
191
192
|
node_type: Literal[NodeType.INTERNAL],
|
|
192
193
|
left_hash: bytes32,
|
|
193
194
|
right_hash: bytes32,
|
|
194
|
-
) ->
|
|
195
|
+
) -> dict[str, Any]: ...
|
|
195
196
|
|
|
196
197
|
|
|
197
198
|
@overload
|
|
198
199
|
def create_valid_node_values(
|
|
199
200
|
node_type: Literal[NodeType.TERMINAL],
|
|
200
|
-
) ->
|
|
201
|
+
) -> dict[str, Any]: ...
|
|
201
202
|
|
|
202
203
|
|
|
203
204
|
def create_valid_node_values(
|
|
204
205
|
node_type: NodeType,
|
|
205
206
|
left_hash: Optional[bytes32] = None,
|
|
206
207
|
right_hash: Optional[bytes32] = None,
|
|
207
|
-
) ->
|
|
208
|
+
) -> dict[str, Any]:
|
|
208
209
|
if node_type == NodeType.INTERNAL:
|
|
209
210
|
assert left_hash is not None
|
|
210
211
|
assert right_hash is not None
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from asyncio import Task,
|
|
4
|
-
from
|
|
3
|
+
from asyncio import Task, gather, sleep
|
|
4
|
+
from collections.abc import Coroutine
|
|
5
|
+
from typing import Any, Optional, TypeVar
|
|
5
6
|
|
|
6
7
|
import pytest
|
|
7
8
|
|
|
@@ -19,13 +20,14 @@ from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
|
19
20
|
from chia.server.outbound_message import Message, NodeType
|
|
20
21
|
from chia.util.hash import std_hash
|
|
21
22
|
from chia.util.ints import uint8, uint32, uint64
|
|
23
|
+
from chia.util.task_referencer import create_referenced_task
|
|
22
24
|
|
|
23
25
|
T = TypeVar("T")
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
async def begin_task(coro: Coroutine[Any, Any, T]) -> Task[T]:
|
|
27
29
|
"""Awaitable function that adds a coroutine to the event loop and sets it running."""
|
|
28
|
-
task =
|
|
30
|
+
task = create_referenced_task(coro)
|
|
29
31
|
await sleep(0)
|
|
30
32
|
|
|
31
33
|
return task
|
|
@@ -38,7 +40,7 @@ async def test_farmer_ignores_concurrent_duplicate_signage_points(
|
|
|
38
40
|
_, farmer_service, _ = farmer_one_harvester
|
|
39
41
|
farmer_api: FarmerAPI = farmer_service._api
|
|
40
42
|
farmer_server = farmer_service._server
|
|
41
|
-
incoming_queue,
|
|
43
|
+
incoming_queue, _peer_id = await add_dummy_connection(farmer_server, self_hostname, 12312, NodeType.HARVESTER)
|
|
42
44
|
# Consume the handshake
|
|
43
45
|
response = (await incoming_queue.get()).type
|
|
44
46
|
assert ProtocolMessageTypes(response).name == "harvester_handshake"
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
# flake8: noqa: F811, F401
|
|
2
1
|
from __future__ import annotations
|
|
3
2
|
|
|
4
3
|
import asyncio
|
|
5
|
-
import dataclasses
|
|
6
4
|
import logging
|
|
7
5
|
import time
|
|
8
|
-
from typing import List
|
|
9
6
|
|
|
10
7
|
import pytest
|
|
11
8
|
|
|
12
|
-
from chia._tests.conftest import ConsensusMode
|
|
13
9
|
from chia._tests.core.node_height import node_height_between, node_height_exactly
|
|
14
10
|
from chia._tests.util.time_out_assert import time_out_assert
|
|
15
11
|
from chia.full_node.full_node import FullNode
|
|
@@ -31,7 +27,7 @@ class TestFullSync:
|
|
|
31
27
|
async def test_long_sync_from_zero(self, five_nodes, default_400_blocks, bt, self_hostname):
|
|
32
28
|
# Must be larger than "sync_block_behind_threshold" in the config
|
|
33
29
|
num_blocks = len(default_400_blocks)
|
|
34
|
-
blocks:
|
|
30
|
+
blocks: list[FullBlock] = default_400_blocks
|
|
35
31
|
full_node_1, full_node_2, full_node_3, full_node_4, full_node_5 = five_nodes
|
|
36
32
|
server_1 = full_node_1.full_node.server
|
|
37
33
|
server_2 = full_node_2.full_node.server
|
|
@@ -117,7 +113,6 @@ class TestFullSync:
|
|
|
117
113
|
async def test_sync_from_fork_point_and_weight_proof(
|
|
118
114
|
self, three_nodes, default_1000_blocks, default_400_blocks, self_hostname
|
|
119
115
|
):
|
|
120
|
-
start = time.time()
|
|
121
116
|
# Must be larger than "sync_block_behind_threshold" in the config
|
|
122
117
|
num_blocks_initial = len(default_1000_blocks) - 50
|
|
123
118
|
blocks_950 = default_1000_blocks[:num_blocks_initial]
|
|
@@ -345,7 +340,7 @@ class TestFullSync:
|
|
|
345
340
|
assert peak1 is not None
|
|
346
341
|
|
|
347
342
|
summary_heights = full_node_1.full_node.blockchain.get_ses_heights()
|
|
348
|
-
summaries:
|
|
343
|
+
summaries: list[SubEpochSummary] = []
|
|
349
344
|
|
|
350
345
|
# get ses list
|
|
351
346
|
for sub_epoch_n, ses_height in enumerate(summary_heights):
|
|
@@ -395,7 +390,7 @@ class TestFullSync:
|
|
|
395
390
|
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
396
391
|
await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
|
|
397
392
|
|
|
398
|
-
peers:
|
|
393
|
+
peers: list = [c for c in full_node_2.full_node.server.all_connections.values()]
|
|
399
394
|
request = full_node_protocol.RequestProofOfWeight(
|
|
400
395
|
blocks_950[-1].height + 1, default_1000_blocks[-1].header_hash
|
|
401
396
|
)
|
|
@@ -406,7 +401,7 @@ class TestFullSync:
|
|
|
406
401
|
log.info(f"result was {res}")
|
|
407
402
|
assert duration < 1
|
|
408
403
|
|
|
409
|
-
peers:
|
|
404
|
+
peers: list = [c for c in full_node_3.full_node.server.all_connections.values()]
|
|
410
405
|
request = full_node_protocol.RequestProofOfWeight(
|
|
411
406
|
blocks_950[-1].height + 1, default_1000_blocks[-1].header_hash
|
|
412
407
|
)
|
|
@@ -420,7 +415,7 @@ class TestFullSync:
|
|
|
420
415
|
async def test_bad_peak_cache_invalidation(
|
|
421
416
|
self, two_nodes, default_1000_blocks, blockchain_constants, consensus_mode
|
|
422
417
|
):
|
|
423
|
-
full_node_1,
|
|
418
|
+
full_node_1, _full_node_2, _server_1, _server_2, bt = two_nodes
|
|
424
419
|
|
|
425
420
|
for block in default_1000_blocks[:-500]:
|
|
426
421
|
await full_node_1.full_node.add_block(block)
|
|
@@ -2,8 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
4
|
import random
|
|
5
|
+
from collections.abc import AsyncIterator
|
|
5
6
|
from pathlib import Path
|
|
6
|
-
from typing import AsyncIterator, Tuple
|
|
7
7
|
|
|
8
8
|
from chia.consensus.blockchain import Blockchain
|
|
9
9
|
from chia.consensus.constants import ConsensusConstants
|
|
@@ -15,7 +15,7 @@ from chia.util.db_wrapper import DBWrapper2
|
|
|
15
15
|
@contextlib.asynccontextmanager
|
|
16
16
|
async def create_ram_blockchain(
|
|
17
17
|
consensus_constants: ConsensusConstants,
|
|
18
|
-
) -> AsyncIterator[
|
|
18
|
+
) -> AsyncIterator[tuple[DBWrapper2, Blockchain]]:
|
|
19
19
|
uri = f"file:db_{random.randint(0, 99999999)}?mode=memory&cache=shared"
|
|
20
20
|
async with DBWrapper2.managed(database=uri, uri=True, reader_count=1, db_version=2) as db_wrapper:
|
|
21
21
|
block_store = await BlockStore.create(db_wrapper)
|