chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc1__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/blockchain/blockchain_test_utils.py +2 -3
- chia/_tests/blockchain/test_augmented_chain.py +2 -3
- chia/_tests/blockchain/test_blockchain.py +261 -44
- chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
- chia/_tests/blockchain/test_build_chains.py +197 -1
- chia/_tests/blockchain/test_get_block_generator.py +1 -1
- chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +3 -4
- chia/_tests/clvm/test_message_conditions.py +2 -2
- chia/_tests/clvm/test_puzzle_compression.py +2 -3
- chia/_tests/clvm/test_puzzles.py +1 -2
- chia/_tests/clvm/test_singletons.py +2 -3
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +30 -25
- chia/_tests/cmds/test_dev_gh.py +1 -1
- chia/_tests/cmds/test_farm_cmd.py +1 -1
- chia/_tests/cmds/test_show.py +1 -2
- chia/_tests/cmds/wallet/test_did.py +101 -56
- chia/_tests/cmds/wallet/test_nft.py +109 -84
- chia/_tests/cmds/wallet/test_notifications.py +1 -1
- chia/_tests/cmds/wallet/test_offer.toffer +1 -1
- chia/_tests/cmds/wallet/test_vcs.py +8 -8
- chia/_tests/cmds/wallet/test_wallet.py +100 -46
- chia/_tests/conftest.py +31 -20
- chia/_tests/connection_utils.py +1 -1
- chia/_tests/core/consensus/stores/__init__.py +0 -0
- chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
- chia/_tests/core/consensus/test_block_creation.py +2 -31
- chia/_tests/core/consensus/test_pot_iterations.py +38 -3
- chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
- chia/_tests/core/daemon/test_daemon.py +80 -0
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +14 -10
- chia/_tests/core/data_layer/test_data_store.py +5 -5
- chia/_tests/core/farmer/test_farmer_api.py +2 -2
- chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
- chia/_tests/core/full_node/ram_db.py +3 -1
- chia/_tests/core/full_node/stores/test_block_store.py +28 -16
- chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
- chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_address_manager.py +200 -27
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +7 -6
- chia/_tests/core/full_node/test_full_node.py +456 -40
- chia/_tests/core/full_node/test_generator_tools.py +32 -2
- chia/_tests/core/full_node/test_hint_management.py +1 -1
- chia/_tests/core/full_node/test_node_load.py +20 -21
- chia/_tests/core/full_node/test_performance.py +3 -4
- chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
- chia/_tests/core/full_node/test_subscriptions.py +1 -2
- chia/_tests/core/full_node/test_transactions.py +9 -5
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
- chia/_tests/core/large_block.py +1 -2
- chia/_tests/core/make_block_generator.py +3 -4
- chia/_tests/core/mempool/test_mempool.py +36 -86
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
- chia/_tests/core/mempool/test_mempool_manager.py +421 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
- chia/_tests/core/server/flood.py +1 -1
- chia/_tests/core/server/test_dos.py +1 -1
- chia/_tests/core/server/test_node_discovery.py +41 -27
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +1 -1
- chia/_tests/core/services/test_services.py +5 -5
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_cost_calculation.py +6 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_crawler_rpc.py +1 -1
- chia/_tests/core/test_db_conversion.py +3 -1
- chia/_tests/core/test_db_validation.py +5 -3
- chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
- chia/_tests/core/test_filter.py +4 -1
- chia/_tests/core/test_full_node_rpc.py +99 -82
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/util/test_block_cache.py +1 -1
- chia/_tests/core/util/test_keychain.py +2 -2
- chia/_tests/core/util/test_lockfile.py +1 -1
- chia/_tests/core/util/test_log_exceptions.py +5 -5
- chia/_tests/core/util/test_streamable.py +81 -22
- chia/_tests/db/test_db_wrapper.py +1 -3
- chia/_tests/environments/wallet.py +5 -5
- chia/_tests/farmer_harvester/test_farmer.py +9 -7
- chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/generator/test_compression.py +1 -2
- chia/_tests/generator/test_rom.py +8 -4
- chia/_tests/plot_sync/test_plot_sync.py +3 -3
- chia/_tests/plot_sync/test_receiver.py +3 -3
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +3 -3
- chia/_tests/plot_sync/util.py +2 -2
- chia/_tests/pools/test_pool_cmdline.py +48 -21
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
- chia/_tests/pools/test_pool_rpc.py +237 -105
- chia/_tests/pools/test_pool_wallet.py +11 -2
- chia/_tests/pools/test_wallet_pool_store.py +5 -4
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/simulation/test_simulation.py +13 -8
- chia/_tests/simulation/test_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +191 -47
- chia/_tests/timelord/test_timelord.py +1 -1
- chia/_tests/tools/test_full_sync.py +0 -2
- chia/_tests/tools/test_run_block.py +3 -1
- chia/_tests/util/benchmark_cost.py +3 -3
- chia/_tests/util/benchmarks.py +2 -2
- chia/_tests/util/blockchain.py +11 -5
- chia/_tests/util/blockchain_mock.py +1 -4
- chia/_tests/util/coin_store.py +29 -0
- chia/_tests/util/constants.py +2 -18
- chia/_tests/util/full_sync.py +3 -3
- chia/_tests/util/generator_tools_testing.py +2 -3
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +33 -31
- chia/_tests/util/network_protocol_data.py +19 -17
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +3 -1
- chia/_tests/util/run_block.py +2 -2
- chia/_tests/util/setup_nodes.py +7 -7
- chia/_tests/util/spend_sim.py +47 -55
- chia/_tests/util/test_condition_tools.py +5 -4
- chia/_tests/util/test_config.py +2 -2
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +12 -14
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_paginator.py +4 -4
- chia/_tests/util/test_priority_mutex.py +2 -2
- chia/_tests/util/test_replace_str_to_bytes.py +15 -5
- chia/_tests/util/test_ssl_check.py +1 -1
- chia/_tests/util/test_testnet_overrides.py +13 -3
- chia/_tests/util/time_out_assert.py +4 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
- chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
- chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
- chia/_tests/wallet/conftest.py +11 -12
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
- chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
- chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
- chia/_tests/wallet/nft_wallet/config.py +1 -1
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
- chia/_tests/wallet/rpc/test_wallet_rpc.py +305 -184
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
- chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
- chia/_tests/wallet/test_clvm_casts.py +88 -0
- chia/_tests/wallet/test_coin_management.py +1 -1
- chia/_tests/wallet/test_coin_selection.py +1 -1
- chia/_tests/wallet/test_conditions.py +1 -1
- chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
- chia/_tests/wallet/test_notifications.py +5 -3
- chia/_tests/wallet/test_sign_coin_spends.py +6 -6
- chia/_tests/wallet/test_signer_protocol.py +13 -12
- chia/_tests/wallet/test_singleton.py +1 -1
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +108 -29
- chia/_tests/wallet/test_wallet_action_scope.py +9 -2
- chia/_tests/wallet/test_wallet_blockchain.py +2 -3
- chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
- chia/_tests/wallet/test_wallet_node.py +2 -4
- chia/_tests/wallet/test_wallet_retry.py +4 -2
- chia/_tests/wallet/test_wallet_state_manager.py +191 -5
- chia/_tests/wallet/test_wallet_test_framework.py +1 -1
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
- chia/_tests/wallet/wallet_block_tools.py +6 -6
- chia/_tests/weight_proof/test_weight_proof.py +10 -48
- chia/apis.py +1 -1
- chia/cmds/beta.py +1 -1
- chia/cmds/chia.py +9 -9
- chia/cmds/cmd_classes.py +12 -11
- chia/cmds/cmd_helpers.py +1 -1
- chia/cmds/cmds_util.py +12 -9
- chia/cmds/coin_funcs.py +2 -2
- chia/cmds/configure.py +2 -2
- chia/cmds/data.py +0 -2
- chia/cmds/data_funcs.py +1 -1
- chia/cmds/db_validate_func.py +1 -2
- chia/cmds/dev/__init__.py +0 -0
- chia/cmds/dev/data.py +273 -0
- chia/cmds/{gh.py → dev/gh.py} +5 -5
- chia/cmds/dev/main.py +22 -0
- chia/cmds/dev/mempool.py +78 -0
- chia/cmds/dev/mempool_funcs.py +63 -0
- chia/cmds/farm_funcs.py +5 -4
- chia/cmds/init_funcs.py +11 -11
- chia/cmds/keys.py +2 -2
- chia/cmds/keys_funcs.py +4 -4
- chia/cmds/netspace_funcs.py +1 -1
- chia/cmds/peer_funcs.py +2 -2
- chia/cmds/plotnft_funcs.py +72 -26
- chia/cmds/rpc.py +1 -1
- chia/cmds/show_funcs.py +5 -5
- chia/cmds/signer.py +8 -7
- chia/cmds/sim_funcs.py +8 -9
- chia/cmds/wallet.py +2 -2
- chia/cmds/wallet_funcs.py +165 -131
- chia/{util → consensus}/augmented_chain.py +1 -2
- chia/consensus/block_body_validation.py +54 -40
- chia/consensus/block_creation.py +42 -76
- chia/consensus/block_header_validation.py +32 -26
- chia/consensus/block_record.py +0 -3
- chia/consensus/blockchain.py +23 -32
- chia/consensus/blockchain_interface.py +1 -5
- chia/consensus/check_time_locks.py +57 -0
- chia/consensus/coin_store_protocol.py +151 -0
- chia/consensus/coinbase.py +0 -6
- chia/consensus/condition_costs.py +4 -0
- chia/{util → consensus}/condition_tools.py +4 -5
- chia/consensus/cost_calculator.py +1 -1
- chia/consensus/default_constants.py +32 -9
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +1 -2
- chia/consensus/find_fork_point.py +1 -3
- chia/consensus/full_block_to_block_record.py +1 -6
- chia/{util → consensus}/generator_tools.py +1 -3
- chia/consensus/get_block_challenge.py +30 -7
- chia/consensus/make_sub_epoch_summary.py +1 -5
- chia/consensus/multiprocess_validation.py +21 -20
- chia/consensus/pot_iterations.py +74 -13
- chia/{util → consensus}/prev_transaction_block.py +1 -1
- chia/consensus/vdf_info_computation.py +1 -3
- chia/daemon/keychain_proxy.py +5 -5
- chia/daemon/server.py +22 -5
- chia/data_layer/data_layer.py +92 -51
- chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
- chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
- chia/data_layer/data_layer_util.py +4 -6
- chia/data_layer/data_layer_wallet.py +42 -69
- chia/data_layer/dl_wallet_store.py +12 -6
- chia/data_layer/download_data.py +3 -3
- chia/data_layer/s3_plugin_service.py +0 -1
- chia/farmer/farmer.py +3 -4
- chia/farmer/farmer_api.py +11 -7
- chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
- chia/full_node/block_height_map.py +7 -6
- chia/full_node/block_store.py +5 -7
- chia/full_node/bundle_tools.py +1 -2
- chia/full_node/coin_store.py +143 -124
- chia/{types → full_node}/eligible_coin_spends.py +39 -70
- chia/full_node/fee_estimator.py +1 -1
- chia/full_node/fee_estimator_interface.py +0 -8
- chia/full_node/fee_tracker.py +25 -25
- chia/full_node/full_node.py +70 -53
- chia/full_node/full_node_api.py +57 -40
- chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
- chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
- chia/full_node/full_node_store.py +23 -8
- chia/full_node/mempool.py +206 -53
- chia/full_node/mempool_check_conditions.py +20 -63
- chia/full_node/mempool_manager.py +26 -40
- chia/full_node/subscriptions.py +1 -3
- chia/full_node/tx_processing_queue.py +50 -3
- chia/full_node/weight_proof.py +46 -37
- chia/harvester/harvester.py +1 -1
- chia/harvester/harvester_api.py +22 -7
- chia/introducer/introducer.py +1 -1
- chia/introducer/introducer_api.py +1 -1
- chia/plot_sync/exceptions.py +1 -1
- chia/plot_sync/receiver.py +1 -1
- chia/plot_sync/sender.py +2 -2
- chia/pools/pool_puzzles.py +13 -18
- chia/pools/pool_wallet.py +23 -46
- chia/protocols/farmer_protocol.py +11 -3
- chia/protocols/full_node_protocol.py +1 -4
- chia/protocols/harvester_protocol.py +3 -3
- chia/protocols/pool_protocol.py +1 -2
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +1 -3
- chia/protocols/wallet_protocol.py +3 -3
- chia/rpc/rpc_client.py +7 -8
- chia/rpc/rpc_server.py +3 -3
- chia/rpc/util.py +3 -1
- chia/seeder/crawler.py +1 -1
- chia/seeder/crawler_api.py +1 -1
- chia/seeder/dns_server.py +2 -0
- chia/seeder/start_crawler.py +3 -3
- chia/server/address_manager.py +286 -38
- chia/server/address_manager_store.py +0 -215
- chia/{types → server}/aliases.py +7 -7
- chia/server/api_protocol.py +1 -1
- chia/server/chia_policy.py +1 -1
- chia/server/node_discovery.py +76 -113
- chia/server/rate_limits.py +1 -1
- chia/server/resolve_peer_info.py +43 -0
- chia/server/server.py +5 -5
- chia/server/start_data_layer.py +4 -4
- chia/server/start_farmer.py +5 -4
- chia/server/start_full_node.py +5 -4
- chia/server/start_harvester.py +7 -5
- chia/server/start_introducer.py +2 -2
- chia/server/start_service.py +1 -1
- chia/server/start_timelord.py +7 -5
- chia/server/start_wallet.py +7 -5
- chia/server/ws_connection.py +1 -1
- chia/simulator/add_blocks_in_batches.py +2 -2
- chia/simulator/block_tools.py +245 -201
- chia/simulator/full_node_simulator.py +38 -10
- chia/simulator/setup_services.py +12 -12
- chia/simulator/simulator_full_node_rpc_api.py +2 -2
- chia/simulator/simulator_full_node_rpc_client.py +2 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +1 -1
- chia/simulator/wallet_tools.py +10 -18
- chia/ssl/create_ssl.py +1 -1
- chia/timelord/iters_from_block.py +14 -14
- chia/timelord/timelord.py +15 -11
- chia/timelord/timelord_api.py +14 -2
- chia/timelord/timelord_state.py +20 -14
- chia/types/blockchain_format/program.py +53 -10
- chia/types/blockchain_format/proof_of_space.py +73 -19
- chia/types/coin_spend.py +3 -56
- chia/types/generator_types.py +28 -0
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +12 -7
- chia/types/unfinished_header_block.py +1 -2
- chia/types/validation_state.py +1 -2
- chia/types/weight_proof.py +1 -3
- chia/util/action_scope.py +3 -3
- chia/util/block_cache.py +1 -2
- chia/util/byte_types.py +1 -1
- chia/util/casts.py +21 -0
- chia/util/config.py +0 -37
- chia/util/db_wrapper.py +8 -1
- chia/util/errors.py +3 -2
- chia/util/initial-config.yaml +21 -5
- chia/util/keychain.py +6 -7
- chia/util/keyring_wrapper.py +5 -5
- chia/util/limited_semaphore.py +1 -1
- chia/util/priority_mutex.py +1 -1
- chia/util/streamable.py +63 -5
- chia/util/task_timing.py +1 -1
- chia/util/virtual_project_analysis.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +7 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
- chia/wallet/cat_wallet/cat_utils.py +1 -1
- chia/wallet/cat_wallet/cat_wallet.py +44 -36
- chia/wallet/cat_wallet/lineage_store.py +7 -0
- chia/wallet/cat_wallet/r_cat_wallet.py +273 -0
- chia/wallet/conditions.py +5 -10
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
- chia/wallet/derivation_record.py +33 -0
- chia/wallet/derive_keys.py +3 -3
- chia/wallet/did_wallet/did_info.py +12 -3
- chia/wallet/did_wallet/did_wallet.py +132 -101
- chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
- chia/wallet/driver_protocol.py +3 -1
- chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
- chia/wallet/nft_wallet/nft_wallet.py +69 -112
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
- chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
- chia/wallet/nft_wallet/uncurry_nft.py +4 -6
- chia/wallet/notification_manager.py +2 -3
- chia/wallet/outer_puzzles.py +7 -2
- chia/wallet/puzzle_drivers.py +1 -1
- chia/wallet/puzzles/clawback/drivers.py +5 -4
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
- chia/wallet/puzzles/singleton_top_layer.py +2 -1
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
- chia/wallet/puzzles/tails.py +1 -3
- chia/wallet/signer_protocol.py +5 -6
- chia/wallet/singleton.py +5 -4
- chia/wallet/singleton_record.py +1 -1
- chia/wallet/trade_manager.py +18 -20
- chia/wallet/trade_record.py +3 -6
- chia/wallet/trading/offer.py +12 -13
- chia/wallet/uncurried_puzzle.py +2 -2
- chia/wallet/util/compute_additions.py +58 -0
- chia/wallet/util/compute_hints.py +3 -3
- chia/wallet/util/compute_memos.py +4 -4
- chia/wallet/util/curry_and_treehash.py +2 -1
- chia/wallet/util/debug_spend_bundle.py +1 -1
- chia/wallet/util/merkle_tree.py +1 -1
- chia/wallet/util/peer_request_cache.py +1 -2
- chia/wallet/util/tx_config.py +3 -8
- chia/wallet/util/wallet_sync_utils.py +10 -5
- chia/wallet/util/wallet_types.py +1 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
- chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
- chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
- chia/wallet/vc_wallet/vc_drivers.py +50 -8
- chia/wallet/vc_wallet/vc_store.py +3 -5
- chia/wallet/vc_wallet/vc_wallet.py +15 -22
- chia/wallet/wallet.py +36 -46
- chia/wallet/wallet_action_scope.py +73 -4
- chia/wallet/wallet_blockchain.py +1 -3
- chia/wallet/wallet_interested_store.py +1 -1
- chia/wallet/wallet_nft_store.py +3 -3
- chia/wallet/wallet_node.py +17 -16
- chia/wallet/wallet_node_api.py +4 -5
- chia/wallet/wallet_pool_store.py +1 -1
- chia/wallet/wallet_protocol.py +2 -0
- chia/wallet/wallet_puzzle_store.py +1 -1
- chia/{rpc → wallet}/wallet_request_types.py +670 -81
- chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
- chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
- chia/wallet/wallet_singleton_store.py +8 -7
- chia/wallet/wallet_spend_bundle.py +4 -3
- chia/wallet/wallet_state_manager.py +320 -191
- chia/wallet/wallet_weight_proof_handler.py +1 -2
- chia/wallet/wsm_apis.py +98 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/RECORD +443 -436
- mozilla-ca/cacert.pem +3 -165
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
- chia/cmds/dev.py +0 -18
- chia/types/blockchain_format/slots.py +0 -9
- chia/types/blockchain_format/sub_epoch_summary.py +0 -5
- chia/types/end_of_slot_bundle.py +0 -5
- chia/types/full_block.py +0 -5
- chia/types/header_block.py +0 -5
- chia/types/spend_bundle_conditions.py +0 -7
- chia/types/transaction_queue_entry.py +0 -56
- chia/types/unfinished_block.py +0 -5
- /chia/cmds/{installers.py → dev/installers.py} +0 -0
- /chia/cmds/{sim.py → dev/sim.py} +0 -0
- /chia/{util → cmds}/dump_keyring.py +0 -0
- /chia/{full_node → consensus}/signage_point.py +0 -0
- /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
- /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
- /chia/{util → full_node}/full_block_utils.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
- /chia/{full_node → protocols}/fee_estimate.py +0 -0
- /chia/{server → protocols}/outbound_message.py +0 -0
- /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
- /chia/{util → simulator}/vdf_prover.py +0 -0
- /chia/{util → ssl}/ssl_check.py +0 -0
- /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc1.dist-info}/entry_points.txt +0 -0
chia/cmds/cmd_classes.py
CHANGED
|
@@ -25,7 +25,7 @@ from chia_rs.sized_bytes import bytes32
|
|
|
25
25
|
from typing_extensions import dataclass_transform
|
|
26
26
|
|
|
27
27
|
from chia.util.byte_types import hexstr_to_bytes
|
|
28
|
-
from chia.util.default_root import DEFAULT_ROOT_PATH
|
|
28
|
+
from chia.util.default_root import DEFAULT_KEYS_ROOT_PATH, DEFAULT_ROOT_PATH
|
|
29
29
|
from chia.util.streamable import is_type_SpecificOptional
|
|
30
30
|
|
|
31
31
|
SyncCmd = Callable[..., None]
|
|
@@ -45,11 +45,11 @@ ChiaCommand = Union[SyncChiaCommand, AsyncChiaCommand]
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
def option(*param_decls: str, **kwargs: Any) -> Any:
|
|
48
|
-
if sys.version_info
|
|
48
|
+
if sys.version_info >= (3, 10):
|
|
49
|
+
default_default = MISSING
|
|
50
|
+
else: # versions < 3.10 don't know about kw_only and they complain about lacks of defaults
|
|
49
51
|
# Can't get coverage on this because we only test on one version
|
|
50
52
|
default_default = None # pragma: no cover
|
|
51
|
-
else:
|
|
52
|
-
default_default = MISSING
|
|
53
53
|
|
|
54
54
|
return field(
|
|
55
55
|
metadata=dict(
|
|
@@ -68,6 +68,7 @@ class ChiaCliContext:
|
|
|
68
68
|
context_dict_key: ClassVar[str] = "_chia_cli_context"
|
|
69
69
|
|
|
70
70
|
root_path: pathlib.Path = DEFAULT_ROOT_PATH
|
|
71
|
+
keys_root_path: pathlib.Path = DEFAULT_KEYS_ROOT_PATH
|
|
71
72
|
expected_prefix: Optional[str] = None
|
|
72
73
|
rpc_port: Optional[int] = None
|
|
73
74
|
keys_fingerprint: Optional[int] = None
|
|
@@ -269,15 +270,15 @@ def chia_command(
|
|
|
269
270
|
def _chia_command(cls: type[ChiaCommand]) -> type[ChiaCommand]:
|
|
270
271
|
# The type ignores here are largely due to the fact that the class information is not preserved after being
|
|
271
272
|
# passed through the dataclass wrapper. Not sure what to do about this right now.
|
|
272
|
-
if sys.version_info
|
|
273
|
-
# stuff below 3.10 doesn't know about kw_only
|
|
273
|
+
if sys.version_info >= (3, 10):
|
|
274
274
|
wrapped_cls: type[ChiaCommand] = dataclass(
|
|
275
275
|
frozen=True,
|
|
276
|
+
kw_only=True,
|
|
276
277
|
)(cls)
|
|
277
|
-
else:
|
|
278
|
+
else: # pragma: no cover
|
|
279
|
+
# stuff below 3.10 doesn't know about kw_only
|
|
278
280
|
wrapped_cls: type[ChiaCommand] = dataclass(
|
|
279
281
|
frozen=True,
|
|
280
|
-
kw_only=True,
|
|
281
282
|
)(cls)
|
|
282
283
|
|
|
283
284
|
metadata = Metadata(
|
|
@@ -315,9 +316,9 @@ def get_chia_command_metadata(cls: type[ChiaCommand]) -> Metadata:
|
|
|
315
316
|
|
|
316
317
|
@dataclass_transform(frozen_default=True)
|
|
317
318
|
def command_helper(cls: type[Any]) -> type[Any]:
|
|
318
|
-
if sys.version_info
|
|
319
|
-
new_cls = dataclass(frozen=True)(cls) # pragma: no cover
|
|
320
|
-
else:
|
|
319
|
+
if sys.version_info >= (3, 10):
|
|
321
320
|
new_cls = dataclass(frozen=True, kw_only=True)(cls)
|
|
321
|
+
else: # stuff below 3.10 doesn't support kw_only
|
|
322
|
+
new_cls = dataclass(frozen=True)(cls) # pragma: no cover
|
|
322
323
|
setattr(new_cls, COMMAND_HELPER_ATTRIBUTE_NAME, True)
|
|
323
324
|
return new_cls
|
chia/cmds/cmd_helpers.py
CHANGED
|
@@ -13,10 +13,10 @@ from chia_rs.sized_ints import uint64
|
|
|
13
13
|
from chia.cmds.cmd_classes import ChiaCliContext, command_helper, option
|
|
14
14
|
from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, TransactionBundle, get_wallet_client
|
|
15
15
|
from chia.cmds.param_types import AmountParamType, Bytes32ParamType, CliAmount, TransactionFeeParamType, cli_amount_none
|
|
16
|
-
from chia.rpc.wallet_rpc_client import WalletRpcClient
|
|
17
16
|
from chia.wallet.conditions import ConditionValidTimes
|
|
18
17
|
from chia.wallet.transaction_record import TransactionRecord
|
|
19
18
|
from chia.wallet.util.tx_config import CoinSelectionConfig, TXConfig
|
|
19
|
+
from chia.wallet.wallet_rpc_client import WalletRpcClient
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
@dataclass(frozen=True)
|
chia/cmds/cmds_util.py
CHANGED
|
@@ -17,13 +17,11 @@ from chia_rs.sized_ints import uint16, uint32, uint64
|
|
|
17
17
|
from chia.cmds.param_types import AmountParamType, Bytes32ParamType, CliAmount, cli_amount_none
|
|
18
18
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
19
19
|
from chia.daemon.keychain_proxy import KeychainProxy, connect_to_keychain_and_validate
|
|
20
|
-
from chia.
|
|
21
|
-
from chia.
|
|
22
|
-
from chia.
|
|
23
|
-
from chia.
|
|
20
|
+
from chia.data_layer.data_layer_rpc_client import DataLayerRpcClient
|
|
21
|
+
from chia.farmer.farmer_rpc_client import FarmerRpcClient
|
|
22
|
+
from chia.full_node.full_node_rpc_client import FullNodeRpcClient
|
|
23
|
+
from chia.harvester.harvester_rpc_client import HarvesterRpcClient
|
|
24
24
|
from chia.rpc.rpc_client import ResponseFailureError, RpcClient
|
|
25
|
-
from chia.rpc.wallet_request_types import LogIn
|
|
26
|
-
from chia.rpc.wallet_rpc_client import WalletRpcClient
|
|
27
25
|
from chia.simulator.simulator_full_node_rpc_client import SimulatorFullNodeRpcClient
|
|
28
26
|
from chia.types.mempool_submission_status import MempoolSubmissionStatus
|
|
29
27
|
from chia.util.config import load_config
|
|
@@ -33,6 +31,8 @@ from chia.util.streamable import Streamable, streamable
|
|
|
33
31
|
from chia.wallet.conditions import ConditionValidTimes
|
|
34
32
|
from chia.wallet.transaction_record import TransactionRecord
|
|
35
33
|
from chia.wallet.util.tx_config import CoinSelectionConfig, CoinSelectionConfigLoader, TXConfig, TXConfigLoader
|
|
34
|
+
from chia.wallet.wallet_request_types import LogIn
|
|
35
|
+
from chia.wallet.wallet_rpc_client import WalletRpcClient
|
|
36
36
|
|
|
37
37
|
NODE_TYPES: dict[str, type[RpcClient]] = {
|
|
38
38
|
"base": RpcClient,
|
|
@@ -141,9 +141,12 @@ async def get_any_service_client(
|
|
|
141
141
|
|
|
142
142
|
if tb is not None:
|
|
143
143
|
print(f"Traceback:\n{tb}")
|
|
144
|
+
except (click.ClickException, click.Abort):
|
|
145
|
+
# this includes CliRpcConnectionError which is a subclass of click.ClickException
|
|
146
|
+
# raising here allows click to do it's normal click error handling
|
|
147
|
+
raise
|
|
144
148
|
except Exception as e: # this is only here to make the errors more user-friendly.
|
|
145
|
-
if not consume_errors
|
|
146
|
-
# CliRpcConnectionError will be handled by click.
|
|
149
|
+
if not consume_errors:
|
|
147
150
|
raise
|
|
148
151
|
print(f"Exception from '{node_type}' {e}:\n{traceback.format_exc()}")
|
|
149
152
|
|
|
@@ -264,7 +267,7 @@ def cli_confirm(input_message: str, abort_message: str = "Did not confirm. Abort
|
|
|
264
267
|
response = input(input_message).lower()
|
|
265
268
|
if response not in {"y", "yes"}:
|
|
266
269
|
print(abort_message)
|
|
267
|
-
raise click.Abort
|
|
270
|
+
raise click.Abort
|
|
268
271
|
|
|
269
272
|
|
|
270
273
|
def coin_selection_args(func: Callable[..., None]) -> Callable[..., None]:
|
chia/cmds/coin_funcs.py
CHANGED
|
@@ -12,13 +12,13 @@ from chia.cmds.cmd_helpers import WalletClientInfo
|
|
|
12
12
|
from chia.cmds.cmds_util import CMDCoinSelectionConfigLoader, CMDTXConfigLoader, cli_confirm
|
|
13
13
|
from chia.cmds.param_types import CliAmount
|
|
14
14
|
from chia.cmds.wallet_funcs import get_mojo_per_unit, get_wallet_type, print_balance
|
|
15
|
-
from chia.rpc.wallet_request_types import CombineCoins, SplitCoins
|
|
16
15
|
from chia.types.blockchain_format.coin import Coin
|
|
17
16
|
from chia.util.bech32m import encode_puzzle_hash
|
|
18
17
|
from chia.util.config import selected_network_address_prefix
|
|
19
18
|
from chia.wallet.conditions import ConditionValidTimes
|
|
20
19
|
from chia.wallet.transaction_record import TransactionRecord
|
|
21
20
|
from chia.wallet.util.wallet_types import WalletType
|
|
21
|
+
from chia.wallet.wallet_request_types import CombineCoins, SplitCoins
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
async def async_list(
|
|
@@ -92,7 +92,7 @@ def print_coins(
|
|
|
92
92
|
return
|
|
93
93
|
num_per_screen = 5 if paginate else len(coins)
|
|
94
94
|
for i in range(0, len(coins), num_per_screen):
|
|
95
|
-
for j in range(
|
|
95
|
+
for j in range(num_per_screen):
|
|
96
96
|
if i + j >= len(coins):
|
|
97
97
|
break
|
|
98
98
|
coin, conf_height = coins[i + j]
|
chia/cmds/configure.py
CHANGED
|
@@ -7,13 +7,13 @@ import click
|
|
|
7
7
|
import yaml
|
|
8
8
|
|
|
9
9
|
from chia.cmds.cmd_classes import ChiaCliContext
|
|
10
|
-
from chia.
|
|
10
|
+
from chia.protocols.outbound_message import NodeType
|
|
11
|
+
from chia.server.resolve_peer_info import set_peer_info
|
|
11
12
|
from chia.util.config import (
|
|
12
13
|
initial_config_file,
|
|
13
14
|
load_defaults_for_missing_services,
|
|
14
15
|
lock_and_load_config,
|
|
15
16
|
save_config,
|
|
16
|
-
set_peer_info,
|
|
17
17
|
str2bool,
|
|
18
18
|
)
|
|
19
19
|
|
chia/cmds/data.py
CHANGED
|
@@ -13,8 +13,6 @@ from chia_rs.sized_ints import uint64
|
|
|
13
13
|
from chia.cmds import options
|
|
14
14
|
from chia.cmds.param_types import Bytes32ParamType
|
|
15
15
|
|
|
16
|
-
_T = TypeVar("_T")
|
|
17
|
-
|
|
18
16
|
FC = TypeVar("FC", bound=Union[Callable[..., Any], click.Command])
|
|
19
17
|
|
|
20
18
|
logger = logging.getLogger(__name__)
|
chia/cmds/data_funcs.py
CHANGED
|
@@ -10,7 +10,7 @@ from chia_rs.sized_bytes import bytes32
|
|
|
10
10
|
from chia_rs.sized_ints import uint64
|
|
11
11
|
|
|
12
12
|
from chia.cmds.cmds_util import get_any_service_client
|
|
13
|
-
from chia.
|
|
13
|
+
from chia.data_layer.data_layer_rpc_client import DataLayerRpcClient
|
|
14
14
|
from chia.util.byte_types import hexstr_to_bytes
|
|
15
15
|
from chia.util.default_root import resolve_root_path
|
|
16
16
|
|
chia/cmds/db_validate_func.py
CHANGED
|
@@ -3,12 +3,11 @@ from __future__ import annotations
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
from typing import Any, Optional
|
|
5
5
|
|
|
6
|
+
from chia_rs import BlockRecord, FullBlock
|
|
6
7
|
from chia_rs.sized_bytes import bytes32
|
|
7
8
|
|
|
8
|
-
from chia.consensus.block_record import BlockRecord
|
|
9
9
|
from chia.consensus.constants import replace_str_to_bytes
|
|
10
10
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
11
|
-
from chia.types.full_block import FullBlock
|
|
12
11
|
from chia.util.config import load_config
|
|
13
12
|
from chia.util.path import path_from_root
|
|
14
13
|
|
|
File without changes
|
chia/cmds/dev/data.py
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
5
|
+
import dataclasses
|
|
6
|
+
import datetime
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
import sysconfig
|
|
10
|
+
import tempfile
|
|
11
|
+
import time
|
|
12
|
+
from dataclasses import field
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Optional
|
|
15
|
+
|
|
16
|
+
import aiohttp
|
|
17
|
+
import anyio
|
|
18
|
+
import click
|
|
19
|
+
from chia_rs.sized_bytes import bytes32
|
|
20
|
+
from chia_rs.sized_ints import uint32
|
|
21
|
+
|
|
22
|
+
from chia.cmds.cmd_classes import ChiaCliContext, chia_command, option
|
|
23
|
+
from chia.cmds.cmd_helpers import NeedsWalletRPC
|
|
24
|
+
from chia.data_layer.data_layer import server_files_path_from_config
|
|
25
|
+
from chia.data_layer.data_layer_util import ServerInfo, Status, Subscription
|
|
26
|
+
from chia.data_layer.data_store import DataStore
|
|
27
|
+
from chia.data_layer.download_data import insert_from_delta_file
|
|
28
|
+
from chia.util.chia_logging import initialize_logging
|
|
29
|
+
from chia.util.config import load_config
|
|
30
|
+
from chia.util.task_referencer import create_referenced_task
|
|
31
|
+
from chia.wallet.wallet_request_types import DLHistory, DLTrackNew
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class NonZeroReturnCodeError(Exception):
|
|
35
|
+
def __init__(self, returncode: int):
|
|
36
|
+
super().__init__(f"Process returned non-zero exit code: {returncode}")
|
|
37
|
+
self.returncode = returncode
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclasses.dataclass
|
|
41
|
+
class RunResult:
|
|
42
|
+
process: asyncio.subprocess.Process
|
|
43
|
+
stdout: Optional[str]
|
|
44
|
+
stderr: Optional[str]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@click.group("data", help="For working with DataLayer")
|
|
48
|
+
def data_group() -> None:
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def print_date(*args: Any, **kwargs: Any) -> None:
|
|
53
|
+
kwargs.setdefault("flush", True)
|
|
54
|
+
s = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec="seconds")
|
|
55
|
+
print(f"{s}:", *args, **kwargs)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def humanize_bytes(size: int) -> str:
|
|
59
|
+
return f"{size / 2**20:.1f} MB"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@chia_command(
|
|
63
|
+
group=data_group,
|
|
64
|
+
name="sync-time",
|
|
65
|
+
short_help="test time to sync a provided store id",
|
|
66
|
+
help="""
|
|
67
|
+
An empty temporary database is created and then the specified store is synced to it.
|
|
68
|
+
If local delta files are available in the specified directory then they will be used.
|
|
69
|
+
This allows both testing of total time including downloading as well as just the insert time.
|
|
70
|
+
The DataLayer work is done within the test process.
|
|
71
|
+
Separate daemon and wallet service processes are started and stopped.""",
|
|
72
|
+
)
|
|
73
|
+
class SyncTimeCommand:
|
|
74
|
+
wallet_rpc_info: NeedsWalletRPC
|
|
75
|
+
context: ChiaCliContext = field(default_factory=ChiaCliContext)
|
|
76
|
+
generation_limit: int = option("--generation-limit", required=True)
|
|
77
|
+
store_id: bytes32 = option("--store-id", required=True)
|
|
78
|
+
profile_tasks: bool = option("--profile-tasks/--no-profile-tasks")
|
|
79
|
+
restart_all: bool = option("--restart-all/--no-restart-all")
|
|
80
|
+
working_path: Optional[Path] = option("--working-path", default=None)
|
|
81
|
+
|
|
82
|
+
async def run(self) -> None:
|
|
83
|
+
config = load_config(self.context.root_path, "config.yaml", "data_layer", fill_missing_services=True)
|
|
84
|
+
initialize_logging(
|
|
85
|
+
service_name="data_layer_testing",
|
|
86
|
+
logging_config=config["logging"],
|
|
87
|
+
root_path=self.context.root_path,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
if self.restart_all:
|
|
91
|
+
await self.run_chia("stop", "-d", "all", check=False)
|
|
92
|
+
|
|
93
|
+
await self.run_chia("start", "wallet")
|
|
94
|
+
await self.run_chia("keys", "generate", "--label", "for_testing")
|
|
95
|
+
await self.wait_for_wallet_synced()
|
|
96
|
+
await self.run_chia("wallet", "show")
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
async with contextlib.AsyncExitStack() as exit_stack:
|
|
100
|
+
working_path: Path
|
|
101
|
+
if self.working_path is None:
|
|
102
|
+
working_path = Path(exit_stack.enter_context(tempfile.TemporaryDirectory()))
|
|
103
|
+
else:
|
|
104
|
+
working_path = self.working_path
|
|
105
|
+
working_path.mkdir(parents=True, exist_ok=True)
|
|
106
|
+
|
|
107
|
+
database_path = working_path.joinpath("datalayer.sqlite")
|
|
108
|
+
print_date(f"working with database at: {database_path}")
|
|
109
|
+
|
|
110
|
+
wallet_client_info = await exit_stack.enter_async_context(self.wallet_rpc_info.wallet_rpc())
|
|
111
|
+
wallet_rpc = wallet_client_info.client
|
|
112
|
+
await wallet_rpc.dl_track_new(DLTrackNew(launcher_id=self.store_id))
|
|
113
|
+
|
|
114
|
+
data_store = await exit_stack.enter_async_context(DataStore.managed(database=database_path))
|
|
115
|
+
|
|
116
|
+
await data_store.subscribe(subscription=Subscription(store_id=self.store_id, servers_info=[]))
|
|
117
|
+
|
|
118
|
+
await self.wait_for_wallet_synced()
|
|
119
|
+
await self.run_chia("wallet", "show")
|
|
120
|
+
|
|
121
|
+
print_date("subscribed")
|
|
122
|
+
|
|
123
|
+
to_download = (
|
|
124
|
+
await wallet_rpc.dl_history(
|
|
125
|
+
DLHistory(
|
|
126
|
+
launcher_id=self.store_id,
|
|
127
|
+
min_generation=uint32(1),
|
|
128
|
+
max_generation=uint32(self.generation_limit + 1),
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
).history
|
|
132
|
+
|
|
133
|
+
print_date(
|
|
134
|
+
f"found generations to download: {to_download[-1].generation} -> {to_download[0].generation}"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
root_hashes = [record.root for record in reversed(to_download)]
|
|
138
|
+
|
|
139
|
+
files_path = server_files_path_from_config(config=config, root_path=self.context.root_path)
|
|
140
|
+
|
|
141
|
+
clock = time.monotonic
|
|
142
|
+
start = clock()
|
|
143
|
+
|
|
144
|
+
last_generation = -1
|
|
145
|
+
clock = time.monotonic
|
|
146
|
+
last_time = clock()
|
|
147
|
+
all_times: dict[int, float] = {}
|
|
148
|
+
|
|
149
|
+
print_date(f"using local files at: {files_path}")
|
|
150
|
+
|
|
151
|
+
await data_store.create_tree(store_id=self.store_id, status=Status.COMMITTED)
|
|
152
|
+
|
|
153
|
+
task = create_referenced_task(
|
|
154
|
+
insert_from_delta_file(
|
|
155
|
+
data_store=data_store,
|
|
156
|
+
store_id=self.store_id,
|
|
157
|
+
existing_generation=0,
|
|
158
|
+
target_generation=self.generation_limit,
|
|
159
|
+
root_hashes=root_hashes,
|
|
160
|
+
server_info=ServerInfo(url="", num_consecutive_failures=0, ignore_till=0),
|
|
161
|
+
client_foldername=files_path,
|
|
162
|
+
timeout=aiohttp.ClientTimeout(),
|
|
163
|
+
log=logging.getLogger(__name__),
|
|
164
|
+
proxy_url=None,
|
|
165
|
+
downloader=None,
|
|
166
|
+
maximum_full_file_count=0,
|
|
167
|
+
)
|
|
168
|
+
)
|
|
169
|
+
try:
|
|
170
|
+
while not task.done():
|
|
171
|
+
try:
|
|
172
|
+
generation = await data_store.get_tree_generation(store_id=self.store_id)
|
|
173
|
+
except Exception as e:
|
|
174
|
+
if "No generations found" not in str(e):
|
|
175
|
+
raise
|
|
176
|
+
else:
|
|
177
|
+
if generation != last_generation:
|
|
178
|
+
delta_generation = generation - last_generation
|
|
179
|
+
now = clock()
|
|
180
|
+
delta_time = now - last_time
|
|
181
|
+
per_generation = delta_time / delta_generation
|
|
182
|
+
|
|
183
|
+
duration_so_far = round((now - start) / 60)
|
|
184
|
+
|
|
185
|
+
print_date(
|
|
186
|
+
f"synced: {last_generation} -> {generation} at {per_generation:.1f}s / gen"
|
|
187
|
+
+ f" ({humanize_bytes(database_path.stat().st_size)}, {duration_so_far}m)",
|
|
188
|
+
flush=True,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
for i in range(generation, last_generation, -1):
|
|
192
|
+
all_times[i] = per_generation
|
|
193
|
+
|
|
194
|
+
last_generation = generation
|
|
195
|
+
last_time = now
|
|
196
|
+
await asyncio.sleep(1)
|
|
197
|
+
finally:
|
|
198
|
+
try:
|
|
199
|
+
with anyio.CancelScope(shield=True):
|
|
200
|
+
if task.done():
|
|
201
|
+
await task
|
|
202
|
+
else:
|
|
203
|
+
task.cancel()
|
|
204
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
205
|
+
await task
|
|
206
|
+
finally:
|
|
207
|
+
end = clock()
|
|
208
|
+
total = round(end - start)
|
|
209
|
+
remainder, seconds = divmod(total, 60)
|
|
210
|
+
remainder, minutes = divmod(remainder, 60)
|
|
211
|
+
days, hours = divmod(remainder, 24)
|
|
212
|
+
# TODO: report better on failure
|
|
213
|
+
print_date("DataLayer sync timing test results:")
|
|
214
|
+
print(f" store id: {self.store_id}")
|
|
215
|
+
print(f" reached: {generation}")
|
|
216
|
+
print(f" db size: {humanize_bytes(database_path.stat().st_size)}")
|
|
217
|
+
print(f" duration: {days}d {hours}h {minutes}m {seconds}s")
|
|
218
|
+
print(f" {total}s")
|
|
219
|
+
if len(all_times) > 0:
|
|
220
|
+
generation, duration = max(all_times.items(), key=lambda item: item[1])
|
|
221
|
+
print(f" max: {generation} @ {duration:.1f}s")
|
|
222
|
+
finally:
|
|
223
|
+
with anyio.CancelScope(shield=True):
|
|
224
|
+
print_date("stopping services")
|
|
225
|
+
await self.run_chia("stop", "-d", "all", check=False)
|
|
226
|
+
|
|
227
|
+
async def wait_for_wallet_synced(self) -> None:
|
|
228
|
+
print_date("waiting for wallet to sync")
|
|
229
|
+
while True:
|
|
230
|
+
run_result = await self.run_chia(
|
|
231
|
+
"wallet",
|
|
232
|
+
"show",
|
|
233
|
+
stdout=asyncio.subprocess.PIPE,
|
|
234
|
+
)
|
|
235
|
+
assert run_result.stdout is not None, "must not be none due to piping it in the exec call"
|
|
236
|
+
if "Sync status: Synced" not in run_result.stdout:
|
|
237
|
+
await asyncio.sleep(1)
|
|
238
|
+
continue
|
|
239
|
+
|
|
240
|
+
print_date("wallet synced")
|
|
241
|
+
break
|
|
242
|
+
|
|
243
|
+
async def run_chia(self, *args: str, check: bool = True, **kwargs: Any) -> RunResult:
|
|
244
|
+
env = os.environ.copy()
|
|
245
|
+
venv_path = Path(sysconfig.get_path("scripts"))
|
|
246
|
+
env["PATH"] = os.pathsep.join([os.fspath(venv_path), env["PATH"]])
|
|
247
|
+
env["CHIA_DATA_LAYER_STOP_AFTER_GENERATION"] = str(self.generation_limit)
|
|
248
|
+
env["CHIA_ROOT"] = os.fspath(self.context.root_path)
|
|
249
|
+
env["CHIA_KEYS_ROOT"] = os.fspath(self.context.keys_root_path)
|
|
250
|
+
|
|
251
|
+
process = await asyncio.create_subprocess_exec(
|
|
252
|
+
# sys.executable,
|
|
253
|
+
# "-m",
|
|
254
|
+
"chia",
|
|
255
|
+
*args,
|
|
256
|
+
**kwargs,
|
|
257
|
+
env=env,
|
|
258
|
+
)
|
|
259
|
+
stdout_bytes, stderr_bytes = await process.communicate()
|
|
260
|
+
if stdout_bytes is None:
|
|
261
|
+
stdout = None
|
|
262
|
+
else:
|
|
263
|
+
stdout = stdout_bytes.decode("utf-8")
|
|
264
|
+
if stderr_bytes is None:
|
|
265
|
+
stderr = None
|
|
266
|
+
else:
|
|
267
|
+
stderr = stderr_bytes.decode("utf-8")
|
|
268
|
+
if check:
|
|
269
|
+
assert process.returncode is not None, "must not be none due to .communicate() called above"
|
|
270
|
+
if process.returncode != 0:
|
|
271
|
+
raise NonZeroReturnCodeError(process.returncode)
|
|
272
|
+
|
|
273
|
+
return RunResult(process=process, stdout=stdout, stderr=stderr)
|
chia/cmds/{gh.py → dev/gh.py}
RENAMED
|
@@ -8,7 +8,7 @@ import uuid
|
|
|
8
8
|
import webbrowser
|
|
9
9
|
from collections.abc import Sequence
|
|
10
10
|
from pathlib import Path
|
|
11
|
-
from typing import Callable, ClassVar, Literal, Optional,
|
|
11
|
+
from typing import Callable, ClassVar, Literal, Optional, overload
|
|
12
12
|
|
|
13
13
|
import anyio
|
|
14
14
|
import click
|
|
@@ -21,9 +21,9 @@ class UnexpectedFormError(Exception):
|
|
|
21
21
|
pass
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
Oses =
|
|
25
|
-
Method =
|
|
26
|
-
Per =
|
|
24
|
+
Oses = Literal["linux", "macos-arm", "macos-intel", "windows"]
|
|
25
|
+
Method = Literal["GET", "POST"]
|
|
26
|
+
Per = Literal["directory", "file"]
|
|
27
27
|
|
|
28
28
|
all_oses: Sequence[Oses] = ("linux", "macos-arm", "macos-intel", "windows")
|
|
29
29
|
|
|
@@ -110,7 +110,7 @@ def gh_group() -> None:
|
|
|
110
110
|
)
|
|
111
111
|
class TestCMD:
|
|
112
112
|
workflow_id: ClassVar[str] = "test.yml"
|
|
113
|
-
owner: str = option("-
|
|
113
|
+
owner: str = option("-w", "--owner", help="Owner of the repo", type=str, default="Chia-Network")
|
|
114
114
|
repository: str = option("-r", "--repository", help="Repository name", type=str, default="chia-blockchain")
|
|
115
115
|
ref: Optional[str] = option(
|
|
116
116
|
"-f",
|
chia/cmds/dev/main.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
|
|
5
|
+
from chia.cmds.dev.data import data_group
|
|
6
|
+
from chia.cmds.dev.gh import gh_group
|
|
7
|
+
from chia.cmds.dev.installers import installers_group
|
|
8
|
+
from chia.cmds.dev.mempool import mempool_cmd
|
|
9
|
+
from chia.cmds.dev.sim import sim_cmd
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@click.group("dev", help="Developer commands and tools")
|
|
13
|
+
@click.pass_context
|
|
14
|
+
def dev_cmd(ctx: click.Context) -> None:
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
dev_cmd.add_command(sim_cmd)
|
|
19
|
+
dev_cmd.add_command(installers_group)
|
|
20
|
+
dev_cmd.add_command(gh_group)
|
|
21
|
+
dev_cmd.add_command(mempool_cmd)
|
|
22
|
+
dev_cmd.add_command(data_group)
|
chia/cmds/dev/mempool.py
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
|
|
8
|
+
from chia.cmds.cmd_classes import ChiaCliContext
|
|
9
|
+
from chia.cmds.dev.mempool_funcs import create_block_async, export_mempool_async, import_mempool_async
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@click.group("mempool", help="Debug the mempool")
|
|
13
|
+
@click.pass_context
|
|
14
|
+
def mempool_cmd(ctx: click.Context) -> None:
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@click.command("import", help="Import mempool items from a JSON file", no_args_is_help=True)
|
|
19
|
+
@click.option(
|
|
20
|
+
"-p",
|
|
21
|
+
"--rpc-port",
|
|
22
|
+
help=(
|
|
23
|
+
"Set the port where the Full Node is hosting the RPC interface. See the rpc_port under full_node in config.yaml"
|
|
24
|
+
),
|
|
25
|
+
type=int,
|
|
26
|
+
default=None,
|
|
27
|
+
)
|
|
28
|
+
@click.argument("path", type=str)
|
|
29
|
+
@click.pass_context
|
|
30
|
+
def import_mempool_cmd(ctx: click.Context, rpc_port: Optional[int], path: str) -> None:
|
|
31
|
+
import asyncio
|
|
32
|
+
|
|
33
|
+
with open(path) as file:
|
|
34
|
+
source = file.read()
|
|
35
|
+
|
|
36
|
+
content = json.loads(source)
|
|
37
|
+
|
|
38
|
+
asyncio.run(import_mempool_async(rpc_port, ChiaCliContext.set_default(ctx).root_path, content))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@click.command("export", help="Export mempool items to a JSON file", no_args_is_help=True)
|
|
42
|
+
@click.option(
|
|
43
|
+
"-p",
|
|
44
|
+
"--rpc-port",
|
|
45
|
+
help=(
|
|
46
|
+
"Set the port where the Full Node is hosting the RPC interface. See the rpc_port under full_node in config.yaml"
|
|
47
|
+
),
|
|
48
|
+
type=int,
|
|
49
|
+
default=None,
|
|
50
|
+
)
|
|
51
|
+
@click.argument("path", type=str)
|
|
52
|
+
@click.pass_context
|
|
53
|
+
def export_mempool_cmd(ctx: click.Context, rpc_port: Optional[int], path: str) -> None:
|
|
54
|
+
import asyncio
|
|
55
|
+
|
|
56
|
+
asyncio.run(export_mempool_async(rpc_port, ChiaCliContext.set_default(ctx).root_path, path))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@click.command("create_block", help="Create a block bundle from the mempool, as if you farmed it")
|
|
60
|
+
@click.option(
|
|
61
|
+
"-p",
|
|
62
|
+
"--rpc-port",
|
|
63
|
+
help=(
|
|
64
|
+
"Set the port where the Full Node is hosting the RPC interface. See the rpc_port under full_node in config.yaml"
|
|
65
|
+
),
|
|
66
|
+
type=int,
|
|
67
|
+
default=None,
|
|
68
|
+
)
|
|
69
|
+
@click.pass_context
|
|
70
|
+
def create_block_cmd(ctx: click.Context, rpc_port: Optional[int]) -> None:
|
|
71
|
+
import asyncio
|
|
72
|
+
|
|
73
|
+
asyncio.run(create_block_async(rpc_port, ChiaCliContext.set_default(ctx).root_path))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
mempool_cmd.add_command(import_mempool_cmd)
|
|
77
|
+
mempool_cmd.add_command(export_mempool_cmd)
|
|
78
|
+
mempool_cmd.add_command(create_block_cmd)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import time
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Optional
|
|
7
|
+
|
|
8
|
+
from chia_rs import SpendBundle
|
|
9
|
+
|
|
10
|
+
from chia.full_node.full_node_rpc_client import FullNodeRpcClient
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def import_mempool_async(
|
|
14
|
+
rpc_port: Optional[int],
|
|
15
|
+
root_path: Path,
|
|
16
|
+
content: dict[str, Any],
|
|
17
|
+
) -> None:
|
|
18
|
+
from chia.cmds.cmds_util import get_any_service_client
|
|
19
|
+
|
|
20
|
+
async with get_any_service_client(FullNodeRpcClient, root_path, rpc_port) as (node_client, _):
|
|
21
|
+
success = 0
|
|
22
|
+
failed = 0
|
|
23
|
+
|
|
24
|
+
for item in content["mempool_items"].values():
|
|
25
|
+
try:
|
|
26
|
+
await node_client.push_tx(SpendBundle.from_json_dict(item["spend_bundle"]))
|
|
27
|
+
success += 1
|
|
28
|
+
except Exception:
|
|
29
|
+
failed += 1
|
|
30
|
+
|
|
31
|
+
print(f"Successfully imported {success} mempool items, but failed to import {failed}")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
async def export_mempool_async(
|
|
35
|
+
rpc_port: Optional[int],
|
|
36
|
+
root_path: Path,
|
|
37
|
+
path: str,
|
|
38
|
+
) -> None:
|
|
39
|
+
from chia.cmds.cmds_util import get_any_service_client
|
|
40
|
+
|
|
41
|
+
async with get_any_service_client(FullNodeRpcClient, root_path, rpc_port) as (node_client, _):
|
|
42
|
+
items = await node_client.get_all_mempool_items()
|
|
43
|
+
content = {"mempool_items": {tx_id.hex(): item for tx_id, item in items.items()}}
|
|
44
|
+
|
|
45
|
+
with open(path, "w") as f:
|
|
46
|
+
json.dump(content, f)
|
|
47
|
+
|
|
48
|
+
print(f"Successfully exported {len(content['mempool_items'])} mempool items to {path}")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def create_block_async(
|
|
52
|
+
rpc_port: Optional[int],
|
|
53
|
+
root_path: Path,
|
|
54
|
+
) -> None:
|
|
55
|
+
from chia.cmds.cmds_util import get_any_service_client
|
|
56
|
+
|
|
57
|
+
async with get_any_service_client(FullNodeRpcClient, root_path, rpc_port) as (node_client, _):
|
|
58
|
+
start = time.monotonic()
|
|
59
|
+
block = await node_client.create_block_generator()
|
|
60
|
+
end = time.monotonic()
|
|
61
|
+
assert block is not None
|
|
62
|
+
gen = block["generator"]
|
|
63
|
+
print(f"Successfully created block generator in {end - start} seconds of {len(gen)} bytes")
|