chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5__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 +529 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +61 -132
- 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 +495 -265
- 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 +153 -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 +47 -45
- 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 +274 -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.5.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.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.5.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
|
@@ -5,433 +5,473 @@ import logging
|
|
|
5
5
|
import time
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
|
-
from chia_rs
|
|
8
|
+
from chia_rs import ConsensusConstants, FullBlock, SubEpochSummary
|
|
9
|
+
from chia_rs.sized_ints import uint16, uint32, uint64
|
|
9
10
|
|
|
11
|
+
from chia._tests.conftest import ConsensusMode
|
|
10
12
|
from chia._tests.core.node_height import node_height_between, node_height_exactly
|
|
11
13
|
from chia._tests.util.time_out_assert import time_out_assert
|
|
12
14
|
from chia.full_node.full_node_api import FullNodeAPI
|
|
13
15
|
from chia.protocols import full_node_protocol
|
|
14
16
|
from chia.protocols.shared_protocol import Capability
|
|
15
|
-
from chia.
|
|
16
|
-
from chia.
|
|
17
|
+
from chia.server.server import ChiaServer
|
|
18
|
+
from chia.simulator.block_tools import BlockTools
|
|
17
19
|
from chia.types.peer_info import PeerInfo
|
|
18
20
|
from chia.util.hash import std_hash
|
|
19
21
|
|
|
20
22
|
log = logging.getLogger(__name__)
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
25
|
+
@pytest.mark.anyio
|
|
26
|
+
async def test_long_sync_from_zero(
|
|
27
|
+
five_nodes: list[FullNodeAPI], default_400_blocks: list[FullBlock], bt: BlockTools, self_hostname: str
|
|
28
|
+
) -> None:
|
|
29
|
+
# Must be larger than "sync_block_behind_threshold" in the config
|
|
30
|
+
num_blocks = len(default_400_blocks)
|
|
31
|
+
blocks: list[FullBlock] = default_400_blocks
|
|
32
|
+
full_node_1, full_node_2, full_node_3, full_node_4, full_node_5 = five_nodes
|
|
33
|
+
server_1 = full_node_1.full_node.server
|
|
34
|
+
server_2 = full_node_2.full_node.server
|
|
35
|
+
server_3 = full_node_3.full_node.server
|
|
36
|
+
server_4 = full_node_4.full_node.server
|
|
37
|
+
server_5 = full_node_5.full_node.server
|
|
38
|
+
|
|
39
|
+
# If this constant is changed, update the tests to use more blocks
|
|
40
|
+
assert bt.constants.WEIGHT_PROOF_RECENT_BLOCKS < 400
|
|
41
|
+
|
|
42
|
+
# Syncs up less than recent blocks
|
|
43
|
+
for block in blocks[: bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5]:
|
|
44
|
+
await full_node_1.full_node.add_block(block)
|
|
45
|
+
|
|
46
|
+
await server_2.start_client(
|
|
47
|
+
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_2.full_node.on_connect
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
timeout_seconds = 250
|
|
51
|
+
|
|
52
|
+
# The second node should eventually catch up to the first one
|
|
53
|
+
await time_out_assert(
|
|
54
|
+
timeout_seconds, node_height_exactly, True, full_node_2, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5 - 1
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
for block in blocks[bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5 : bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5]:
|
|
58
|
+
await full_node_1.full_node.add_block(block)
|
|
59
|
+
|
|
60
|
+
await server_3.start_client(
|
|
61
|
+
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_3.full_node.on_connect
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
# Node 3 and Node 2 sync up to node 1
|
|
65
|
+
await time_out_assert(
|
|
66
|
+
timeout_seconds, node_height_exactly, True, full_node_2, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 - 1
|
|
67
|
+
)
|
|
68
|
+
await time_out_assert(
|
|
69
|
+
timeout_seconds, node_height_exactly, True, full_node_3, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 - 1
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
cons = list(server_1.all_connections.values())[:]
|
|
73
|
+
for con in cons:
|
|
74
|
+
await con.close()
|
|
75
|
+
for block in blocks[bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 :]:
|
|
76
|
+
await full_node_1.full_node.add_block(block)
|
|
77
|
+
|
|
78
|
+
await server_2.start_client(
|
|
79
|
+
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_2.full_node.on_connect
|
|
80
|
+
)
|
|
81
|
+
await server_3.start_client(
|
|
82
|
+
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_3.full_node.on_connect
|
|
83
|
+
)
|
|
84
|
+
await server_4.start_client(
|
|
85
|
+
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_4.full_node.on_connect
|
|
86
|
+
)
|
|
87
|
+
await server_3.start_client(
|
|
88
|
+
PeerInfo(self_hostname, server_2.get_port()), on_connect=full_node_3.full_node.on_connect
|
|
89
|
+
)
|
|
90
|
+
await server_4.start_client(
|
|
91
|
+
PeerInfo(self_hostname, server_3.get_port()), on_connect=full_node_4.full_node.on_connect
|
|
92
|
+
)
|
|
93
|
+
await server_4.start_client(
|
|
94
|
+
PeerInfo(self_hostname, server_2.get_port()), on_connect=full_node_4.full_node.on_connect
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# All four nodes are synced
|
|
98
|
+
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_1, num_blocks - 1)
|
|
99
|
+
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_2, num_blocks - 1)
|
|
100
|
+
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_3, num_blocks - 1)
|
|
101
|
+
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_4, num_blocks - 1)
|
|
102
|
+
|
|
103
|
+
# Deep reorg, fall back from batch sync to long sync
|
|
104
|
+
blocks_node_5 = bt.get_consecutive_blocks(60, block_list_input=blocks[:350], seed=b"node5")
|
|
105
|
+
for block in blocks_node_5:
|
|
106
|
+
await full_node_5.full_node.add_block(block)
|
|
107
|
+
await server_5.start_client(
|
|
108
|
+
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_5.full_node.on_connect
|
|
109
|
+
)
|
|
110
|
+
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_5, 409)
|
|
111
|
+
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_1, 409)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@pytest.mark.anyio
|
|
115
|
+
async def test_sync_from_fork_point_and_weight_proof(
|
|
116
|
+
three_nodes: list[FullNodeAPI],
|
|
117
|
+
default_1000_blocks: list[FullBlock],
|
|
118
|
+
default_400_blocks: list[FullBlock],
|
|
119
|
+
self_hostname: str,
|
|
120
|
+
) -> None:
|
|
121
|
+
# Must be larger than "sync_block_behind_threshold" in the config
|
|
122
|
+
num_blocks_initial = len(default_1000_blocks) - 50
|
|
123
|
+
blocks_950 = default_1000_blocks[:num_blocks_initial]
|
|
124
|
+
blocks_rest = default_1000_blocks[num_blocks_initial:]
|
|
125
|
+
blocks_400 = default_400_blocks
|
|
126
|
+
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
127
|
+
server_1 = full_node_1.full_node.server
|
|
128
|
+
server_2 = full_node_2.full_node.server
|
|
129
|
+
server_3 = full_node_3.full_node.server
|
|
130
|
+
|
|
131
|
+
for block in blocks_950:
|
|
132
|
+
await full_node_1.full_node.add_block(block)
|
|
133
|
+
|
|
134
|
+
# Node 2 syncs from halfway
|
|
135
|
+
for i in range(int(len(default_1000_blocks) / 2)):
|
|
136
|
+
await full_node_2.full_node.add_block(default_1000_blocks[i])
|
|
137
|
+
|
|
138
|
+
# Node 3 syncs from a different blockchain
|
|
139
|
+
for block in blocks_400:
|
|
140
|
+
await full_node_3.full_node.add_block(block)
|
|
141
|
+
|
|
142
|
+
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
143
|
+
await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
|
|
144
|
+
|
|
145
|
+
# Also test request proof of weight
|
|
146
|
+
# Have the request header hash
|
|
147
|
+
res = await full_node_1.request_proof_of_weight(
|
|
148
|
+
full_node_protocol.RequestProofOfWeight(uint32(blocks_950[-1].height + 1), blocks_950[-1].header_hash)
|
|
149
|
+
)
|
|
150
|
+
assert res is not None
|
|
151
|
+
assert full_node_1.full_node.weight_proof_handler is not None
|
|
152
|
+
validated, _, _ = await full_node_1.full_node.weight_proof_handler.validate_weight_proof(
|
|
153
|
+
full_node_protocol.RespondProofOfWeight.from_bytes(res.data).wp
|
|
154
|
+
)
|
|
155
|
+
assert validated
|
|
156
|
+
|
|
157
|
+
# Don't have the request header hash
|
|
158
|
+
res = await full_node_1.request_proof_of_weight(
|
|
159
|
+
full_node_protocol.RequestProofOfWeight(uint32(blocks_950[-1].height + 1), std_hash(b"12"))
|
|
160
|
+
)
|
|
161
|
+
assert res is None
|
|
162
|
+
|
|
163
|
+
# The second node should eventually catch up to the first one, and have the
|
|
164
|
+
# same tip at height num_blocks - 1
|
|
165
|
+
await time_out_assert(300, node_height_exactly, True, full_node_2, num_blocks_initial - 1)
|
|
166
|
+
await time_out_assert(180, node_height_exactly, True, full_node_3, num_blocks_initial - 1)
|
|
167
|
+
|
|
168
|
+
def fn3_is_not_syncing() -> bool:
|
|
169
|
+
return not full_node_3.full_node.sync_store.get_sync_mode()
|
|
170
|
+
|
|
171
|
+
await time_out_assert(180, fn3_is_not_syncing)
|
|
172
|
+
cons = list(server_1.all_connections.values())[:]
|
|
173
|
+
for con in cons:
|
|
174
|
+
await con.close()
|
|
175
|
+
for block in blocks_rest:
|
|
176
|
+
await full_node_3.full_node.add_block(block)
|
|
177
|
+
peak = full_node_3.full_node.blockchain.get_peak()
|
|
178
|
+
assert peak is not None
|
|
179
|
+
assert peak.height >= block.height
|
|
180
|
+
|
|
181
|
+
peak = full_node_3.full_node.blockchain.get_peak()
|
|
182
|
+
assert peak is not None
|
|
183
|
+
log.warning(f"FN3 height {peak.height}")
|
|
184
|
+
|
|
185
|
+
# TODO: fix this flaky test
|
|
186
|
+
await time_out_assert(180, node_height_exactly, True, full_node_3, 999)
|
|
187
|
+
|
|
188
|
+
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
189
|
+
await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
|
|
190
|
+
await server_3.start_client(PeerInfo(self_hostname, server_2.get_port()), full_node_3.full_node.on_connect)
|
|
191
|
+
await time_out_assert(180, node_height_exactly, True, full_node_1, 999)
|
|
192
|
+
await time_out_assert(180, node_height_exactly, True, full_node_2, 999)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@pytest.mark.anyio
|
|
196
|
+
async def test_batch_sync(
|
|
197
|
+
two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
|
|
198
|
+
) -> None:
|
|
199
|
+
# Must be below "sync_block_behind_threshold" in the config
|
|
200
|
+
num_blocks = 20
|
|
201
|
+
num_blocks_2 = 9
|
|
202
|
+
full_node_1, full_node_2, server_1, server_2, bt = two_nodes
|
|
203
|
+
blocks = bt.get_consecutive_blocks(num_blocks)
|
|
204
|
+
blocks_2 = bt.get_consecutive_blocks(num_blocks_2, seed=b"123")
|
|
205
|
+
|
|
206
|
+
# 12 blocks to node_1
|
|
207
|
+
for block in blocks:
|
|
208
|
+
await full_node_1.full_node.add_block(block)
|
|
209
|
+
|
|
210
|
+
# 9 different blocks to node_2
|
|
211
|
+
for block in blocks_2:
|
|
212
|
+
await full_node_2.full_node.add_block(block)
|
|
213
|
+
|
|
214
|
+
await server_2.start_client(
|
|
215
|
+
PeerInfo(self_hostname, server_1.get_port()),
|
|
216
|
+
on_connect=full_node_2.full_node.on_connect,
|
|
217
|
+
)
|
|
218
|
+
await time_out_assert(60, node_height_exactly, True, full_node_2, num_blocks - 1)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
@pytest.mark.anyio
|
|
222
|
+
async def test_backtrack_sync_1(
|
|
223
|
+
two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
|
|
224
|
+
) -> None:
|
|
225
|
+
full_node_1, full_node_2, server_1, server_2, bt = two_nodes
|
|
226
|
+
blocks = bt.get_consecutive_blocks(1, skip_slots=1)
|
|
227
|
+
blocks = bt.get_consecutive_blocks(1, blocks, skip_slots=0)
|
|
228
|
+
blocks = bt.get_consecutive_blocks(1, blocks, skip_slots=0)
|
|
229
|
+
|
|
230
|
+
# 3 blocks to node_1 in different sub slots
|
|
231
|
+
for block in blocks:
|
|
232
|
+
await full_node_1.full_node.add_block(block)
|
|
233
|
+
|
|
234
|
+
await server_2.start_client(
|
|
235
|
+
PeerInfo(self_hostname, server_1.get_port()),
|
|
236
|
+
on_connect=full_node_2.full_node.on_connect,
|
|
237
|
+
)
|
|
238
|
+
await time_out_assert(60, node_height_exactly, True, full_node_2, 2)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
@pytest.mark.anyio
|
|
242
|
+
async def test_backtrack_sync_2(
|
|
243
|
+
two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools], self_hostname: str
|
|
244
|
+
) -> None:
|
|
245
|
+
full_node_1, full_node_2, server_1, server_2, bt = two_nodes
|
|
246
|
+
blocks = bt.get_consecutive_blocks(1, skip_slots=3)
|
|
247
|
+
blocks = bt.get_consecutive_blocks(8, blocks, skip_slots=0)
|
|
248
|
+
|
|
249
|
+
# 3 blocks to node_1 in different sub slots
|
|
250
|
+
for block in blocks:
|
|
251
|
+
await full_node_1.full_node.add_block(block)
|
|
252
|
+
|
|
253
|
+
await server_2.start_client(
|
|
254
|
+
PeerInfo(self_hostname, server_1.get_port()),
|
|
255
|
+
on_connect=full_node_2.full_node.on_connect,
|
|
256
|
+
)
|
|
257
|
+
await time_out_assert(60, node_height_exactly, True, full_node_2, 8)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@pytest.mark.anyio
|
|
261
|
+
async def test_close_height_but_big_reorg(three_nodes: list[FullNodeAPI], bt: BlockTools, self_hostname: str) -> None:
|
|
262
|
+
blocks_a = bt.get_consecutive_blocks(50)
|
|
263
|
+
blocks_b = bt.get_consecutive_blocks(51, seed=b"B")
|
|
264
|
+
blocks_c = bt.get_consecutive_blocks(90, seed=b"C")
|
|
265
|
+
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
266
|
+
server_1 = full_node_1.full_node.server
|
|
267
|
+
server_2 = full_node_2.full_node.server
|
|
268
|
+
server_3 = full_node_3.full_node.server
|
|
269
|
+
|
|
270
|
+
for block in blocks_a:
|
|
271
|
+
await full_node_1.full_node.add_block(block)
|
|
272
|
+
for block in blocks_b:
|
|
273
|
+
await full_node_2.full_node.add_block(block)
|
|
274
|
+
for block in blocks_c:
|
|
275
|
+
await full_node_3.full_node.add_block(block)
|
|
276
|
+
|
|
277
|
+
await server_2.start_client(
|
|
278
|
+
PeerInfo(self_hostname, server_1.get_port()),
|
|
279
|
+
on_connect=full_node_2.full_node.on_connect,
|
|
280
|
+
)
|
|
281
|
+
await time_out_assert(80, node_height_exactly, True, full_node_1, 50)
|
|
282
|
+
await time_out_assert(80, node_height_exactly, True, full_node_2, 50)
|
|
283
|
+
await time_out_assert(80, node_height_exactly, True, full_node_3, 89)
|
|
284
|
+
|
|
285
|
+
await server_3.start_client(
|
|
286
|
+
PeerInfo(self_hostname, server_1.get_port()),
|
|
287
|
+
on_connect=full_node_3.full_node.on_connect,
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
await server_3.start_client(
|
|
291
|
+
PeerInfo(self_hostname, server_2.get_port()),
|
|
292
|
+
on_connect=full_node_3.full_node.on_connect,
|
|
293
|
+
)
|
|
294
|
+
await time_out_assert(80, node_height_exactly, True, full_node_1, 89)
|
|
295
|
+
await time_out_assert(80, node_height_exactly, True, full_node_2, 89)
|
|
296
|
+
await time_out_assert(80, node_height_exactly, True, full_node_3, 89)
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
@pytest.mark.anyio
|
|
300
|
+
async def test_sync_bad_peak_while_synced(
|
|
301
|
+
three_nodes: list[FullNodeAPI],
|
|
302
|
+
default_1000_blocks: list[FullBlock],
|
|
303
|
+
default_1500_blocks: list[FullBlock],
|
|
304
|
+
self_hostname: str,
|
|
305
|
+
) -> None:
|
|
306
|
+
# Must be larger than "sync_block_behind_threshold" in the config
|
|
307
|
+
num_blocks_initial = len(default_1000_blocks) - 250
|
|
308
|
+
blocks_750 = default_1000_blocks[:num_blocks_initial]
|
|
309
|
+
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
310
|
+
server_1 = full_node_1.full_node.server
|
|
311
|
+
server_2 = full_node_2.full_node.server
|
|
312
|
+
server_3 = full_node_3.full_node.server
|
|
313
|
+
full_node_3.full_node.weight_proof_handler = None
|
|
314
|
+
for block in blocks_750:
|
|
315
|
+
await full_node_1.full_node.add_block(block)
|
|
316
|
+
# Node 3 syncs from a different blockchain
|
|
317
|
+
|
|
318
|
+
for block in default_1500_blocks[:1100]:
|
|
319
|
+
await full_node_3.full_node.add_block(block)
|
|
320
|
+
|
|
321
|
+
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
322
|
+
|
|
323
|
+
# The second node should eventually catch up to the first one, and have the
|
|
324
|
+
# same tip at height num_blocks - 1
|
|
325
|
+
await time_out_assert(180, node_height_exactly, True, full_node_2, num_blocks_initial - 1)
|
|
326
|
+
# set new heavy peak, fn3 cannot serve wp's
|
|
327
|
+
# node 2 should keep being synced and receive blocks
|
|
328
|
+
await server_3.start_client(PeerInfo(self_hostname, server_3.get_port()), full_node_3.full_node.on_connect)
|
|
329
|
+
# trigger long sync in full node 2
|
|
330
|
+
peak_block = default_1500_blocks[1050]
|
|
331
|
+
await server_2.start_client(PeerInfo(self_hostname, server_3.get_port()), full_node_2.full_node.on_connect)
|
|
332
|
+
con = server_2.all_connections[full_node_3.full_node.server.node_id]
|
|
333
|
+
peak = full_node_protocol.NewPeak(
|
|
334
|
+
peak_block.header_hash,
|
|
335
|
+
peak_block.height,
|
|
336
|
+
peak_block.weight,
|
|
337
|
+
peak_block.height,
|
|
338
|
+
peak_block.reward_chain_block.get_unfinished().get_hash(),
|
|
339
|
+
)
|
|
340
|
+
await full_node_2.full_node.new_peak(peak, con)
|
|
341
|
+
await asyncio.sleep(2)
|
|
342
|
+
assert not full_node_2.full_node.sync_store.get_sync_mode()
|
|
343
|
+
for block in default_1000_blocks[1000 - num_blocks_initial :]:
|
|
344
|
+
await full_node_2.full_node.add_block(block)
|
|
345
|
+
|
|
346
|
+
assert node_height_exactly(full_node_2, uint32(999))
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
@pytest.mark.anyio
|
|
350
|
+
async def test_block_ses_mismatch(
|
|
351
|
+
two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
|
|
352
|
+
default_1000_blocks: list[FullBlock],
|
|
353
|
+
self_hostname: str,
|
|
354
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
355
|
+
) -> None:
|
|
356
|
+
full_node_1, full_node_2, server_1, server_2, _ = two_nodes
|
|
357
|
+
blocks = default_1000_blocks
|
|
358
|
+
|
|
359
|
+
# mock for full node _sync
|
|
360
|
+
async def async_mock() -> None:
|
|
361
|
+
log.info("do nothing")
|
|
362
|
+
|
|
363
|
+
with monkeypatch.context() as monkeypatch_context:
|
|
364
|
+
monkeypatch_context.setattr(full_node_2.full_node, "_sync", async_mock)
|
|
365
|
+
# load blocks into node 1
|
|
366
|
+
for block in blocks[:501]:
|
|
41
367
|
await full_node_1.full_node.add_block(block)
|
|
42
368
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
timeout_seconds = 250
|
|
48
|
-
|
|
49
|
-
# The second node should eventually catch up to the first one
|
|
50
|
-
await time_out_assert(
|
|
51
|
-
timeout_seconds, node_height_exactly, True, full_node_2, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5 - 1
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
for block in blocks[bt.constants.WEIGHT_PROOF_RECENT_BLOCKS - 5 : bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5]:
|
|
55
|
-
await full_node_1.full_node.add_block(block)
|
|
56
|
-
|
|
57
|
-
await server_3.start_client(
|
|
58
|
-
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_3.full_node.on_connect
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
# Node 3 and Node 2 sync up to node 1
|
|
62
|
-
await time_out_assert(
|
|
63
|
-
timeout_seconds, node_height_exactly, True, full_node_2, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 - 1
|
|
64
|
-
)
|
|
65
|
-
await time_out_assert(
|
|
66
|
-
timeout_seconds, node_height_exactly, True, full_node_3, bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 - 1
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
cons = list(server_1.all_connections.values())[:]
|
|
70
|
-
for con in cons:
|
|
71
|
-
await con.close()
|
|
72
|
-
for block in blocks[bt.constants.WEIGHT_PROOF_RECENT_BLOCKS + 5 :]:
|
|
73
|
-
await full_node_1.full_node.add_block(block)
|
|
74
|
-
|
|
75
|
-
await server_2.start_client(
|
|
76
|
-
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_2.full_node.on_connect
|
|
77
|
-
)
|
|
78
|
-
await server_3.start_client(
|
|
79
|
-
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_3.full_node.on_connect
|
|
80
|
-
)
|
|
81
|
-
await server_4.start_client(
|
|
82
|
-
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_4.full_node.on_connect
|
|
83
|
-
)
|
|
84
|
-
await server_3.start_client(
|
|
85
|
-
PeerInfo(self_hostname, server_2.get_port()), on_connect=full_node_3.full_node.on_connect
|
|
86
|
-
)
|
|
87
|
-
await server_4.start_client(
|
|
88
|
-
PeerInfo(self_hostname, server_3.get_port()), on_connect=full_node_4.full_node.on_connect
|
|
89
|
-
)
|
|
90
|
-
await server_4.start_client(
|
|
91
|
-
PeerInfo(self_hostname, server_2.get_port()), on_connect=full_node_4.full_node.on_connect
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
# All four nodes are synced
|
|
95
|
-
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_1, num_blocks - 1)
|
|
96
|
-
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_2, num_blocks - 1)
|
|
97
|
-
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_3, num_blocks - 1)
|
|
98
|
-
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_4, num_blocks - 1)
|
|
99
|
-
|
|
100
|
-
# Deep reorg, fall back from batch sync to long sync
|
|
101
|
-
blocks_node_5 = bt.get_consecutive_blocks(60, block_list_input=blocks[:350], seed=b"node5")
|
|
102
|
-
for block in blocks_node_5:
|
|
103
|
-
await full_node_5.full_node.add_block(block)
|
|
104
|
-
await server_5.start_client(
|
|
105
|
-
PeerInfo(self_hostname, server_1.get_port()), on_connect=full_node_5.full_node.on_connect
|
|
106
|
-
)
|
|
107
|
-
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_5, 409)
|
|
108
|
-
await time_out_assert(timeout_seconds, node_height_exactly, True, full_node_1, 409)
|
|
109
|
-
|
|
110
|
-
@pytest.mark.anyio
|
|
111
|
-
async def test_sync_from_fork_point_and_weight_proof(
|
|
112
|
-
self, three_nodes, default_1000_blocks, default_400_blocks, self_hostname
|
|
113
|
-
):
|
|
114
|
-
# Must be larger than "sync_block_behind_threshold" in the config
|
|
115
|
-
num_blocks_initial = len(default_1000_blocks) - 50
|
|
116
|
-
blocks_950 = default_1000_blocks[:num_blocks_initial]
|
|
117
|
-
blocks_rest = default_1000_blocks[num_blocks_initial:]
|
|
118
|
-
blocks_400 = default_400_blocks
|
|
119
|
-
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
120
|
-
server_1 = full_node_1.full_node.server
|
|
121
|
-
server_2 = full_node_2.full_node.server
|
|
122
|
-
server_3 = full_node_3.full_node.server
|
|
123
|
-
|
|
124
|
-
for block in blocks_950:
|
|
125
|
-
await full_node_1.full_node.add_block(block)
|
|
126
|
-
|
|
127
|
-
# Node 2 syncs from halfway
|
|
128
|
-
for i in range(int(len(default_1000_blocks) / 2)):
|
|
129
|
-
await full_node_2.full_node.add_block(default_1000_blocks[i])
|
|
130
|
-
|
|
131
|
-
# Node 3 syncs from a different blockchain
|
|
132
|
-
for block in blocks_400:
|
|
133
|
-
await full_node_3.full_node.add_block(block)
|
|
134
|
-
|
|
135
|
-
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
136
|
-
await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
|
|
137
|
-
|
|
138
|
-
# Also test request proof of weight
|
|
139
|
-
# Have the request header hash
|
|
140
|
-
res = await full_node_1.request_proof_of_weight(
|
|
141
|
-
full_node_protocol.RequestProofOfWeight(blocks_950[-1].height + 1, blocks_950[-1].header_hash)
|
|
142
|
-
)
|
|
143
|
-
assert res is not None
|
|
144
|
-
validated, _, _ = await full_node_1.full_node.weight_proof_handler.validate_weight_proof(
|
|
145
|
-
full_node_protocol.RespondProofOfWeight.from_bytes(res.data).wp
|
|
146
|
-
)
|
|
147
|
-
assert validated
|
|
148
|
-
|
|
149
|
-
# Don't have the request header hash
|
|
150
|
-
res = await full_node_1.request_proof_of_weight(
|
|
151
|
-
full_node_protocol.RequestProofOfWeight(blocks_950[-1].height + 1, std_hash(b"12"))
|
|
152
|
-
)
|
|
153
|
-
assert res is None
|
|
154
|
-
|
|
155
|
-
# The second node should eventually catch up to the first one, and have the
|
|
156
|
-
# same tip at height num_blocks - 1
|
|
157
|
-
await time_out_assert(300, node_height_exactly, True, full_node_2, num_blocks_initial - 1)
|
|
158
|
-
await time_out_assert(180, node_height_exactly, True, full_node_3, num_blocks_initial - 1)
|
|
159
|
-
|
|
160
|
-
def fn3_is_not_syncing():
|
|
161
|
-
return not full_node_3.full_node.sync_store.get_sync_mode()
|
|
162
|
-
|
|
163
|
-
await time_out_assert(180, fn3_is_not_syncing)
|
|
164
|
-
cons = list(server_1.all_connections.values())[:]
|
|
165
|
-
for con in cons:
|
|
166
|
-
await con.close()
|
|
167
|
-
for block in blocks_rest:
|
|
168
|
-
await full_node_3.full_node.add_block(block)
|
|
169
|
-
assert full_node_3.full_node.blockchain.get_peak().height >= block.height
|
|
170
|
-
|
|
171
|
-
log.warning(f"FN3 height {full_node_3.full_node.blockchain.get_peak().height}")
|
|
172
|
-
|
|
173
|
-
# TODO: fix this flaky test
|
|
174
|
-
await time_out_assert(180, node_height_exactly, True, full_node_3, 999)
|
|
175
|
-
|
|
176
|
-
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
177
|
-
await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
|
|
178
|
-
await server_3.start_client(PeerInfo(self_hostname, server_2.get_port()), full_node_3.full_node.on_connect)
|
|
179
|
-
await time_out_assert(180, node_height_exactly, True, full_node_1, 999)
|
|
180
|
-
await time_out_assert(180, node_height_exactly, True, full_node_2, 999)
|
|
181
|
-
|
|
182
|
-
@pytest.mark.anyio
|
|
183
|
-
async def test_batch_sync(self, two_nodes, self_hostname):
|
|
184
|
-
# Must be below "sync_block_behind_threshold" in the config
|
|
185
|
-
num_blocks = 20
|
|
186
|
-
num_blocks_2 = 9
|
|
187
|
-
full_node_1, full_node_2, server_1, server_2, bt = two_nodes
|
|
188
|
-
blocks = bt.get_consecutive_blocks(num_blocks)
|
|
189
|
-
blocks_2 = bt.get_consecutive_blocks(num_blocks_2, seed=b"123")
|
|
190
|
-
|
|
191
|
-
# 12 blocks to node_1
|
|
192
|
-
for block in blocks:
|
|
193
|
-
await full_node_1.full_node.add_block(block)
|
|
194
|
-
|
|
195
|
-
# 9 different blocks to node_2
|
|
196
|
-
for block in blocks_2:
|
|
197
|
-
await full_node_2.full_node.add_block(block)
|
|
198
|
-
|
|
199
|
-
await server_2.start_client(
|
|
200
|
-
PeerInfo(self_hostname, server_1.get_port()),
|
|
201
|
-
on_connect=full_node_2.full_node.on_connect,
|
|
202
|
-
)
|
|
203
|
-
await time_out_assert(60, node_height_exactly, True, full_node_2, num_blocks - 1)
|
|
204
|
-
|
|
205
|
-
@pytest.mark.anyio
|
|
206
|
-
async def test_backtrack_sync_1(self, two_nodes, self_hostname):
|
|
207
|
-
full_node_1, full_node_2, server_1, server_2, bt = two_nodes
|
|
208
|
-
blocks = bt.get_consecutive_blocks(1, skip_slots=1)
|
|
209
|
-
blocks = bt.get_consecutive_blocks(1, blocks, skip_slots=0)
|
|
210
|
-
blocks = bt.get_consecutive_blocks(1, blocks, skip_slots=0)
|
|
211
|
-
|
|
212
|
-
# 3 blocks to node_1 in different sub slots
|
|
213
|
-
for block in blocks:
|
|
214
|
-
await full_node_1.full_node.add_block(block)
|
|
369
|
+
peak1 = full_node_1.full_node.blockchain.get_peak()
|
|
370
|
+
assert peak1 is not None
|
|
215
371
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
on_connect=full_node_2.full_node.on_connect,
|
|
219
|
-
)
|
|
220
|
-
await time_out_assert(60, node_height_exactly, True, full_node_2, 2)
|
|
221
|
-
|
|
222
|
-
@pytest.mark.anyio
|
|
223
|
-
async def test_backtrack_sync_2(self, two_nodes, self_hostname):
|
|
224
|
-
full_node_1, full_node_2, server_1, server_2, bt = two_nodes
|
|
225
|
-
blocks = bt.get_consecutive_blocks(1, skip_slots=3)
|
|
226
|
-
blocks = bt.get_consecutive_blocks(8, blocks, skip_slots=0)
|
|
227
|
-
|
|
228
|
-
# 3 blocks to node_1 in different sub slots
|
|
229
|
-
for block in blocks:
|
|
230
|
-
await full_node_1.full_node.add_block(block)
|
|
231
|
-
|
|
232
|
-
await server_2.start_client(
|
|
233
|
-
PeerInfo(self_hostname, server_1.get_port()),
|
|
234
|
-
on_connect=full_node_2.full_node.on_connect,
|
|
235
|
-
)
|
|
236
|
-
await time_out_assert(60, node_height_exactly, True, full_node_2, 8)
|
|
237
|
-
|
|
238
|
-
@pytest.mark.anyio
|
|
239
|
-
async def test_close_height_but_big_reorg(self, three_nodes, bt, self_hostname):
|
|
240
|
-
blocks_a = bt.get_consecutive_blocks(50)
|
|
241
|
-
blocks_b = bt.get_consecutive_blocks(51, seed=b"B")
|
|
242
|
-
blocks_c = bt.get_consecutive_blocks(90, seed=b"C")
|
|
243
|
-
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
244
|
-
server_1 = full_node_1.full_node.server
|
|
245
|
-
server_2 = full_node_2.full_node.server
|
|
246
|
-
server_3 = full_node_3.full_node.server
|
|
247
|
-
|
|
248
|
-
for block in blocks_a:
|
|
249
|
-
await full_node_1.full_node.add_block(block)
|
|
250
|
-
for block in blocks_b:
|
|
251
|
-
await full_node_2.full_node.add_block(block)
|
|
252
|
-
for block in blocks_c:
|
|
253
|
-
await full_node_3.full_node.add_block(block)
|
|
254
|
-
|
|
255
|
-
await server_2.start_client(
|
|
256
|
-
PeerInfo(self_hostname, server_1.get_port()),
|
|
257
|
-
on_connect=full_node_2.full_node.on_connect,
|
|
258
|
-
)
|
|
259
|
-
await time_out_assert(80, node_height_exactly, True, full_node_1, 50)
|
|
260
|
-
await time_out_assert(80, node_height_exactly, True, full_node_2, 50)
|
|
261
|
-
await time_out_assert(80, node_height_exactly, True, full_node_3, 89)
|
|
372
|
+
summary_heights = full_node_1.full_node.blockchain.get_ses_heights()
|
|
373
|
+
summaries: list[SubEpochSummary] = []
|
|
262
374
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
)
|
|
375
|
+
# get ses list
|
|
376
|
+
for sub_epoch_n, ses_height in enumerate(summary_heights):
|
|
377
|
+
summaries.append(full_node_1.full_node.blockchain.get_ses(ses_height))
|
|
267
378
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
@pytest.mark.anyio
|
|
277
|
-
async def test_sync_bad_peak_while_synced(
|
|
278
|
-
self, three_nodes, default_1000_blocks, default_1500_blocks, self_hostname
|
|
279
|
-
):
|
|
280
|
-
# Must be larger than "sync_block_behind_threshold" in the config
|
|
281
|
-
num_blocks_initial = len(default_1000_blocks) - 250
|
|
282
|
-
blocks_750 = default_1000_blocks[:num_blocks_initial]
|
|
283
|
-
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
284
|
-
server_1 = full_node_1.full_node.server
|
|
285
|
-
server_2 = full_node_2.full_node.server
|
|
286
|
-
server_3 = full_node_3.full_node.server
|
|
287
|
-
full_node_3.full_node.weight_proof_handler = None
|
|
288
|
-
for block in blocks_750:
|
|
289
|
-
await full_node_1.full_node.add_block(block)
|
|
290
|
-
# Node 3 syncs from a different blockchain
|
|
291
|
-
|
|
292
|
-
for block in default_1500_blocks[:1100]:
|
|
293
|
-
await full_node_3.full_node.add_block(block)
|
|
294
|
-
|
|
295
|
-
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
296
|
-
|
|
297
|
-
# The second node should eventually catch up to the first one, and have the
|
|
298
|
-
# same tip at height num_blocks - 1
|
|
299
|
-
await time_out_assert(180, node_height_exactly, True, full_node_2, num_blocks_initial - 1)
|
|
300
|
-
# set new heavy peak, fn3 cannot serve wp's
|
|
301
|
-
# node 2 should keep being synced and receive blocks
|
|
302
|
-
await server_3.start_client(PeerInfo(self_hostname, server_3.get_port()), full_node_3.full_node.on_connect)
|
|
303
|
-
# trigger long sync in full node 2
|
|
304
|
-
peak_block = default_1500_blocks[1050]
|
|
305
|
-
await server_2.start_client(PeerInfo(self_hostname, server_3.get_port()), full_node_2.full_node.on_connect)
|
|
306
|
-
con = server_2.all_connections[full_node_3.full_node.server.node_id]
|
|
307
|
-
peak = full_node_protocol.NewPeak(
|
|
308
|
-
peak_block.header_hash,
|
|
309
|
-
peak_block.height,
|
|
310
|
-
peak_block.weight,
|
|
311
|
-
peak_block.height,
|
|
312
|
-
peak_block.reward_chain_block.get_unfinished().get_hash(),
|
|
379
|
+
# change summary so check would fail on sub epoch 1
|
|
380
|
+
s = summaries[1]
|
|
381
|
+
summaries[1] = SubEpochSummary(
|
|
382
|
+
s.prev_subepoch_summary_hash,
|
|
383
|
+
s.reward_chain_hash,
|
|
384
|
+
s.num_blocks_overflow,
|
|
385
|
+
uint64(s.new_difficulty * 2) if s.new_difficulty is not None else None,
|
|
386
|
+
uint64(s.new_sub_slot_iters * 2) if s.new_sub_slot_iters is not None else None,
|
|
313
387
|
)
|
|
314
|
-
|
|
315
|
-
await
|
|
316
|
-
assert not full_node_2.full_node.sync_store.get_sync_mode()
|
|
317
|
-
for block in default_1000_blocks[1000 - num_blocks_initial :]:
|
|
318
|
-
await full_node_2.full_node.add_block(block)
|
|
319
|
-
|
|
320
|
-
assert node_height_exactly(full_node_2, 999)
|
|
321
|
-
|
|
322
|
-
@pytest.mark.anyio
|
|
323
|
-
async def test_block_ses_mismatch(self, two_nodes, default_1000_blocks, self_hostname, monkeypatch):
|
|
324
|
-
full_node_1, full_node_2, server_1, server_2, _ = two_nodes
|
|
325
|
-
blocks = default_1000_blocks
|
|
326
|
-
|
|
327
|
-
# mock for full node _sync
|
|
328
|
-
async def async_mock():
|
|
329
|
-
log.info("do nothing")
|
|
330
|
-
|
|
331
|
-
with monkeypatch.context() as monkeypatch_context:
|
|
332
|
-
monkeypatch_context.setattr(full_node_2.full_node, "_sync", async_mock)
|
|
333
|
-
# load blocks into node 1
|
|
334
|
-
for block in blocks[:501]:
|
|
335
|
-
await full_node_1.full_node.add_block(block)
|
|
336
|
-
|
|
337
|
-
peak1 = full_node_1.full_node.blockchain.get_peak()
|
|
338
|
-
assert peak1 is not None
|
|
339
|
-
|
|
340
|
-
summary_heights = full_node_1.full_node.blockchain.get_ses_heights()
|
|
341
|
-
summaries: list[SubEpochSummary] = []
|
|
342
|
-
|
|
343
|
-
# get ses list
|
|
344
|
-
for sub_epoch_n, ses_height in enumerate(summary_heights):
|
|
345
|
-
summaries.append(full_node_1.full_node.blockchain.get_ses(ses_height))
|
|
346
|
-
|
|
347
|
-
# change summary so check would fail on sub epoch 1
|
|
348
|
-
s = summaries[1]
|
|
349
|
-
summaries[1] = SubEpochSummary(
|
|
350
|
-
s.prev_subepoch_summary_hash,
|
|
351
|
-
s.reward_chain_hash,
|
|
352
|
-
s.num_blocks_overflow,
|
|
353
|
-
s.new_difficulty * 2,
|
|
354
|
-
s.new_sub_slot_iters * 2,
|
|
355
|
-
)
|
|
356
|
-
# manually try sync with wrong sub epoch summary list
|
|
357
|
-
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), None)
|
|
358
|
-
|
|
359
|
-
# call peer has block to populate peer_to_peak
|
|
360
|
-
full_node_2.full_node.sync_store.peer_has_block(
|
|
361
|
-
peak1.header_hash, full_node_1.full_node.server.node_id, peak1.weight, peak1.height, True
|
|
362
|
-
)
|
|
363
|
-
# sync using bad ses list
|
|
364
|
-
await full_node_2.full_node.sync_from_fork_point(0, peak1.height, peak1.header_hash, summaries)
|
|
365
|
-
# assert we failed somewhere between sub epoch 0 to sub epoch 1
|
|
366
|
-
assert node_height_between(full_node_2, summary_heights[0], summary_heights[1])
|
|
367
|
-
|
|
368
|
-
@pytest.mark.anyio
|
|
369
|
-
@pytest.mark.skip("skipping until we re-enable the capability in chia.protocols.shared_protocol")
|
|
370
|
-
async def test_sync_none_wp_response_backward_comp(self, three_nodes, default_1000_blocks, self_hostname):
|
|
371
|
-
num_blocks_initial = len(default_1000_blocks) - 50
|
|
372
|
-
blocks_950 = default_1000_blocks[:num_blocks_initial]
|
|
373
|
-
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
374
|
-
server_1 = full_node_1.full_node.server
|
|
375
|
-
server_2 = full_node_2.full_node.server
|
|
376
|
-
server_3 = full_node_3.full_node.server
|
|
377
|
-
server_3.set_capabilities(
|
|
378
|
-
[
|
|
379
|
-
(uint16(Capability.BASE.value), "1"),
|
|
380
|
-
(uint16(Capability.BLOCK_HEADERS.value), "1"),
|
|
381
|
-
(uint16(Capability.RATE_LIMITS_V2.value), "1"),
|
|
382
|
-
]
|
|
383
|
-
)
|
|
384
|
-
|
|
385
|
-
for block in blocks_950:
|
|
386
|
-
await full_node_1.full_node.add_block(block)
|
|
387
|
-
|
|
388
|
-
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
389
|
-
await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
|
|
388
|
+
# manually try sync with wrong sub epoch summary list
|
|
389
|
+
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), None)
|
|
390
390
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
391
|
+
# call peer has block to populate peer_to_peak
|
|
392
|
+
full_node_2.full_node.sync_store.peer_has_block(
|
|
393
|
+
peak1.header_hash, full_node_1.full_node.server.node_id, peak1.weight, peak1.height, True
|
|
394
394
|
)
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
assert
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
395
|
+
# sync using bad ses list
|
|
396
|
+
await full_node_2.full_node.sync_from_fork_point(uint32(0), peak1.height, peak1.header_hash, summaries)
|
|
397
|
+
# assert we failed somewhere between sub epoch 0 to sub epoch 1
|
|
398
|
+
assert node_height_between(full_node_2, summary_heights[0], summary_heights[1])
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
@pytest.mark.anyio
|
|
402
|
+
@pytest.mark.skip("skipping until we re-enable the capability in chia.protocols.shared_protocol")
|
|
403
|
+
async def test_sync_none_wp_response_backward_comp(
|
|
404
|
+
three_nodes: list[FullNodeAPI], default_1000_blocks: list[FullBlock], self_hostname: str
|
|
405
|
+
) -> None:
|
|
406
|
+
num_blocks_initial = len(default_1000_blocks) - 50
|
|
407
|
+
blocks_950 = default_1000_blocks[:num_blocks_initial]
|
|
408
|
+
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
409
|
+
server_1 = full_node_1.full_node.server
|
|
410
|
+
server_2 = full_node_2.full_node.server
|
|
411
|
+
server_3 = full_node_3.full_node.server
|
|
412
|
+
server_3.set_capabilities(
|
|
413
|
+
[
|
|
414
|
+
(uint16(Capability.BASE.value), "1"),
|
|
415
|
+
(uint16(Capability.BLOCK_HEADERS.value), "1"),
|
|
416
|
+
(uint16(Capability.RATE_LIMITS_V2.value), "1"),
|
|
417
|
+
]
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
for block in blocks_950:
|
|
421
|
+
await full_node_1.full_node.add_block(block)
|
|
422
|
+
|
|
423
|
+
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
424
|
+
await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
|
|
425
|
+
|
|
426
|
+
peers = [c for c in full_node_2.full_node.server.all_connections.values()]
|
|
427
|
+
request = full_node_protocol.RequestProofOfWeight(
|
|
428
|
+
uint32(blocks_950[-1].height + 1), default_1000_blocks[-1].header_hash
|
|
429
|
+
)
|
|
430
|
+
start = time.time()
|
|
431
|
+
res = await peers[0].call_api(FullNodeAPI.request_proof_of_weight, request, timeout=5)
|
|
432
|
+
assert res is None
|
|
433
|
+
duration = time.time() - start
|
|
434
|
+
log.info(f"result was {res}")
|
|
435
|
+
assert duration < 1
|
|
436
|
+
|
|
437
|
+
peers = [c for c in full_node_3.full_node.server.all_connections.values()]
|
|
438
|
+
request = full_node_protocol.RequestProofOfWeight(
|
|
439
|
+
uint32(blocks_950[-1].height + 1), default_1000_blocks[-1].header_hash
|
|
440
|
+
)
|
|
441
|
+
start = time.time()
|
|
442
|
+
res = await peers[0].call_api(FullNodeAPI.request_proof_of_weight, request, timeout=6)
|
|
443
|
+
assert res is None
|
|
444
|
+
duration = time.time() - start
|
|
445
|
+
assert duration > 5
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
@pytest.mark.anyio
|
|
449
|
+
async def test_bad_peak_cache_invalidation(
|
|
450
|
+
two_nodes: tuple[FullNodeAPI, FullNodeAPI, ChiaServer, ChiaServer, BlockTools],
|
|
451
|
+
default_1000_blocks: list[FullBlock],
|
|
452
|
+
blockchain_constants: ConsensusConstants,
|
|
453
|
+
consensus_mode: ConsensusMode,
|
|
454
|
+
) -> None:
|
|
455
|
+
full_node_1, _full_node_2, _server_1, _server_2, bt = two_nodes
|
|
456
|
+
|
|
457
|
+
for block in default_1000_blocks[:-500]:
|
|
458
|
+
await full_node_1.full_node.add_block(block)
|
|
459
|
+
|
|
460
|
+
cache_size = full_node_1.full_node.config.get("bad_peak_cache_size")
|
|
461
|
+
assert cache_size is not None
|
|
462
|
+
for x in range(cache_size + 10):
|
|
463
|
+
blocks = bt.get_consecutive_blocks(
|
|
464
|
+
num_blocks=1, block_list_input=default_1000_blocks[:-500], seed=x.to_bytes(2, "big")
|
|
405
465
|
)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
assert res is None
|
|
409
|
-
duration = time.time() - start
|
|
410
|
-
assert duration > 5
|
|
411
|
-
|
|
412
|
-
@pytest.mark.anyio
|
|
413
|
-
async def test_bad_peak_cache_invalidation(
|
|
414
|
-
self, two_nodes, default_1000_blocks, blockchain_constants, consensus_mode
|
|
415
|
-
):
|
|
416
|
-
full_node_1, _full_node_2, _server_1, _server_2, bt = two_nodes
|
|
417
|
-
|
|
418
|
-
for block in default_1000_blocks[:-500]:
|
|
419
|
-
await full_node_1.full_node.add_block(block)
|
|
466
|
+
block = blocks[-1]
|
|
467
|
+
full_node_1.full_node.add_to_bad_peak_cache(block.header_hash, block.height)
|
|
420
468
|
|
|
421
|
-
|
|
422
|
-
for x in range(cache_size + 10):
|
|
423
|
-
blocks = bt.get_consecutive_blocks(
|
|
424
|
-
num_blocks=1, block_list_input=default_1000_blocks[:-500], seed=x.to_bytes(2, "big")
|
|
425
|
-
)
|
|
426
|
-
block = blocks[-1]
|
|
427
|
-
full_node_1.full_node.add_to_bad_peak_cache(block.header_hash, block.height)
|
|
469
|
+
assert len(full_node_1.full_node.bad_peak_cache) == cache_size
|
|
428
470
|
|
|
429
|
-
|
|
471
|
+
for block in default_1000_blocks[500:]:
|
|
472
|
+
await full_node_1.full_node.add_block(block)
|
|
430
473
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
block = blocks[-1]
|
|
436
|
-
full_node_1.full_node.add_to_bad_peak_cache(block.header_hash, block.height)
|
|
437
|
-
assert len(full_node_1.full_node.bad_peak_cache) == 1
|
|
474
|
+
blocks = bt.get_consecutive_blocks(num_blocks=1, block_list_input=default_1000_blocks[:-1])
|
|
475
|
+
block = blocks[-1]
|
|
476
|
+
full_node_1.full_node.add_to_bad_peak_cache(block.header_hash, block.height)
|
|
477
|
+
assert len(full_node_1.full_node.bad_peak_cache) == 1
|