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
|
@@ -5,7 +5,7 @@ import logging
|
|
|
5
5
|
import random
|
|
6
6
|
import sqlite3
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import
|
|
8
|
+
from typing import Optional, cast
|
|
9
9
|
|
|
10
10
|
import pytest
|
|
11
11
|
|
|
@@ -15,7 +15,8 @@ from clvm.casts import int_to_bytes
|
|
|
15
15
|
|
|
16
16
|
from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
|
|
17
17
|
from chia._tests.util.db_connection import DBConnection, PathDBConnection
|
|
18
|
-
from chia.consensus.
|
|
18
|
+
from chia.consensus.block_body_validation import ForkInfo
|
|
19
|
+
from chia.consensus.blockchain import AddBlockResult, Blockchain
|
|
19
20
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
20
21
|
from chia.consensus.full_block_to_block_record import header_block_to_sub_block_record
|
|
21
22
|
from chia.full_node.block_store import BlockStore
|
|
@@ -29,6 +30,7 @@ from chia.types.full_block import FullBlock
|
|
|
29
30
|
from chia.util.db_wrapper import get_host_parameter_limit
|
|
30
31
|
from chia.util.full_block_utils import GeneratorBlockInfo
|
|
31
32
|
from chia.util.ints import uint8, uint32, uint64
|
|
33
|
+
from chia.util.task_referencer import create_referenced_task
|
|
32
34
|
|
|
33
35
|
log = logging.getLogger(__name__)
|
|
34
36
|
|
|
@@ -58,9 +60,7 @@ async def test_block_store(tmp_dir: Path, db_version: int, bt: BlockTools, use_c
|
|
|
58
60
|
time_per_block=10,
|
|
59
61
|
)
|
|
60
62
|
wt: WalletTool = bt.get_pool_wallet_tool()
|
|
61
|
-
tx = wt.generate_signed_transaction(
|
|
62
|
-
uint64(10), wt.get_new_puzzlehash(), list(blocks[-1].get_included_reward_coins())[0]
|
|
63
|
-
)
|
|
63
|
+
tx = wt.generate_signed_transaction(uint64(10), wt.get_new_puzzlehash(), blocks[-1].get_included_reward_coins()[0])
|
|
64
64
|
blocks = bt.get_consecutive_blocks(
|
|
65
65
|
10,
|
|
66
66
|
block_list_input=blocks,
|
|
@@ -135,6 +135,90 @@ async def test_block_store(tmp_dir: Path, db_version: int, bt: BlockTools, use_c
|
|
|
135
135
|
assert br.header_hash == b.header_hash
|
|
136
136
|
|
|
137
137
|
|
|
138
|
+
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
139
|
+
@pytest.mark.anyio
|
|
140
|
+
async def test_get_full_blocks_at(
|
|
141
|
+
tmp_dir: Path, db_version: int, bt: BlockTools, use_cache: bool, default_400_blocks: list[FullBlock]
|
|
142
|
+
) -> None:
|
|
143
|
+
blocks = bt.get_consecutive_blocks(10)
|
|
144
|
+
alt_blocks = default_400_blocks[:10]
|
|
145
|
+
|
|
146
|
+
async with DBConnection(2) as db_wrapper:
|
|
147
|
+
# Use a different file for the blockchain
|
|
148
|
+
coin_store = await CoinStore.create(db_wrapper)
|
|
149
|
+
block_store = await BlockStore.create(db_wrapper, use_cache=use_cache)
|
|
150
|
+
bc = await Blockchain.create(coin_store, block_store, bt.constants, tmp_dir, 2)
|
|
151
|
+
|
|
152
|
+
count = 0
|
|
153
|
+
fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
|
|
154
|
+
for b1, b2 in zip(blocks, alt_blocks):
|
|
155
|
+
await _validate_and_add_block(bc, b1)
|
|
156
|
+
await _validate_and_add_block(bc, b2, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info)
|
|
157
|
+
ret = await block_store.get_full_blocks_at([uint32(count)])
|
|
158
|
+
assert set(ret) == set([b1, b2])
|
|
159
|
+
count += 1
|
|
160
|
+
ret = await block_store.get_full_blocks_at([uint32(c) for c in range(count)])
|
|
161
|
+
assert len(ret) == count * 2
|
|
162
|
+
assert set(ret) == set(blocks[:count] + alt_blocks[:count])
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
166
|
+
@pytest.mark.anyio
|
|
167
|
+
async def test_get_block_records_in_range(
|
|
168
|
+
bt: BlockTools, tmp_dir: Path, use_cache: bool, default_400_blocks: list[FullBlock]
|
|
169
|
+
) -> None:
|
|
170
|
+
blocks = bt.get_consecutive_blocks(10)
|
|
171
|
+
alt_blocks = default_400_blocks[:10]
|
|
172
|
+
|
|
173
|
+
async with DBConnection(2) as db_wrapper:
|
|
174
|
+
# Use a different file for the blockchain
|
|
175
|
+
coin_store = await CoinStore.create(db_wrapper)
|
|
176
|
+
block_store = await BlockStore.create(db_wrapper, use_cache=use_cache)
|
|
177
|
+
bc = await Blockchain.create(coin_store, block_store, bt.constants, tmp_dir, 2)
|
|
178
|
+
|
|
179
|
+
count = 0
|
|
180
|
+
fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
|
|
181
|
+
for b1, b2 in zip(blocks, alt_blocks):
|
|
182
|
+
await _validate_and_add_block(bc, b1)
|
|
183
|
+
await _validate_and_add_block(bc, b2, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info)
|
|
184
|
+
# the range is inclusive
|
|
185
|
+
ret = await block_store.get_block_records_in_range(count, count)
|
|
186
|
+
assert len(ret) == 1
|
|
187
|
+
assert b1.header_hash in ret
|
|
188
|
+
ret = await block_store.get_block_records_in_range(0, count)
|
|
189
|
+
count += 1
|
|
190
|
+
assert len(ret) == count
|
|
191
|
+
assert list(ret.keys()) == [b.header_hash for b in blocks[:count]]
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
195
|
+
@pytest.mark.anyio
|
|
196
|
+
async def test_get_block_bytes_in_range_in_main_chain(
|
|
197
|
+
bt: BlockTools, tmp_dir: Path, use_cache: bool, default_400_blocks: list[FullBlock]
|
|
198
|
+
) -> None:
|
|
199
|
+
blocks = bt.get_consecutive_blocks(10)
|
|
200
|
+
alt_blocks = default_400_blocks[:10]
|
|
201
|
+
|
|
202
|
+
async with DBConnection(2) as db_wrapper:
|
|
203
|
+
# Use a different file for the blockchain
|
|
204
|
+
coin_store = await CoinStore.create(db_wrapper)
|
|
205
|
+
block_store = await BlockStore.create(db_wrapper, use_cache=use_cache)
|
|
206
|
+
bc = await Blockchain.create(coin_store, block_store, bt.constants, tmp_dir, 2)
|
|
207
|
+
|
|
208
|
+
count = 0
|
|
209
|
+
fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
|
|
210
|
+
for b1, b2 in zip(blocks, alt_blocks):
|
|
211
|
+
await _validate_and_add_block(bc, b1)
|
|
212
|
+
await _validate_and_add_block(bc, b2, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info)
|
|
213
|
+
# the range is inclusive
|
|
214
|
+
ret = await block_store.get_block_bytes_in_range(count, count)
|
|
215
|
+
assert ret == [bytes(b1)]
|
|
216
|
+
ret = await block_store.get_block_bytes_in_range(0, count)
|
|
217
|
+
count += 1
|
|
218
|
+
assert len(ret) == count
|
|
219
|
+
assert set(ret) == set([bytes(b) for b in blocks[:count]])
|
|
220
|
+
|
|
221
|
+
|
|
138
222
|
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
139
223
|
@pytest.mark.anyio
|
|
140
224
|
async def test_deadlock(tmp_dir: Path, db_version: int, bt: BlockTools, use_cache: bool) -> None:
|
|
@@ -153,25 +237,26 @@ async def test_deadlock(tmp_dir: Path, db_version: int, bt: BlockTools, use_cach
|
|
|
153
237
|
for block in blocks:
|
|
154
238
|
await _validate_and_add_block(bc, block)
|
|
155
239
|
block_records.append(bc.block_record(block.header_hash))
|
|
156
|
-
tasks:
|
|
240
|
+
tasks: list[asyncio.Task[object]] = []
|
|
157
241
|
|
|
158
242
|
for i in range(10000):
|
|
159
243
|
rand_i = random.randint(0, 9)
|
|
160
244
|
if random.random() < 0.5:
|
|
161
245
|
tasks.append(
|
|
162
|
-
|
|
246
|
+
create_referenced_task(
|
|
163
247
|
store.add_full_block(blocks[rand_i].header_hash, blocks[rand_i], block_records[rand_i])
|
|
164
248
|
)
|
|
165
249
|
)
|
|
166
250
|
if random.random() < 0.5:
|
|
167
|
-
tasks.append(
|
|
251
|
+
tasks.append(create_referenced_task(store.get_full_block(blocks[rand_i].header_hash)))
|
|
168
252
|
await asyncio.gather(*tasks)
|
|
169
253
|
|
|
170
254
|
|
|
171
255
|
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
172
256
|
@pytest.mark.anyio
|
|
173
|
-
async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool) -> None:
|
|
257
|
+
async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool, default_400_blocks: list[FullBlock]) -> None:
|
|
174
258
|
blocks = bt.get_consecutive_blocks(10)
|
|
259
|
+
alt_blocks = default_400_blocks[:10]
|
|
175
260
|
|
|
176
261
|
async with DBConnection(2) as db_wrapper:
|
|
177
262
|
# Use a different file for the blockchain
|
|
@@ -181,8 +266,10 @@ async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool) -> None:
|
|
|
181
266
|
|
|
182
267
|
# insert all blocks
|
|
183
268
|
count = 0
|
|
184
|
-
|
|
185
|
-
|
|
269
|
+
fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
|
|
270
|
+
for b1, b2 in zip(blocks, alt_blocks):
|
|
271
|
+
await _validate_and_add_block(bc, b1)
|
|
272
|
+
await _validate_and_add_block(bc, b2, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info)
|
|
186
273
|
count += 1
|
|
187
274
|
ret = await block_store.get_random_not_compactified(count)
|
|
188
275
|
assert len(ret) == count
|
|
@@ -197,6 +284,13 @@ async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool) -> None:
|
|
|
197
284
|
rows = list(await cursor.fetchall())
|
|
198
285
|
assert len(rows) == 1
|
|
199
286
|
assert rows[0][0]
|
|
287
|
+
for block in alt_blocks:
|
|
288
|
+
async with conn.execute(
|
|
289
|
+
"SELECT in_main_chain FROM full_blocks WHERE header_hash=?", (block.header_hash,)
|
|
290
|
+
) as cursor:
|
|
291
|
+
rows = list(await cursor.fetchall())
|
|
292
|
+
assert len(rows) == 1
|
|
293
|
+
assert not rows[0][0]
|
|
200
294
|
|
|
201
295
|
await block_store.rollback(5)
|
|
202
296
|
|
|
@@ -212,6 +306,14 @@ async def test_rollback(bt: BlockTools, tmp_dir: Path, use_cache: bool) -> None:
|
|
|
212
306
|
assert len(rows) == 1
|
|
213
307
|
assert rows[0][0] == (count <= 5)
|
|
214
308
|
count += 1
|
|
309
|
+
for block in alt_blocks:
|
|
310
|
+
async with conn.execute(
|
|
311
|
+
"SELECT in_main_chain FROM full_blocks WHERE header_hash=? ORDER BY height",
|
|
312
|
+
(block.header_hash,),
|
|
313
|
+
) as cursor:
|
|
314
|
+
rows = list(await cursor.fetchall())
|
|
315
|
+
assert len(rows) == 1
|
|
316
|
+
assert not rows[0][0]
|
|
215
317
|
|
|
216
318
|
|
|
217
319
|
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
@@ -3,21 +3,22 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional
|
|
7
7
|
|
|
8
8
|
import pytest
|
|
9
9
|
from clvm.casts import int_to_bytes
|
|
10
10
|
|
|
11
11
|
from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
|
|
12
12
|
from chia._tests.util.db_connection import DBConnection
|
|
13
|
+
from chia._tests.util.get_name_puzzle_conditions import get_name_puzzle_conditions
|
|
13
14
|
from chia._tests.util.misc import Marks, datacases
|
|
15
|
+
from chia.consensus.block_body_validation import ForkInfo
|
|
14
16
|
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
15
17
|
from chia.consensus.blockchain import AddBlockResult, Blockchain
|
|
16
18
|
from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
|
|
17
19
|
from chia.full_node.block_store import BlockStore
|
|
18
20
|
from chia.full_node.coin_store import CoinStore
|
|
19
21
|
from chia.full_node.hint_store import HintStore
|
|
20
|
-
from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions
|
|
21
22
|
from chia.protocols.wallet_protocol import CoinState
|
|
22
23
|
from chia.simulator.block_tools import BlockTools, test_constants
|
|
23
24
|
from chia.simulator.wallet_tools import WalletTool
|
|
@@ -38,7 +39,7 @@ WALLET_A = WalletTool(constants)
|
|
|
38
39
|
log = logging.getLogger(__name__)
|
|
39
40
|
|
|
40
41
|
|
|
41
|
-
def get_future_reward_coins(block: FullBlock) ->
|
|
42
|
+
def get_future_reward_coins(block: FullBlock) -> tuple[Coin, Coin]:
|
|
42
43
|
pool_amount = calculate_pool_reward(block.height)
|
|
43
44
|
farmer_amount = calculate_base_farmer_reward(block.height)
|
|
44
45
|
if block.is_transaction_block():
|
|
@@ -70,7 +71,7 @@ async def test_basic_coin_store(db_version: int, softfork_height: uint32, bt: Bl
|
|
|
70
71
|
pool_reward_puzzle_hash=reward_ph,
|
|
71
72
|
)
|
|
72
73
|
|
|
73
|
-
coins_to_spend:
|
|
74
|
+
coins_to_spend: list[Coin] = []
|
|
74
75
|
for block in blocks:
|
|
75
76
|
if block.is_transaction_block():
|
|
76
77
|
for coin in block.get_included_reward_coins():
|
|
@@ -91,14 +92,15 @@ async def test_basic_coin_store(db_version: int, softfork_height: uint32, bt: Bl
|
|
|
91
92
|
)
|
|
92
93
|
|
|
93
94
|
# Adding blocks to the coin store
|
|
94
|
-
should_be_included_prev:
|
|
95
|
-
should_be_included:
|
|
95
|
+
should_be_included_prev: set[Coin] = set()
|
|
96
|
+
should_be_included: set[Coin] = set()
|
|
96
97
|
for block in blocks:
|
|
97
98
|
farmer_coin, pool_coin = get_future_reward_coins(block)
|
|
98
99
|
should_be_included.add(farmer_coin)
|
|
99
100
|
should_be_included.add(pool_coin)
|
|
100
101
|
if block.is_transaction_block():
|
|
101
102
|
if block.transactions_generator is not None:
|
|
103
|
+
assert block.transactions_info is not None
|
|
102
104
|
block_gen: BlockGenerator = BlockGenerator(block.transactions_generator, [])
|
|
103
105
|
npc_result = get_name_puzzle_conditions(
|
|
104
106
|
block_gen,
|
|
@@ -178,8 +180,8 @@ async def test_set_spent(db_version: int, bt: BlockTools) -> None:
|
|
|
178
180
|
# Save/get block
|
|
179
181
|
for block in blocks:
|
|
180
182
|
if block.is_transaction_block():
|
|
181
|
-
removals:
|
|
182
|
-
additions:
|
|
183
|
+
removals: list[bytes32] = []
|
|
184
|
+
additions: list[Coin] = []
|
|
183
185
|
async with db_wrapper.writer():
|
|
184
186
|
if block.is_transaction_block():
|
|
185
187
|
assert block.foliage_transaction_block is not None
|
|
@@ -229,8 +231,8 @@ async def test_num_unspent(bt: BlockTools, db_version: int) -> None:
|
|
|
229
231
|
|
|
230
232
|
if block.is_transaction_block():
|
|
231
233
|
assert block.foliage_transaction_block is not None
|
|
232
|
-
removals:
|
|
233
|
-
additions:
|
|
234
|
+
removals: list[bytes32] = []
|
|
235
|
+
additions: list[Coin] = []
|
|
234
236
|
await coin_store.new_block(
|
|
235
237
|
block.height,
|
|
236
238
|
block.foliage_transaction_block.timestamp,
|
|
@@ -255,13 +257,13 @@ async def test_rollback(db_version: int, bt: BlockTools) -> None:
|
|
|
255
257
|
coin_store = await CoinStore.create(db_wrapper)
|
|
256
258
|
|
|
257
259
|
selected_coin: Optional[CoinRecord] = None
|
|
258
|
-
all_coins:
|
|
260
|
+
all_coins: list[Coin] = []
|
|
259
261
|
|
|
260
262
|
for block in blocks:
|
|
261
263
|
all_coins += list(block.get_included_reward_coins())
|
|
262
264
|
if block.is_transaction_block():
|
|
263
|
-
removals:
|
|
264
|
-
additions:
|
|
265
|
+
removals: list[bytes32] = []
|
|
266
|
+
additions: list[Coin] = []
|
|
265
267
|
assert block.foliage_transaction_block is not None
|
|
266
268
|
await coin_store.new_block(
|
|
267
269
|
block.height,
|
|
@@ -343,7 +345,7 @@ async def test_basic_reorg(tmp_dir: Path, db_version: int, bt: BlockTools) -> No
|
|
|
343
345
|
store = await BlockStore.create(db_wrapper)
|
|
344
346
|
b: Blockchain = await Blockchain.create(coin_store, store, bt.constants, tmp_dir, 2)
|
|
345
347
|
try:
|
|
346
|
-
records:
|
|
348
|
+
records: list[Optional[CoinRecord]] = []
|
|
347
349
|
|
|
348
350
|
for block in blocks:
|
|
349
351
|
await _validate_and_add_block(b, block)
|
|
@@ -363,13 +365,20 @@ async def test_basic_reorg(tmp_dir: Path, db_version: int, bt: BlockTools) -> No
|
|
|
363
365
|
|
|
364
366
|
blocks_reorg_chain = bt.get_consecutive_blocks(reorg_length, blocks[: initial_block_count - 10], seed=b"2")
|
|
365
367
|
|
|
368
|
+
fork_info = ForkInfo(-1, -1, bt.constants.GENESIS_CHALLENGE)
|
|
366
369
|
for reorg_block in blocks_reorg_chain:
|
|
367
370
|
if reorg_block.height < initial_block_count - 10:
|
|
368
|
-
await _validate_and_add_block(
|
|
371
|
+
await _validate_and_add_block(
|
|
372
|
+
b, reorg_block, expected_result=AddBlockResult.ALREADY_HAVE_BLOCK, fork_info=fork_info
|
|
373
|
+
)
|
|
369
374
|
elif reorg_block.height < initial_block_count:
|
|
370
|
-
await _validate_and_add_block(
|
|
375
|
+
await _validate_and_add_block(
|
|
376
|
+
b, reorg_block, expected_result=AddBlockResult.ADDED_AS_ORPHAN, fork_info=fork_info
|
|
377
|
+
)
|
|
371
378
|
elif reorg_block.height >= initial_block_count:
|
|
372
|
-
await _validate_and_add_block(
|
|
379
|
+
await _validate_and_add_block(
|
|
380
|
+
b, reorg_block, expected_result=AddBlockResult.NEW_PEAK, fork_info=fork_info
|
|
381
|
+
)
|
|
373
382
|
if reorg_block.is_transaction_block():
|
|
374
383
|
coins = reorg_block.get_included_reward_coins()
|
|
375
384
|
records = [await coin_store.get_coin_record(coin.name()) for coin in coins]
|
|
@@ -501,16 +510,16 @@ async def test_get_coin_states(db_version: int) -> None:
|
|
|
501
510
|
|
|
502
511
|
@dataclass(frozen=True)
|
|
503
512
|
class RandomCoinRecords:
|
|
504
|
-
items:
|
|
505
|
-
puzzle_hashes:
|
|
506
|
-
hints:
|
|
513
|
+
items: list[CoinRecord]
|
|
514
|
+
puzzle_hashes: list[bytes32]
|
|
515
|
+
hints: list[tuple[bytes32, bytes]]
|
|
507
516
|
|
|
508
517
|
|
|
509
518
|
@pytest.fixture(scope="session")
|
|
510
519
|
def random_coin_records() -> RandomCoinRecords:
|
|
511
|
-
coin_records:
|
|
512
|
-
puzzle_hashes:
|
|
513
|
-
hints:
|
|
520
|
+
coin_records: list[CoinRecord] = []
|
|
521
|
+
puzzle_hashes: list[bytes32] = []
|
|
522
|
+
hints: list[tuple[bytes32, bytes]] = []
|
|
514
523
|
|
|
515
524
|
for i in range(50000):
|
|
516
525
|
is_spent = i % 2 == 0
|
|
@@ -586,7 +595,7 @@ async def test_coin_state_batches(
|
|
|
586
595
|
expected_crs.append(cr)
|
|
587
596
|
|
|
588
597
|
height: Optional[uint32] = uint32(0)
|
|
589
|
-
all_coin_states:
|
|
598
|
+
all_coin_states: list[CoinState] = []
|
|
590
599
|
remaining_phs = random_coin_records.puzzle_hashes.copy()
|
|
591
600
|
|
|
592
601
|
def height_of(coin_state: CoinState) -> int:
|
|
@@ -637,7 +646,7 @@ async def test_batch_many_coin_states(db_version: int, cut_off_middle: bool) ->
|
|
|
637
646
|
ph = bytes32(b"0" * 32)
|
|
638
647
|
|
|
639
648
|
# Generate coin records.
|
|
640
|
-
coin_records:
|
|
649
|
+
coin_records: list[CoinRecord] = []
|
|
641
650
|
count = 50000
|
|
642
651
|
|
|
643
652
|
for i in range(count):
|
|
@@ -760,7 +769,7 @@ class UnspentLineageInfoTestItem:
|
|
|
760
769
|
@dataclass
|
|
761
770
|
class UnspentLineageInfoCase:
|
|
762
771
|
id: str
|
|
763
|
-
items:
|
|
772
|
+
items: list[UnspentLineageInfoTestItem]
|
|
764
773
|
expected_success: bool
|
|
765
774
|
parent_with_diff_amount: bool = False
|
|
766
775
|
marks: Marks = ()
|
|
@@ -831,7 +840,7 @@ class UnspentLineageInfoCase:
|
|
|
831
840
|
),
|
|
832
841
|
)
|
|
833
842
|
async def test_get_unspent_lineage_info_for_puzzle_hash(case: UnspentLineageInfoCase) -> None:
|
|
834
|
-
CoinRecordRawData =
|
|
843
|
+
CoinRecordRawData = tuple[
|
|
835
844
|
bytes, # coin_name (blob)
|
|
836
845
|
int, # confirmed_index (bigint)
|
|
837
846
|
int, # spent_index (bigint)
|
|
@@ -842,7 +851,7 @@ async def test_get_unspent_lineage_info_for_puzzle_hash(case: UnspentLineageInfo
|
|
|
842
851
|
int, # timestamp (bigint)
|
|
843
852
|
]
|
|
844
853
|
|
|
845
|
-
def make_test_data(test_items:
|
|
854
|
+
def make_test_data(test_items: list[UnspentLineageInfoTestItem]) -> list[CoinRecordRawData]:
|
|
846
855
|
test_data = []
|
|
847
856
|
for item in test_items:
|
|
848
857
|
test_data.append(
|
|
@@ -2,13 +2,15 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import random
|
|
5
|
-
from
|
|
5
|
+
from collections.abc import AsyncIterator
|
|
6
|
+
from typing import Optional
|
|
6
7
|
|
|
7
8
|
import pytest
|
|
8
9
|
|
|
9
10
|
from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error
|
|
10
11
|
from chia._tests.util.blockchain import create_blockchain
|
|
11
12
|
from chia._tests.util.blockchain_mock import BlockchainMock
|
|
13
|
+
from chia.consensus.block_body_validation import ForkInfo
|
|
12
14
|
from chia.consensus.blockchain import AddBlockResult, Blockchain
|
|
13
15
|
from chia.consensus.constants import ConsensusConstants
|
|
14
16
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
@@ -48,7 +50,7 @@ async def empty_blockchain(db_version: int, blockchain_constants: ConsensusConst
|
|
|
48
50
|
DISCRIMINANT_SIZE_BITS=uint16(32),
|
|
49
51
|
SUB_SLOT_ITERS_STARTING=uint64(2**12),
|
|
50
52
|
)
|
|
51
|
-
async with create_blockchain(patched_constants, db_version) as (bc1,
|
|
53
|
+
async with create_blockchain(patched_constants, db_version) as (bc1, _):
|
|
52
54
|
yield bc1
|
|
53
55
|
|
|
54
56
|
|
|
@@ -56,7 +58,7 @@ async def empty_blockchain(db_version: int, blockchain_constants: ConsensusConst
|
|
|
56
58
|
async def empty_blockchain_with_original_constants(
|
|
57
59
|
db_version: int, blockchain_constants: ConsensusConstants
|
|
58
60
|
) -> AsyncIterator[Blockchain]:
|
|
59
|
-
async with create_blockchain(blockchain_constants, db_version) as (bc1,
|
|
61
|
+
async with create_blockchain(blockchain_constants, db_version) as (bc1, _):
|
|
60
62
|
yield bc1
|
|
61
63
|
|
|
62
64
|
|
|
@@ -82,7 +84,7 @@ async def test_unfinished_block_rank(
|
|
|
82
84
|
# create variants of the unfinished block, where all we do is to change
|
|
83
85
|
# the foliage_transaction_block_hash. As if they all had different foliage,
|
|
84
86
|
# but the same reward block hash (i.e. the same proof-of-space)
|
|
85
|
-
unfinished:
|
|
87
|
+
unfinished: list[UnfinishedBlock] = [
|
|
86
88
|
recursive_replace(unf, "foliage.foliage_transaction_block_hash", bytes32([idx + 4] * 32))
|
|
87
89
|
for idx in range(num_duplicates)
|
|
88
90
|
]
|
|
@@ -93,9 +95,7 @@ async def test_unfinished_block_rank(
|
|
|
93
95
|
# shuffle them to ensure the order we add them to the store isn't relevant
|
|
94
96
|
seeded_random.shuffle(unfinished)
|
|
95
97
|
for new_unf in unfinished:
|
|
96
|
-
store.add_unfinished_block(
|
|
97
|
-
uint32(2), new_unf, PreValidationResult(None, uint64(123532), None, False, uint32(0))
|
|
98
|
-
)
|
|
98
|
+
store.add_unfinished_block(uint32(2), new_unf, PreValidationResult(None, uint64(123532), None, uint32(0)))
|
|
99
99
|
|
|
100
100
|
# now ask for "the" unfinished block given the proof-of-space.
|
|
101
101
|
# the FullNodeStore should return the one with the lowest foliage tx block
|
|
@@ -130,12 +130,12 @@ async def test_unfinished_block_rank(
|
|
|
130
130
|
)
|
|
131
131
|
async def test_find_best_block(
|
|
132
132
|
seeded_random: random.Random,
|
|
133
|
-
blocks:
|
|
133
|
+
blocks: list[tuple[Optional[int], bool]],
|
|
134
134
|
expected: Optional[int],
|
|
135
|
-
default_400_blocks:
|
|
135
|
+
default_400_blocks: list[FullBlock],
|
|
136
136
|
bt: BlockTools,
|
|
137
137
|
) -> None:
|
|
138
|
-
result:
|
|
138
|
+
result: dict[Optional[bytes32], UnfinishedBlockEntry] = {}
|
|
139
139
|
i = 0
|
|
140
140
|
for b, with_unf in blocks:
|
|
141
141
|
unf: Optional[UnfinishedBlock]
|
|
@@ -149,7 +149,7 @@ async def test_find_best_block(
|
|
|
149
149
|
else:
|
|
150
150
|
result[bytes32(b.to_bytes(1, "big") * 32)] = UnfinishedBlockEntry(unf, None, uint32(123))
|
|
151
151
|
|
|
152
|
-
foliage_hash,
|
|
152
|
+
foliage_hash, _block = find_best_block(result)
|
|
153
153
|
if expected is None:
|
|
154
154
|
assert foliage_hash is None
|
|
155
155
|
else:
|
|
@@ -219,7 +219,7 @@ async def test_basic_store(
|
|
|
219
219
|
assert store.get_unfinished_block(unf_block.partial_hash) is None
|
|
220
220
|
assert store.get_unfinished_block2(unf_block.partial_hash, None) == (None, 0, False)
|
|
221
221
|
store.add_unfinished_block(
|
|
222
|
-
uint32(height), unf_block, PreValidationResult(None, uint64(123532), None,
|
|
222
|
+
uint32(height), unf_block, PreValidationResult(None, uint64(123532), None, uint32(0))
|
|
223
223
|
)
|
|
224
224
|
assert store.get_unfinished_block(unf_block.partial_hash) == unf_block
|
|
225
225
|
assert store.get_unfinished_block2(
|
|
@@ -275,9 +275,7 @@ async def test_basic_store(
|
|
|
275
275
|
assert unf3.foliage.foliage_transaction_block_hash is None
|
|
276
276
|
assert unf4.foliage.foliage_transaction_block_hash is None
|
|
277
277
|
for val, unf_block in enumerate([unf1, unf2, unf3, unf4]):
|
|
278
|
-
store.add_unfinished_block(
|
|
279
|
-
uint32(height), unf_block, PreValidationResult(None, uint64(val), None, False, uint32(0))
|
|
280
|
-
)
|
|
278
|
+
store.add_unfinished_block(uint32(height), unf_block, PreValidationResult(None, uint64(val), None, uint32(0)))
|
|
281
279
|
|
|
282
280
|
# when not specifying a foliage hash, you get the "best" one
|
|
283
281
|
# best is defined as the lowest foliage hash
|
|
@@ -454,8 +452,9 @@ async def test_basic_store(
|
|
|
454
452
|
normalized_to_identity_cc_sp=normalized_to_identity,
|
|
455
453
|
)
|
|
456
454
|
|
|
455
|
+
fork_info = ForkInfo(blocks[0].height - 1, blocks[0].height - 1, blocks[0].prev_header_hash)
|
|
457
456
|
for block in blocks:
|
|
458
|
-
await _validate_and_add_block_no_error(blockchain, block)
|
|
457
|
+
await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
|
|
459
458
|
sb = blockchain.block_record(block.header_hash)
|
|
460
459
|
next_sub_slot_iters, next_difficulty = get_next_sub_slot_iters_and_difficulty(
|
|
461
460
|
blockchain.constants, False, sb, blockchain
|
|
@@ -476,11 +475,13 @@ async def test_basic_store(
|
|
|
476
475
|
normalized_to_identity_cc_ip=normalized_to_identity,
|
|
477
476
|
normalized_to_identity_cc_sp=normalized_to_identity,
|
|
478
477
|
)
|
|
478
|
+
|
|
479
|
+
fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
|
|
479
480
|
for block in blocks_reorg:
|
|
480
481
|
peak = blockchain.get_peak()
|
|
481
482
|
assert peak is not None
|
|
482
483
|
|
|
483
|
-
await _validate_and_add_block_no_error(blockchain, block)
|
|
484
|
+
await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
|
|
484
485
|
|
|
485
486
|
peak_here = blockchain.get_peak()
|
|
486
487
|
assert peak_here is not None
|
|
@@ -558,7 +559,7 @@ async def test_basic_store(
|
|
|
558
559
|
normalized_to_identity_cc_ip=normalized_to_identity,
|
|
559
560
|
normalized_to_identity_cc_sp=normalized_to_identity,
|
|
560
561
|
)
|
|
561
|
-
await _validate_and_add_block(blockchain, blocks[-1])
|
|
562
|
+
await _validate_and_add_block(blockchain, blocks[-1], fork_info=fork_info)
|
|
562
563
|
peak_here = blockchain.get_peak()
|
|
563
564
|
assert peak_here is not None
|
|
564
565
|
if peak_here.header_hash == blocks[-1].header_hash:
|
|
@@ -834,6 +835,7 @@ async def test_basic_store(
|
|
|
834
835
|
|
|
835
836
|
# Test future EOS cache
|
|
836
837
|
store.initialize_genesis_sub_slot()
|
|
838
|
+
fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
|
|
837
839
|
blocks = custom_block_tools.get_consecutive_blocks(
|
|
838
840
|
1,
|
|
839
841
|
normalized_to_identity_cc_eos=normalized_to_identity,
|
|
@@ -841,7 +843,7 @@ async def test_basic_store(
|
|
|
841
843
|
normalized_to_identity_cc_ip=normalized_to_identity,
|
|
842
844
|
normalized_to_identity_cc_sp=normalized_to_identity,
|
|
843
845
|
)
|
|
844
|
-
await _validate_and_add_block_no_error(blockchain, blocks[-1])
|
|
846
|
+
await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
|
|
845
847
|
while True:
|
|
846
848
|
blocks = custom_block_tools.get_consecutive_blocks(
|
|
847
849
|
1,
|
|
@@ -851,7 +853,7 @@ async def test_basic_store(
|
|
|
851
853
|
normalized_to_identity_cc_ip=normalized_to_identity,
|
|
852
854
|
normalized_to_identity_cc_sp=normalized_to_identity,
|
|
853
855
|
)
|
|
854
|
-
await _validate_and_add_block_no_error(blockchain, blocks[-1])
|
|
856
|
+
await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
|
|
855
857
|
sb = blockchain.block_record(blocks[-1].header_hash)
|
|
856
858
|
if sb.first_in_sub_slot:
|
|
857
859
|
break
|
|
@@ -910,8 +912,9 @@ async def test_basic_store(
|
|
|
910
912
|
normalized_to_identity_icc_eos=normalized_to_identity,
|
|
911
913
|
)
|
|
912
914
|
|
|
915
|
+
fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
|
|
913
916
|
for block in blocks[:5]:
|
|
914
|
-
await _validate_and_add_block_no_error(blockchain, block)
|
|
917
|
+
await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
|
|
915
918
|
sb = blockchain.block_record(block.header_hash)
|
|
916
919
|
result = await blockchain.get_sp_and_ip_sub_slots(block.header_hash)
|
|
917
920
|
assert result is not None
|
|
@@ -940,7 +943,7 @@ async def test_basic_store(
|
|
|
940
943
|
)
|
|
941
944
|
store.add_to_future_ip(new_ip)
|
|
942
945
|
|
|
943
|
-
await _validate_and_add_block_no_error(blockchain, prev_block)
|
|
946
|
+
await _validate_and_add_block_no_error(blockchain, prev_block, fork_info=fork_info)
|
|
944
947
|
result = await blockchain.get_sp_and_ip_sub_slots(prev_block.header_hash)
|
|
945
948
|
assert result is not None
|
|
946
949
|
sp_sub_slot, ip_sub_slot = result
|
|
@@ -958,7 +961,7 @@ async def test_basic_store(
|
|
|
958
961
|
else:
|
|
959
962
|
case_1 = True
|
|
960
963
|
assert res.new_infusion_points == []
|
|
961
|
-
found_ips:
|
|
964
|
+
found_ips: list[timelord_protocol.NewInfusionPointVDF] = []
|
|
962
965
|
peak = blockchain.get_peak()
|
|
963
966
|
|
|
964
967
|
for ss in block.finished_sub_slots:
|
|
@@ -981,14 +984,15 @@ async def test_basic_store(
|
|
|
981
984
|
# i2 ......... i1
|
|
982
985
|
# Then do a reorg up to B2, removing all signage points after B2, but not before
|
|
983
986
|
log.warning(f"Adding blocks up to {blocks[-1]}")
|
|
987
|
+
fork_info = ForkInfo(-1, -1, blockchain.constants.GENESIS_CHALLENGE)
|
|
984
988
|
for block in blocks:
|
|
985
|
-
await _validate_and_add_block_no_error(blockchain, block)
|
|
989
|
+
await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
|
|
986
990
|
|
|
987
991
|
log.warning("Starting loop")
|
|
988
992
|
while True:
|
|
989
993
|
log.warning("Looping")
|
|
990
994
|
blocks = custom_block_tools.get_consecutive_blocks(1, block_list_input=blocks, skip_slots=1)
|
|
991
|
-
await _validate_and_add_block_no_error(blockchain, blocks[-1])
|
|
995
|
+
await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
|
|
992
996
|
peak = blockchain.get_peak()
|
|
993
997
|
assert peak is not None
|
|
994
998
|
result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
|
|
@@ -1015,7 +1019,7 @@ async def test_basic_store(
|
|
|
1015
1019
|
and i1 > (i2 + 3)
|
|
1016
1020
|
):
|
|
1017
1021
|
# We hit all the conditions that we want
|
|
1018
|
-
all_sps:
|
|
1022
|
+
all_sps: list[Optional[SignagePoint]] = [None] * custom_block_tools.constants.NUM_SPS_SUB_SLOT
|
|
1019
1023
|
|
|
1020
1024
|
def assert_sp_none(sp_index: int, is_none: bool) -> None:
|
|
1021
1025
|
sp_to_check: Optional[SignagePoint] = all_sps[sp_index]
|
|
@@ -1041,7 +1045,7 @@ async def test_basic_store(
|
|
|
1041
1045
|
assert store.new_signage_point(uint8(i), blockchain, peak, peak.sub_slot_iters, sp)
|
|
1042
1046
|
|
|
1043
1047
|
# Adding a new peak clears all SPs after that peak
|
|
1044
|
-
await _validate_and_add_block_no_error(blockchain, blocks[-2])
|
|
1048
|
+
await _validate_and_add_block_no_error(blockchain, blocks[-2], fork_info=fork_info)
|
|
1045
1049
|
peak = blockchain.get_peak()
|
|
1046
1050
|
assert peak is not None
|
|
1047
1051
|
result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
|
|
@@ -1089,7 +1093,7 @@ async def test_basic_store(
|
|
|
1089
1093
|
assert_sp_none(i1 + 1, False)
|
|
1090
1094
|
assert_sp_none(i1 + 4, False)
|
|
1091
1095
|
|
|
1092
|
-
await _validate_and_add_block_no_error(blockchain, blocks[-1])
|
|
1096
|
+
await _validate_and_add_block_no_error(blockchain, blocks[-1], fork_info=fork_info)
|
|
1093
1097
|
peak = blockchain.get_peak()
|
|
1094
1098
|
assert peak is not None
|
|
1095
1099
|
result = await blockchain.get_sp_and_ip_sub_slots(peak.header_hash)
|
|
@@ -1119,14 +1123,14 @@ async def test_basic_store(
|
|
|
1119
1123
|
break
|
|
1120
1124
|
else:
|
|
1121
1125
|
for block in blocks[-2:]:
|
|
1122
|
-
await _validate_and_add_block_no_error(blockchain, block)
|
|
1126
|
+
await _validate_and_add_block_no_error(blockchain, block, fork_info=fork_info)
|
|
1123
1127
|
|
|
1124
1128
|
|
|
1125
1129
|
@pytest.mark.limit_consensus_modes(reason="save time")
|
|
1126
1130
|
@pytest.mark.anyio
|
|
1127
1131
|
async def test_long_chain_slots(
|
|
1128
1132
|
empty_blockchain_with_original_constants: Blockchain,
|
|
1129
|
-
default_1000_blocks:
|
|
1133
|
+
default_1000_blocks: list[FullBlock],
|
|
1130
1134
|
) -> None:
|
|
1131
1135
|
blockchain = empty_blockchain_with_original_constants
|
|
1132
1136
|
store = FullNodeStore(blockchain.constants)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Tuple
|
|
5
4
|
|
|
6
5
|
import pytest
|
|
7
6
|
from clvm.casts import int_to_bytes
|
|
@@ -141,11 +140,11 @@ async def test_coin_ids_multi(db_version: int) -> None:
|
|
|
141
140
|
|
|
142
141
|
@pytest.mark.anyio
|
|
143
142
|
async def test_hints_in_blockchain(
|
|
144
|
-
wallet_nodes:
|
|
143
|
+
wallet_nodes: tuple[
|
|
145
144
|
FullNodeSimulator, FullNodeSimulator, ChiaServer, ChiaServer, WalletTool, WalletTool, BlockTools
|
|
146
145
|
],
|
|
147
146
|
) -> None:
|
|
148
|
-
full_node_1,
|
|
147
|
+
full_node_1, _full_node_2, _server_1, _server_2, _wallet_a, _wallet_receiver, bt = wallet_nodes
|
|
149
148
|
|
|
150
149
|
blocks = bt.get_consecutive_blocks(
|
|
151
150
|
5,
|
|
@@ -161,7 +160,7 @@ async def test_hints_in_blockchain(
|
|
|
161
160
|
puzzle_hash = bytes32(32 * b"\0")
|
|
162
161
|
amount = int_to_bytes(1)
|
|
163
162
|
hint = bytes32(32 * b"\5")
|
|
164
|
-
coin_spent =
|
|
163
|
+
coin_spent = blocks[-1].get_included_reward_coins()[0]
|
|
165
164
|
condition_dict = {
|
|
166
165
|
ConditionOpcode.CREATE_COIN: [ConditionWithArgs(ConditionOpcode.CREATE_COIN, [puzzle_hash, amount, hint])]
|
|
167
166
|
}
|