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
|
@@ -1,27 +1,32 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import contextlib
|
|
4
5
|
import functools
|
|
5
6
|
import logging
|
|
7
|
+
from collections.abc import Awaitable
|
|
6
8
|
from dataclasses import dataclass
|
|
7
|
-
from typing import
|
|
9
|
+
from typing import Callable, Optional
|
|
8
10
|
from unittest.mock import MagicMock
|
|
9
11
|
|
|
10
12
|
import pytest
|
|
11
13
|
from aiosqlite import Error as AIOSqliteError
|
|
12
|
-
from chia_rs import confirm_not_included_already_hashed
|
|
14
|
+
from chia_rs import G2Element, confirm_not_included_already_hashed
|
|
15
|
+
from chiabip158 import PyBIP158
|
|
13
16
|
from colorlog import getLogger
|
|
14
17
|
|
|
15
|
-
from chia._tests.connection_utils import disconnect_all, disconnect_all_and_reconnect
|
|
18
|
+
from chia._tests.connection_utils import connect_and_get_peer, disconnect_all, disconnect_all_and_reconnect
|
|
16
19
|
from chia._tests.util.blockchain_mock import BlockchainMock
|
|
17
|
-
from chia._tests.util.misc import
|
|
20
|
+
from chia._tests.util.misc import patch_request_handler, wallet_height_at_least
|
|
18
21
|
from chia._tests.util.setup_nodes import OldSimulatorsAndWallets
|
|
19
22
|
from chia._tests.util.time_out_assert import time_out_assert, time_out_assert_not_none
|
|
20
23
|
from chia._tests.weight_proof.test_weight_proof import load_blocks_dont_validate
|
|
24
|
+
from chia.consensus.block_body_validation import ForkInfo
|
|
21
25
|
from chia.consensus.block_record import BlockRecord
|
|
22
26
|
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
23
27
|
from chia.consensus.constants import ConsensusConstants
|
|
24
28
|
from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
|
|
29
|
+
from chia.full_node.full_node_api import FullNodeAPI
|
|
25
30
|
from chia.full_node.weight_proof import WeightProofHandler
|
|
26
31
|
from chia.protocols import full_node_protocol, wallet_protocol
|
|
27
32
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
@@ -30,16 +35,26 @@ from chia.protocols.wallet_protocol import (
|
|
|
30
35
|
CoinState,
|
|
31
36
|
RequestAdditions,
|
|
32
37
|
RespondAdditions,
|
|
38
|
+
RespondBlockHeader,
|
|
33
39
|
RespondBlockHeaders,
|
|
34
40
|
SendTransaction,
|
|
35
41
|
)
|
|
36
42
|
from chia.server.outbound_message import Message, make_msg
|
|
43
|
+
from chia.server.server import ChiaServer
|
|
37
44
|
from chia.server.ws_connection import WSChiaConnection
|
|
45
|
+
from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
|
|
46
|
+
from chia.simulator.block_tools import BlockTools
|
|
47
|
+
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
38
48
|
from chia.simulator.simulator_protocol import FarmNewBlockProtocol
|
|
39
49
|
from chia.types.blockchain_format.program import Program
|
|
50
|
+
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
40
51
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
52
|
+
from chia.types.coin_spend import make_spend
|
|
53
|
+
from chia.types.condition_opcodes import ConditionOpcode
|
|
41
54
|
from chia.types.full_block import FullBlock
|
|
42
55
|
from chia.types.peer_info import PeerInfo
|
|
56
|
+
from chia.types.spend_bundle import SpendBundle
|
|
57
|
+
from chia.types.validation_state import ValidationState
|
|
43
58
|
from chia.util.hash import std_hash
|
|
44
59
|
from chia.util.ints import uint32, uint64, uint128
|
|
45
60
|
from chia.wallet.nft_wallet.nft_wallet import NFTWallet
|
|
@@ -70,7 +85,7 @@ pytestmark = pytest.mark.standard_block_tools
|
|
|
70
85
|
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
71
86
|
@pytest.mark.anyio
|
|
72
87
|
async def test_request_block_headers(
|
|
73
|
-
simulator_and_wallet: OldSimulatorsAndWallets, default_400_blocks:
|
|
88
|
+
simulator_and_wallet: OldSimulatorsAndWallets, default_400_blocks: list[FullBlock]
|
|
74
89
|
) -> None:
|
|
75
90
|
# Tests the edge case of receiving funds right before the recent blocks in weight proof
|
|
76
91
|
[full_node_api], [(wallet_node, _)], bt = simulator_and_wallet
|
|
@@ -99,6 +114,84 @@ async def test_request_block_headers(
|
|
|
99
114
|
assert len(bh) == 6
|
|
100
115
|
|
|
101
116
|
|
|
117
|
+
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
118
|
+
@pytest.mark.anyio
|
|
119
|
+
@pytest.mark.parametrize("rewards_only_tx_block", [True, False])
|
|
120
|
+
async def test_request_block_headers_transactions_filter(
|
|
121
|
+
one_node_one_block: tuple[FullNodeSimulator, ChiaServer, BlockTools], rewards_only_tx_block: bool
|
|
122
|
+
) -> None:
|
|
123
|
+
"""
|
|
124
|
+
Tests that `request_block_headers` returns a transactions filter that
|
|
125
|
+
correctly reflects the blocks transactions.
|
|
126
|
+
|
|
127
|
+
We use `rewards_only_tx_block` to control whether the test transaction
|
|
128
|
+
block contains our test spend as well, or just the reward coins.
|
|
129
|
+
|
|
130
|
+
For completeness, we're also comparing the outcome of
|
|
131
|
+
`request_block_headers` in this regard, to `request_header_blocks` as
|
|
132
|
+
well as `request_block_header`.
|
|
133
|
+
"""
|
|
134
|
+
full_node_api, _, bt = one_node_one_block
|
|
135
|
+
ph = SerializedProgram.to(1).get_tree_hash()
|
|
136
|
+
for _ in range(2):
|
|
137
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph))
|
|
138
|
+
if rewards_only_tx_block:
|
|
139
|
+
# Generate a transaction block without any spends
|
|
140
|
+
sb = None
|
|
141
|
+
else:
|
|
142
|
+
# Generate a transaction block with our test spend
|
|
143
|
+
coins = await full_node_api.full_node.coin_store.get_coin_records_by_puzzle_hash(False, ph)
|
|
144
|
+
[parent_coin] = [c.coin for c in coins if c.coin.amount == 250_000_000_000]
|
|
145
|
+
sb = SpendBundle(
|
|
146
|
+
[
|
|
147
|
+
make_spend(
|
|
148
|
+
parent_coin, SerializedProgram.to(1), SerializedProgram.to([[ConditionOpcode.CREATE_COIN, ph, 42]])
|
|
149
|
+
)
|
|
150
|
+
],
|
|
151
|
+
G2Element(),
|
|
152
|
+
)
|
|
153
|
+
blocks = await full_node_api.get_all_full_blocks()
|
|
154
|
+
blocks = bt.get_consecutive_blocks(1, blocks, guarantee_transaction_block=True, transaction_data=sb)
|
|
155
|
+
new_block = blocks[-1]
|
|
156
|
+
await full_node_api.full_node.add_block(new_block)
|
|
157
|
+
# Compute the expected transactions filter
|
|
158
|
+
if rewards_only_tx_block:
|
|
159
|
+
byte_array_tx = [bytearray(coin.puzzle_hash) for coin in new_block.get_included_reward_coins()]
|
|
160
|
+
else:
|
|
161
|
+
assert sb is not None
|
|
162
|
+
[test_spend] = sb.additions()
|
|
163
|
+
byte_array_tx = (
|
|
164
|
+
[bytearray(test_spend.puzzle_hash)]
|
|
165
|
+
+ [bytearray(coin.puzzle_hash) for coin in new_block.get_included_reward_coins()]
|
|
166
|
+
+ [bytearray(parent_coin.name())]
|
|
167
|
+
)
|
|
168
|
+
expected_transactions_filter = bytes(PyBIP158(byte_array_tx).GetEncoded())
|
|
169
|
+
# Perform the request and check the transactions filter
|
|
170
|
+
msg = await full_node_api.request_block_headers(
|
|
171
|
+
wallet_protocol.RequestBlockHeaders(uint32(new_block.height), uint32(new_block.height), True)
|
|
172
|
+
)
|
|
173
|
+
assert msg is not None
|
|
174
|
+
res_block_headers = RespondBlockHeaders.from_bytes(msg.data)
|
|
175
|
+
block_headers = res_block_headers.header_blocks
|
|
176
|
+
assert len(block_headers) == 1
|
|
177
|
+
block_header = block_headers[0]
|
|
178
|
+
assert block_header.transactions_filter == expected_transactions_filter
|
|
179
|
+
# Go further and compare this to the outcome of request_header_blocks
|
|
180
|
+
msg = await full_node_api.request_header_blocks(
|
|
181
|
+
wallet_protocol.RequestHeaderBlocks(uint32(new_block.height), uint32(new_block.height))
|
|
182
|
+
)
|
|
183
|
+
assert msg is not None
|
|
184
|
+
block_headers_res = RespondBlockHeaders.from_bytes(msg.data)
|
|
185
|
+
assert block_headers_res.header_blocks == block_headers
|
|
186
|
+
assert block_headers_res.header_blocks[0].transactions_filter == expected_transactions_filter
|
|
187
|
+
# Go even further and compare this to the outcome of request_block_header
|
|
188
|
+
msg = await full_node_api.request_block_header(wallet_protocol.RequestBlockHeader(uint32(new_block.height)))
|
|
189
|
+
assert msg is not None
|
|
190
|
+
block_header_res = RespondBlockHeader.from_bytes(msg.data)
|
|
191
|
+
assert block_header_res.header_block == block_header
|
|
192
|
+
assert block_header_res.header_block.transactions_filter == expected_transactions_filter
|
|
193
|
+
|
|
194
|
+
|
|
102
195
|
# @pytest.mark.parametrize(
|
|
103
196
|
# "test_case",
|
|
104
197
|
# [(1_000_000, 10_000_010, False, ProtocolMessageTypes.reject_block_headers)],
|
|
@@ -107,7 +200,7 @@ async def test_request_block_headers(
|
|
|
107
200
|
# )
|
|
108
201
|
@pytest.mark.anyio
|
|
109
202
|
async def test_request_block_headers_rejected(
|
|
110
|
-
simulator_and_wallet: OldSimulatorsAndWallets, default_400_blocks:
|
|
203
|
+
simulator_and_wallet: OldSimulatorsAndWallets, default_400_blocks: list[FullBlock]
|
|
111
204
|
) -> None:
|
|
112
205
|
# Tests the edge case of receiving funds right before the recent blocks in weight proof
|
|
113
206
|
[full_node_api], _, _ = simulator_and_wallet
|
|
@@ -154,7 +247,7 @@ async def test_request_block_headers_rejected(
|
|
|
154
247
|
@pytest.mark.anyio
|
|
155
248
|
async def test_basic_sync_wallet(
|
|
156
249
|
two_wallet_nodes: OldSimulatorsAndWallets,
|
|
157
|
-
default_400_blocks:
|
|
250
|
+
default_400_blocks: list[FullBlock],
|
|
158
251
|
self_hostname: str,
|
|
159
252
|
use_delta_sync: bool,
|
|
160
253
|
) -> None:
|
|
@@ -182,10 +275,7 @@ async def test_basic_sync_wallet(
|
|
|
182
275
|
blocks_reorg = bt.get_consecutive_blocks(num_blocks - 1, block_list_input=default_400_blocks[:-5])
|
|
183
276
|
blocks_reorg = bt.get_consecutive_blocks(1, blocks_reorg, guarantee_transaction_block=True, current_time=True)
|
|
184
277
|
|
|
185
|
-
await add_blocks_in_batches(blocks_reorg[1:], full_node
|
|
186
|
-
|
|
187
|
-
for wallet_node, wallet_server in wallets:
|
|
188
|
-
await disconnect_all_and_reconnect(wallet_server, full_node_server, self_hostname)
|
|
278
|
+
await add_blocks_in_batches(blocks_reorg[1:], full_node)
|
|
189
279
|
|
|
190
280
|
for wallet_node, wallet_server in wallets:
|
|
191
281
|
await time_out_assert(
|
|
@@ -205,7 +295,7 @@ async def test_basic_sync_wallet(
|
|
|
205
295
|
@pytest.mark.anyio
|
|
206
296
|
async def test_almost_recent(
|
|
207
297
|
two_wallet_nodes: OldSimulatorsAndWallets,
|
|
208
|
-
default_400_blocks:
|
|
298
|
+
default_400_blocks: list[FullBlock],
|
|
209
299
|
self_hostname: str,
|
|
210
300
|
blockchain_constants: ConsensusConstants,
|
|
211
301
|
use_delta_sync: bool,
|
|
@@ -242,9 +332,7 @@ async def test_almost_recent(
|
|
|
242
332
|
blockchain_constants.WEIGHT_PROOF_RECENT_BLOCKS + 10, block_list_input=all_blocks
|
|
243
333
|
)
|
|
244
334
|
|
|
245
|
-
await add_blocks_in_batches(
|
|
246
|
-
new_blocks[base_num_blocks + 20 :], full_node, new_blocks[base_num_blocks + 19].header_hash
|
|
247
|
-
)
|
|
335
|
+
await add_blocks_in_batches(new_blocks[base_num_blocks + 20 :], full_node)
|
|
248
336
|
|
|
249
337
|
for wallet_node, wallet_server in wallets:
|
|
250
338
|
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
@@ -255,7 +343,7 @@ async def test_almost_recent(
|
|
|
255
343
|
@pytest.mark.anyio
|
|
256
344
|
async def test_backtrack_sync_wallet(
|
|
257
345
|
two_wallet_nodes: OldSimulatorsAndWallets,
|
|
258
|
-
default_400_blocks:
|
|
346
|
+
default_400_blocks: list[FullBlock],
|
|
259
347
|
self_hostname: str,
|
|
260
348
|
use_delta_sync: bool,
|
|
261
349
|
) -> None:
|
|
@@ -285,7 +373,7 @@ async def test_backtrack_sync_wallet(
|
|
|
285
373
|
@pytest.mark.anyio
|
|
286
374
|
async def test_short_batch_sync_wallet(
|
|
287
375
|
two_wallet_nodes: OldSimulatorsAndWallets,
|
|
288
|
-
default_400_blocks:
|
|
376
|
+
default_400_blocks: list[FullBlock],
|
|
289
377
|
self_hostname: str,
|
|
290
378
|
use_delta_sync: bool,
|
|
291
379
|
) -> None:
|
|
@@ -314,8 +402,8 @@ async def test_short_batch_sync_wallet(
|
|
|
314
402
|
@pytest.mark.anyio
|
|
315
403
|
async def test_long_sync_wallet(
|
|
316
404
|
two_wallet_nodes: OldSimulatorsAndWallets,
|
|
317
|
-
default_1000_blocks:
|
|
318
|
-
default_400_blocks:
|
|
405
|
+
default_1000_blocks: list[FullBlock],
|
|
406
|
+
default_400_blocks: list[FullBlock],
|
|
319
407
|
self_hostname: str,
|
|
320
408
|
use_delta_sync: bool,
|
|
321
409
|
) -> None:
|
|
@@ -330,7 +418,6 @@ async def test_long_sync_wallet(
|
|
|
330
418
|
# Untrusted node sync
|
|
331
419
|
wallets[1][0].config["trusted_peers"] = {}
|
|
332
420
|
wallets[1][0].config["use_delta_sync"] = use_delta_sync
|
|
333
|
-
|
|
334
421
|
await add_blocks_in_batches(default_400_blocks, full_node)
|
|
335
422
|
|
|
336
423
|
for wallet_node, wallet_server in wallets:
|
|
@@ -342,13 +429,11 @@ async def test_long_sync_wallet(
|
|
|
342
429
|
# Tests a long reorg
|
|
343
430
|
await add_blocks_in_batches(default_1000_blocks, full_node)
|
|
344
431
|
|
|
432
|
+
# ony the wallet with untrusted sync needs to reconnect
|
|
433
|
+
await disconnect_all_and_reconnect(wallets[1][1], full_node_server, self_hostname)
|
|
345
434
|
for wallet_node, wallet_server in wallets:
|
|
346
|
-
await disconnect_all_and_reconnect(wallet_server, full_node_server, self_hostname)
|
|
347
|
-
|
|
348
435
|
log.info(f"wallet node height is {await wallet_node.wallet_state_manager.blockchain.get_finished_sync_up_to()}")
|
|
349
|
-
await time_out_assert(
|
|
350
|
-
|
|
351
|
-
await disconnect_all_and_reconnect(wallet_server, full_node_server, self_hostname)
|
|
436
|
+
await time_out_assert(200, wallet_height_at_least, True, wallet_node, len(default_1000_blocks) - 1)
|
|
352
437
|
|
|
353
438
|
# Tests a short reorg
|
|
354
439
|
num_blocks = 30
|
|
@@ -358,12 +443,12 @@ async def test_long_sync_wallet(
|
|
|
358
443
|
sub_slot_iters, difficulty = get_next_sub_slot_iters_and_difficulty(
|
|
359
444
|
full_node.constants, True, block_record, full_node.blockchain
|
|
360
445
|
)
|
|
446
|
+
fork_height = blocks_reorg[-num_blocks - 10].height - 1
|
|
361
447
|
await full_node.add_block_batch(
|
|
362
448
|
blocks_reorg[-num_blocks - 10 : -1],
|
|
363
449
|
PeerInfo("0.0.0.0", 0),
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
current_difficulty=difficulty,
|
|
450
|
+
ForkInfo(fork_height, fork_height, blocks_reorg[-num_blocks - 10].prev_header_hash),
|
|
451
|
+
ValidationState(sub_slot_iters, difficulty, None),
|
|
367
452
|
)
|
|
368
453
|
await full_node.add_block(blocks_reorg[-1])
|
|
369
454
|
|
|
@@ -377,7 +462,7 @@ async def test_long_sync_wallet(
|
|
|
377
462
|
@pytest.mark.anyio
|
|
378
463
|
async def test_wallet_reorg_sync(
|
|
379
464
|
two_wallet_nodes: OldSimulatorsAndWallets,
|
|
380
|
-
default_400_blocks:
|
|
465
|
+
default_400_blocks: list[FullBlock],
|
|
381
466
|
self_hostname: str,
|
|
382
467
|
use_delta_sync: bool,
|
|
383
468
|
) -> None:
|
|
@@ -401,12 +486,19 @@ async def test_wallet_reorg_sync(
|
|
|
401
486
|
await wallet_server.start_client(PeerInfo(self_hostname, full_node_server.get_port()), None)
|
|
402
487
|
|
|
403
488
|
# Insert 400 blocks
|
|
404
|
-
await
|
|
405
|
-
await add_blocks_in_batches(default_400_blocks[1:], full_node)
|
|
489
|
+
await add_blocks_in_batches(default_400_blocks, full_node)
|
|
406
490
|
# Farm few more with reward
|
|
491
|
+
|
|
492
|
+
wallet_node1, _ = wallets[0]
|
|
493
|
+
wallet1 = wallet_node.wallet_state_manager.main_wallet
|
|
494
|
+
wallet_node2, _ = wallets[1]
|
|
495
|
+
wallet2 = wallet_node2.wallet_state_manager.main_wallet
|
|
496
|
+
|
|
497
|
+
await time_out_assert(60, wallet_height_at_least, True, wallet1, 399)
|
|
498
|
+
await time_out_assert(60, wallet_height_at_least, True, wallet2, 399)
|
|
499
|
+
|
|
407
500
|
for _ in range(num_blocks - 1):
|
|
408
501
|
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(phs[0]))
|
|
409
|
-
|
|
410
502
|
for _ in range(num_blocks):
|
|
411
503
|
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(phs[1]))
|
|
412
504
|
|
|
@@ -415,17 +507,19 @@ async def test_wallet_reorg_sync(
|
|
|
415
507
|
calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, num_blocks)
|
|
416
508
|
)
|
|
417
509
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
510
|
+
await time_out_assert(60, wallet_height_at_least, True, wallet1, 408)
|
|
511
|
+
await time_out_assert(60, wallet1.get_confirmed_balance, funds)
|
|
512
|
+
await time_out_assert(60, get_tx_count, 2 * (num_blocks - 1), wallet_node1.wallet_state_manager, 1)
|
|
513
|
+
|
|
514
|
+
await time_out_assert(60, wallet_height_at_least, True, wallet2, 408)
|
|
515
|
+
await time_out_assert(60, wallet2.get_confirmed_balance, funds)
|
|
516
|
+
await time_out_assert(60, get_tx_count, 2 * (num_blocks - 1), wallet_node2.wallet_state_manager, 1)
|
|
422
517
|
|
|
423
518
|
# Reorg blocks that carry reward
|
|
424
519
|
num_blocks = 30
|
|
425
520
|
blocks_reorg = bt.get_consecutive_blocks(num_blocks, block_list_input=default_400_blocks[:-5])
|
|
426
521
|
|
|
427
|
-
|
|
428
|
-
await full_node.add_block(block)
|
|
522
|
+
await add_blocks_in_batches(blocks_reorg[-30:], full_node)
|
|
429
523
|
|
|
430
524
|
for wallet_node, wallet_server in wallets:
|
|
431
525
|
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
@@ -436,7 +530,7 @@ async def test_wallet_reorg_sync(
|
|
|
436
530
|
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
437
531
|
@pytest.mark.anyio
|
|
438
532
|
async def test_wallet_reorg_get_coinbase(
|
|
439
|
-
two_wallet_nodes: OldSimulatorsAndWallets, default_400_blocks:
|
|
533
|
+
two_wallet_nodes: OldSimulatorsAndWallets, default_400_blocks: list[FullBlock], self_hostname: str
|
|
440
534
|
) -> None:
|
|
441
535
|
[full_node_api], wallets, bt = two_wallet_nodes
|
|
442
536
|
full_node = full_node_api.full_node
|
|
@@ -481,9 +575,8 @@ async def test_wallet_reorg_get_coinbase(
|
|
|
481
575
|
await full_node.add_block_batch(
|
|
482
576
|
blocks_reorg_2[-44:],
|
|
483
577
|
PeerInfo("0.0.0.0", 0),
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
current_difficulty=difficulty,
|
|
578
|
+
ForkInfo(blocks_reorg_2[-45].height, blocks_reorg_2[-45].height, blocks_reorg_2[-45].header_hash),
|
|
579
|
+
ValidationState(sub_slot_iters, difficulty, None),
|
|
487
580
|
)
|
|
488
581
|
|
|
489
582
|
for wallet_node, wallet_server in wallets:
|
|
@@ -572,7 +665,7 @@ async def test_request_additions_success(simulator_and_wallet: OldSimulatorsAndW
|
|
|
572
665
|
|
|
573
666
|
await full_node_api.wait_for_wallet_synced(wallet_node=wallet_node, timeout=20)
|
|
574
667
|
|
|
575
|
-
payees:
|
|
668
|
+
payees: list[Payment] = []
|
|
576
669
|
for i in range(10):
|
|
577
670
|
payee_ph = await wallet.get_new_puzzlehash()
|
|
578
671
|
payees.append(Payment(payee_ph, uint64(i + 100)))
|
|
@@ -644,7 +737,7 @@ async def test_request_additions_success(simulator_and_wallet: OldSimulatorsAndW
|
|
|
644
737
|
|
|
645
738
|
@pytest.mark.anyio
|
|
646
739
|
async def test_get_wp_fork_point(
|
|
647
|
-
default_10000_blocks:
|
|
740
|
+
default_10000_blocks: list[FullBlock], blockchain_constants: ConsensusConstants
|
|
648
741
|
) -> None:
|
|
649
742
|
blocks = default_10000_blocks
|
|
650
743
|
header_cache, height_to_hash, sub_blocks, summaries = await load_blocks_dont_validate(blocks, blockchain_constants)
|
|
@@ -787,7 +880,7 @@ async def test_dusted_wallet(
|
|
|
787
880
|
await full_node_api.wait_for_wallets_synced(wallet_nodes=[farm_wallet_node, dust_wallet_node], timeout=20)
|
|
788
881
|
|
|
789
882
|
# Part 1: create a single dust coin
|
|
790
|
-
payees:
|
|
883
|
+
payees: list[Payment] = []
|
|
791
884
|
payee_ph = await dust_wallet.get_new_puzzlehash()
|
|
792
885
|
payees.append(Payment(payee_ph, uint64(dust_value)))
|
|
793
886
|
|
|
@@ -1244,7 +1337,7 @@ async def test_retry_store(
|
|
|
1244
1337
|
full_node_api = full_nodes[0]
|
|
1245
1338
|
full_node_server = full_node_api.full_node.server
|
|
1246
1339
|
|
|
1247
|
-
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32
|
|
1340
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
|
|
1248
1341
|
|
|
1249
1342
|
# Trusted node sync
|
|
1250
1343
|
wallets[0][0].config["trusted_peers"] = {full_node_server.node_id.hex(): full_node_server.node_id.hex()}
|
|
@@ -1261,11 +1354,11 @@ async def test_retry_store(
|
|
|
1261
1354
|
|
|
1262
1355
|
def flaky_get_coin_state(
|
|
1263
1356
|
flakiness_info: FlakinessInfo,
|
|
1264
|
-
func: Callable[[
|
|
1265
|
-
) -> Callable[[
|
|
1357
|
+
func: Callable[[list[bytes32], WSChiaConnection, Optional[uint32]], Awaitable[list[CoinState]]],
|
|
1358
|
+
) -> Callable[[list[bytes32], WSChiaConnection, Optional[uint32]], Awaitable[list[CoinState]]]:
|
|
1266
1359
|
async def new_func(
|
|
1267
|
-
coin_names:
|
|
1268
|
-
) ->
|
|
1360
|
+
coin_names: list[bytes32], peer: WSChiaConnection, fork_height: Optional[uint32] = None
|
|
1361
|
+
) -> list[CoinState]:
|
|
1269
1362
|
if flakiness_info.coin_state_flaky:
|
|
1270
1363
|
flakiness_info.coin_state_flaky = False
|
|
1271
1364
|
raise PeerRequestException()
|
|
@@ -1277,28 +1370,28 @@ async def test_retry_store(
|
|
|
1277
1370
|
request_puzzle_solution_failure_tested = False
|
|
1278
1371
|
|
|
1279
1372
|
def flaky_request_puzzle_solution(
|
|
1280
|
-
func: Callable[[wallet_protocol.RequestPuzzleSolution], Awaitable[Optional[Message]]]
|
|
1281
|
-
) -> Callable[[wallet_protocol.RequestPuzzleSolution], Awaitable[Optional[Message]]]:
|
|
1373
|
+
func: Callable[[FullNodeAPI, wallet_protocol.RequestPuzzleSolution], Awaitable[Optional[Message]]],
|
|
1374
|
+
) -> Callable[[FullNodeAPI, wallet_protocol.RequestPuzzleSolution], Awaitable[Optional[Message]]]:
|
|
1282
1375
|
@functools.wraps(func)
|
|
1283
|
-
async def new_func(request: wallet_protocol.RequestPuzzleSolution) -> Optional[Message]:
|
|
1376
|
+
async def new_func(self: FullNodeAPI, request: wallet_protocol.RequestPuzzleSolution) -> Optional[Message]:
|
|
1284
1377
|
nonlocal request_puzzle_solution_failure_tested
|
|
1285
1378
|
if not request_puzzle_solution_failure_tested:
|
|
1286
1379
|
request_puzzle_solution_failure_tested = True
|
|
1287
1380
|
# This can just return None if we have `none_response` enabled.
|
|
1288
|
-
reject = wallet_protocol.RejectPuzzleSolution(bytes32
|
|
1381
|
+
reject = wallet_protocol.RejectPuzzleSolution(bytes32.zeros, uint32(0))
|
|
1289
1382
|
return make_msg(ProtocolMessageTypes.reject_puzzle_solution, reject)
|
|
1290
1383
|
else:
|
|
1291
|
-
return await func(request)
|
|
1384
|
+
return await func(self, request)
|
|
1292
1385
|
|
|
1293
1386
|
return new_func
|
|
1294
1387
|
|
|
1295
1388
|
def flaky_fetch_children(
|
|
1296
1389
|
flakiness_info: FlakinessInfo,
|
|
1297
|
-
func: Callable[[bytes32, WSChiaConnection, Optional[uint32]], Awaitable[
|
|
1298
|
-
) -> Callable[[bytes32, WSChiaConnection, Optional[uint32]], Awaitable[
|
|
1390
|
+
func: Callable[[bytes32, WSChiaConnection, Optional[uint32]], Awaitable[list[CoinState]]],
|
|
1391
|
+
) -> Callable[[bytes32, WSChiaConnection, Optional[uint32]], Awaitable[list[CoinState]]]:
|
|
1299
1392
|
async def new_func(
|
|
1300
1393
|
coin_name: bytes32, peer: WSChiaConnection, fork_height: Optional[uint32] = None
|
|
1301
|
-
) ->
|
|
1394
|
+
) -> list[CoinState]:
|
|
1302
1395
|
if flakiness_info.fetch_children_flaky:
|
|
1303
1396
|
flakiness_info.fetch_children_flaky = False
|
|
1304
1397
|
raise PeerRequestException()
|
|
@@ -1331,12 +1424,15 @@ async def test_retry_store(
|
|
|
1331
1424
|
|
|
1332
1425
|
return new_func
|
|
1333
1426
|
|
|
1334
|
-
with
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1427
|
+
with contextlib.ExitStack() as exit_stack:
|
|
1428
|
+
exit_stack.enter_context(
|
|
1429
|
+
patch_request_handler(
|
|
1430
|
+
api=full_node_api,
|
|
1431
|
+
handler=flaky_request_puzzle_solution(FullNodeAPI.request_puzzle_solution),
|
|
1432
|
+
request_type=ProtocolMessageTypes.request_puzzle_solution,
|
|
1433
|
+
)
|
|
1339
1434
|
)
|
|
1435
|
+
m = exit_stack.enter_context(monkeypatch.context())
|
|
1340
1436
|
|
|
1341
1437
|
for wallet_node, wallet_server in wallets:
|
|
1342
1438
|
wallet_node.coin_state_retry_seconds = 1
|
|
@@ -1362,7 +1458,7 @@ async def test_retry_store(
|
|
|
1362
1458
|
wallet = wallet_node.wallet_state_manager.main_wallet
|
|
1363
1459
|
ph = await wallet.get_new_puzzlehash()
|
|
1364
1460
|
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph))
|
|
1365
|
-
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32
|
|
1461
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
|
|
1366
1462
|
|
|
1367
1463
|
async def retry_store_empty() -> bool:
|
|
1368
1464
|
return len(await wallet_node.wallet_state_manager.retry_store.get_all_states_to_retry()) == 0
|
|
@@ -1377,7 +1473,7 @@ async def test_retry_store(
|
|
|
1377
1473
|
|
|
1378
1474
|
async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
1379
1475
|
await wallet.generate_signed_transaction(
|
|
1380
|
-
uint64(1_000_000_000_000), bytes32
|
|
1476
|
+
uint64(1_000_000_000_000), bytes32.zeros, action_scope, memos=[ph]
|
|
1381
1477
|
)
|
|
1382
1478
|
[tx] = action_scope.side_effects.transactions
|
|
1383
1479
|
await time_out_assert(30, wallet.get_confirmed_balance, 2_000_000_000_000)
|
|
@@ -1386,7 +1482,7 @@ async def test_retry_store(
|
|
|
1386
1482
|
return full_node_api.full_node.mempool_manager.get_spendbundle(tx.name) is not None
|
|
1387
1483
|
|
|
1388
1484
|
await time_out_assert(15, tx_in_mempool)
|
|
1389
|
-
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32
|
|
1485
|
+
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(bytes32.zeros))
|
|
1390
1486
|
|
|
1391
1487
|
await assert_coin_state_retry()
|
|
1392
1488
|
|
|
@@ -1404,7 +1500,7 @@ async def test_retry_store(
|
|
|
1404
1500
|
@pytest.mark.skip("the test fails with 'wallet_state_manager not assigned'. This test doesn't work, skip it for now")
|
|
1405
1501
|
async def test_bad_peak_mismatch(
|
|
1406
1502
|
two_wallet_nodes: OldSimulatorsAndWallets,
|
|
1407
|
-
default_1000_blocks:
|
|
1503
|
+
default_1000_blocks: list[FullBlock],
|
|
1408
1504
|
self_hostname: str,
|
|
1409
1505
|
blockchain_constants: ConsensusConstants,
|
|
1410
1506
|
monkeypatch: pytest.MonkeyPatch,
|
|
@@ -1463,11 +1559,10 @@ async def test_bad_peak_mismatch(
|
|
|
1463
1559
|
@pytest.mark.anyio
|
|
1464
1560
|
async def test_long_sync_untrusted_break(
|
|
1465
1561
|
setup_two_nodes_and_wallet: OldSimulatorsAndWallets,
|
|
1466
|
-
default_1000_blocks:
|
|
1467
|
-
default_400_blocks:
|
|
1562
|
+
default_1000_blocks: list[FullBlock],
|
|
1563
|
+
default_400_blocks: list[FullBlock],
|
|
1468
1564
|
self_hostname: str,
|
|
1469
1565
|
caplog: pytest.LogCaptureFixture,
|
|
1470
|
-
monkeypatch: pytest.MonkeyPatch,
|
|
1471
1566
|
use_delta_sync: bool,
|
|
1472
1567
|
) -> None:
|
|
1473
1568
|
[trusted_full_node_api, untrusted_full_node_api], [(wallet_node, wallet_server)], _ = setup_two_nodes_and_wallet
|
|
@@ -1478,7 +1573,11 @@ async def test_long_sync_untrusted_break(
|
|
|
1478
1573
|
|
|
1479
1574
|
sync_canceled = False
|
|
1480
1575
|
|
|
1481
|
-
async def
|
|
1576
|
+
async def register_for_ph_updates(
|
|
1577
|
+
self: object,
|
|
1578
|
+
request: wallet_protocol.RegisterForPhUpdates,
|
|
1579
|
+
peer: WSChiaConnection,
|
|
1580
|
+
) -> None:
|
|
1482
1581
|
nonlocal sync_canceled
|
|
1483
1582
|
# Just sleep a long time here to simulate a long-running untrusted sync
|
|
1484
1583
|
try:
|
|
@@ -1505,13 +1604,7 @@ async def test_long_sync_untrusted_break(
|
|
|
1505
1604
|
|
|
1506
1605
|
await add_blocks_in_batches(default_1000_blocks[:400], untrusted_full_node_api.full_node)
|
|
1507
1606
|
|
|
1508
|
-
with
|
|
1509
|
-
m.setattr(
|
|
1510
|
-
untrusted_full_node_api,
|
|
1511
|
-
"register_interest_in_puzzle_hash",
|
|
1512
|
-
MagicMock(return_value=register_interest_in_puzzle_hash()),
|
|
1513
|
-
)
|
|
1514
|
-
|
|
1607
|
+
with patch_request_handler(api=untrusted_full_node_api, handler=register_for_ph_updates):
|
|
1515
1608
|
# Connect to the untrusted peer and wait until the long sync started
|
|
1516
1609
|
await wallet_server.start_client(PeerInfo(self_hostname, untrusted_full_node_server.get_port()), None)
|
|
1517
1610
|
await time_out_assert(30, wallet_syncing)
|
|
@@ -1527,3 +1620,73 @@ async def test_long_sync_untrusted_break(
|
|
|
1527
1620
|
assert time_out_assert(30, check_sync_canceled)
|
|
1528
1621
|
# And that we only have a trusted peer left
|
|
1529
1622
|
assert time_out_assert(30, only_trusted_peer)
|
|
1623
|
+
|
|
1624
|
+
|
|
1625
|
+
@pytest.mark.anyio
|
|
1626
|
+
@pytest.mark.parametrize("chain_length", [0, 100])
|
|
1627
|
+
@pytest.mark.parametrize("fork_point", [500, 1500])
|
|
1628
|
+
async def test_long_reorg_nodes_and_wallet(
|
|
1629
|
+
chain_length: int,
|
|
1630
|
+
fork_point: int,
|
|
1631
|
+
three_nodes: list[FullNodeAPI],
|
|
1632
|
+
simulator_and_wallet: OldSimulatorsAndWallets,
|
|
1633
|
+
default_10000_blocks: list[FullBlock],
|
|
1634
|
+
test_long_reorg_blocks: list[FullBlock],
|
|
1635
|
+
test_long_reorg_1500_blocks: list[FullBlock],
|
|
1636
|
+
self_hostname: str,
|
|
1637
|
+
) -> None:
|
|
1638
|
+
full_node_1, full_node_2, _ = three_nodes
|
|
1639
|
+
_, [wallet], _ = simulator_and_wallet
|
|
1640
|
+
wallet_node = wallet[0]
|
|
1641
|
+
wallet_server = wallet[1]
|
|
1642
|
+
# Trusted node sync
|
|
1643
|
+
wallet_node.config["trusted_peers"] = {full_node_1.server.node_id.hex(): full_node_1.server.node_id.hex()}
|
|
1644
|
+
|
|
1645
|
+
if fork_point == 1500:
|
|
1646
|
+
blocks = default_10000_blocks[: 3600 - chain_length]
|
|
1647
|
+
else:
|
|
1648
|
+
blocks = default_10000_blocks[: 1600 - chain_length]
|
|
1649
|
+
if fork_point == 1500:
|
|
1650
|
+
reorg_blocks = test_long_reorg_1500_blocks[: 3100 - chain_length]
|
|
1651
|
+
else:
|
|
1652
|
+
reorg_blocks = test_long_reorg_blocks[: 1200 - chain_length]
|
|
1653
|
+
pytest.skip("We rely on the light-blocks test for a 0 forkpoint")
|
|
1654
|
+
|
|
1655
|
+
last_blk = blocks[-1]
|
|
1656
|
+
last_reorg_blk = reorg_blocks[-1]
|
|
1657
|
+
assert last_blk.header_hash != last_reorg_blk.header_hash
|
|
1658
|
+
assert last_blk.weight < last_reorg_blk.weight
|
|
1659
|
+
|
|
1660
|
+
await wallet_server.start_client(PeerInfo(self_hostname, full_node_1.server.get_port()), None)
|
|
1661
|
+
assert len(wallet_server.all_connections) == 1
|
|
1662
|
+
assert len(full_node_1.server.all_connections) == 1
|
|
1663
|
+
|
|
1664
|
+
await add_blocks_in_batches(blocks, full_node_1.full_node)
|
|
1665
|
+
node_1_peak = full_node_1.full_node.blockchain.get_peak()
|
|
1666
|
+
assert node_1_peak is not None
|
|
1667
|
+
await time_out_assert(600, wallet_height_at_least, True, wallet_node, node_1_peak.height)
|
|
1668
|
+
log.info(f"wallet node height is {node_1_peak.height}")
|
|
1669
|
+
# full node 2 has the reorg-chain
|
|
1670
|
+
await add_blocks_in_batches(reorg_blocks[:-1], full_node_2.full_node)
|
|
1671
|
+
await connect_and_get_peer(full_node_1.full_node.server, full_node_2.full_node.server, self_hostname)
|
|
1672
|
+
|
|
1673
|
+
# # TODO: There appears to be an issue where the node with the lighter chain
|
|
1674
|
+
# # fails to initiate the reorg until there's a new block farmed onto the
|
|
1675
|
+
# # heavier chain.
|
|
1676
|
+
await full_node_2.full_node.add_block(reorg_blocks[-1])
|
|
1677
|
+
|
|
1678
|
+
def check_nodes_in_sync() -> bool:
|
|
1679
|
+
p1 = full_node_1.full_node.blockchain.get_peak()
|
|
1680
|
+
p2 = full_node_2.full_node.blockchain.get_peak()
|
|
1681
|
+
return p1 is not None and p1 == p2
|
|
1682
|
+
|
|
1683
|
+
await time_out_assert(600, check_nodes_in_sync)
|
|
1684
|
+
node_2_peak = full_node_2.full_node.blockchain.get_peak()
|
|
1685
|
+
assert node_2_peak is not None
|
|
1686
|
+
print(f"peak: {str(node_2_peak.header_hash)[:6]}")
|
|
1687
|
+
await time_out_assert(600, wallet_height_at_least, True, wallet_node, node_2_peak.height)
|
|
1688
|
+
# reorg1_timing = time.monotonic() - start
|
|
1689
|
+
# we already checked p1==p2
|
|
1690
|
+
p1 = full_node_2.full_node.blockchain.get_peak()
|
|
1691
|
+
assert p1 is not None
|
|
1692
|
+
assert p1.header_hash == last_reorg_blk.header_hash
|