chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/blockchain/blockchain_test_utils.py +2 -3
- chia/_tests/blockchain/test_augmented_chain.py +2 -3
- chia/_tests/blockchain/test_blockchain.py +261 -44
- chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
- chia/_tests/blockchain/test_build_chains.py +197 -1
- chia/_tests/blockchain/test_get_block_generator.py +1 -1
- chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +3 -4
- chia/_tests/clvm/test_message_conditions.py +2 -2
- chia/_tests/clvm/test_puzzle_compression.py +2 -3
- chia/_tests/clvm/test_puzzles.py +1 -2
- chia/_tests/clvm/test_singletons.py +2 -3
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +30 -25
- chia/_tests/cmds/test_dev_gh.py +1 -1
- chia/_tests/cmds/test_farm_cmd.py +1 -1
- chia/_tests/cmds/test_show.py +1 -2
- chia/_tests/cmds/wallet/test_did.py +101 -56
- chia/_tests/cmds/wallet/test_nft.py +109 -84
- chia/_tests/cmds/wallet/test_notifications.py +1 -1
- chia/_tests/cmds/wallet/test_offer.toffer +1 -1
- chia/_tests/cmds/wallet/test_vcs.py +8 -8
- chia/_tests/cmds/wallet/test_wallet.py +100 -46
- chia/_tests/conftest.py +31 -20
- chia/_tests/connection_utils.py +1 -1
- chia/_tests/core/consensus/stores/__init__.py +0 -0
- chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
- chia/_tests/core/consensus/test_block_creation.py +2 -31
- chia/_tests/core/consensus/test_pot_iterations.py +38 -3
- chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
- chia/_tests/core/daemon/test_daemon.py +80 -0
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +14 -10
- chia/_tests/core/data_layer/test_data_store.py +5 -5
- chia/_tests/core/farmer/test_farmer_api.py +2 -2
- chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
- chia/_tests/core/full_node/ram_db.py +3 -1
- chia/_tests/core/full_node/stores/test_block_store.py +28 -16
- chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
- chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_address_manager.py +200 -27
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +7 -6
- chia/_tests/core/full_node/test_full_node.py +456 -40
- chia/_tests/core/full_node/test_generator_tools.py +32 -2
- chia/_tests/core/full_node/test_hint_management.py +1 -1
- chia/_tests/core/full_node/test_node_load.py +20 -21
- chia/_tests/core/full_node/test_performance.py +3 -4
- chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
- chia/_tests/core/full_node/test_subscriptions.py +1 -2
- chia/_tests/core/full_node/test_transactions.py +9 -5
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
- chia/_tests/core/large_block.py +1 -2
- chia/_tests/core/make_block_generator.py +3 -4
- chia/_tests/core/mempool/test_mempool.py +36 -86
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
- chia/_tests/core/mempool/test_mempool_manager.py +421 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
- chia/_tests/core/server/flood.py +1 -1
- chia/_tests/core/server/test_dos.py +1 -1
- chia/_tests/core/server/test_node_discovery.py +41 -27
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +1 -1
- chia/_tests/core/services/test_services.py +5 -5
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_cost_calculation.py +6 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_crawler_rpc.py +1 -1
- chia/_tests/core/test_db_conversion.py +3 -1
- chia/_tests/core/test_db_validation.py +5 -3
- chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
- chia/_tests/core/test_filter.py +4 -1
- chia/_tests/core/test_full_node_rpc.py +99 -82
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/util/test_block_cache.py +1 -1
- chia/_tests/core/util/test_keychain.py +2 -2
- chia/_tests/core/util/test_lockfile.py +1 -1
- chia/_tests/core/util/test_log_exceptions.py +5 -5
- chia/_tests/core/util/test_streamable.py +81 -22
- chia/_tests/db/test_db_wrapper.py +1 -3
- chia/_tests/environments/wallet.py +5 -5
- chia/_tests/farmer_harvester/test_farmer.py +9 -7
- chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/generator/test_compression.py +1 -2
- chia/_tests/generator/test_rom.py +8 -4
- chia/_tests/plot_sync/test_plot_sync.py +3 -3
- chia/_tests/plot_sync/test_receiver.py +3 -3
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +3 -3
- chia/_tests/plot_sync/util.py +2 -2
- chia/_tests/pools/test_pool_cmdline.py +48 -21
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
- chia/_tests/pools/test_pool_rpc.py +237 -105
- chia/_tests/pools/test_pool_wallet.py +11 -2
- chia/_tests/pools/test_wallet_pool_store.py +5 -4
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/simulation/test_simulation.py +13 -8
- chia/_tests/simulation/test_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +191 -47
- chia/_tests/timelord/test_timelord.py +1 -1
- chia/_tests/tools/test_full_sync.py +0 -2
- chia/_tests/tools/test_run_block.py +3 -1
- chia/_tests/util/benchmark_cost.py +3 -3
- chia/_tests/util/benchmarks.py +2 -2
- chia/_tests/util/blockchain.py +11 -5
- chia/_tests/util/blockchain_mock.py +1 -4
- chia/_tests/util/coin_store.py +29 -0
- chia/_tests/util/constants.py +2 -18
- chia/_tests/util/full_sync.py +3 -3
- chia/_tests/util/generator_tools_testing.py +2 -3
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +33 -31
- chia/_tests/util/network_protocol_data.py +19 -17
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +3 -1
- chia/_tests/util/run_block.py +2 -2
- chia/_tests/util/setup_nodes.py +7 -7
- chia/_tests/util/spend_sim.py +47 -55
- chia/_tests/util/test_condition_tools.py +5 -4
- chia/_tests/util/test_config.py +2 -2
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +12 -14
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_paginator.py +4 -4
- chia/_tests/util/test_priority_mutex.py +2 -2
- chia/_tests/util/test_replace_str_to_bytes.py +15 -5
- chia/_tests/util/test_ssl_check.py +1 -1
- chia/_tests/util/test_testnet_overrides.py +13 -3
- chia/_tests/util/time_out_assert.py +4 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
- chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
- chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
- chia/_tests/wallet/conftest.py +11 -12
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
- chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
- chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
- chia/_tests/wallet/nft_wallet/config.py +1 -1
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
- chia/_tests/wallet/rpc/test_wallet_rpc.py +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 +143 -124
- chia/{types → full_node}/eligible_coin_spends.py +39 -70
- chia/full_node/fee_estimator.py +1 -1
- chia/full_node/fee_estimator_interface.py +0 -8
- chia/full_node/fee_tracker.py +25 -25
- chia/full_node/full_node.py +70 -53
- chia/full_node/full_node_api.py +57 -40
- chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
- chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
- chia/full_node/full_node_store.py +23 -8
- chia/full_node/mempool.py +206 -53
- chia/full_node/mempool_check_conditions.py +20 -63
- chia/full_node/mempool_manager.py +26 -40
- chia/full_node/subscriptions.py +1 -3
- chia/full_node/tx_processing_queue.py +50 -3
- chia/full_node/weight_proof.py +46 -37
- chia/harvester/harvester.py +1 -1
- chia/harvester/harvester_api.py +22 -7
- chia/introducer/introducer.py +1 -1
- chia/introducer/introducer_api.py +1 -1
- chia/plot_sync/exceptions.py +1 -1
- chia/plot_sync/receiver.py +1 -1
- chia/plot_sync/sender.py +2 -2
- chia/pools/pool_puzzles.py +13 -18
- chia/pools/pool_wallet.py +23 -46
- chia/protocols/farmer_protocol.py +11 -3
- chia/protocols/full_node_protocol.py +1 -4
- chia/protocols/harvester_protocol.py +3 -3
- chia/protocols/pool_protocol.py +1 -2
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +1 -3
- chia/protocols/wallet_protocol.py +3 -3
- chia/rpc/rpc_client.py +7 -8
- chia/rpc/rpc_server.py +3 -3
- chia/rpc/util.py +3 -1
- chia/seeder/crawler.py +1 -1
- chia/seeder/crawler_api.py +1 -1
- chia/seeder/dns_server.py +2 -0
- chia/seeder/start_crawler.py +3 -3
- chia/server/address_manager.py +286 -38
- chia/server/address_manager_store.py +0 -215
- chia/{types → server}/aliases.py +7 -7
- chia/server/api_protocol.py +1 -1
- chia/server/chia_policy.py +1 -1
- chia/server/node_discovery.py +76 -113
- chia/server/rate_limits.py +1 -1
- chia/server/resolve_peer_info.py +43 -0
- chia/server/server.py +5 -5
- chia/server/start_data_layer.py +4 -4
- chia/server/start_farmer.py +5 -4
- chia/server/start_full_node.py +5 -4
- chia/server/start_harvester.py +7 -5
- chia/server/start_introducer.py +2 -2
- chia/server/start_service.py +1 -1
- chia/server/start_timelord.py +7 -5
- chia/server/start_wallet.py +7 -5
- chia/server/ws_connection.py +1 -1
- chia/simulator/add_blocks_in_batches.py +2 -2
- chia/simulator/block_tools.py +245 -201
- chia/simulator/full_node_simulator.py +38 -10
- chia/simulator/setup_services.py +12 -12
- chia/simulator/simulator_full_node_rpc_api.py +2 -2
- chia/simulator/simulator_full_node_rpc_client.py +2 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +1 -1
- chia/simulator/wallet_tools.py +10 -18
- chia/ssl/create_ssl.py +1 -1
- chia/timelord/iters_from_block.py +14 -14
- chia/timelord/timelord.py +15 -11
- chia/timelord/timelord_api.py +14 -2
- chia/timelord/timelord_state.py +20 -14
- chia/types/blockchain_format/program.py +53 -10
- chia/types/blockchain_format/proof_of_space.py +73 -19
- chia/types/coin_spend.py +3 -56
- chia/types/generator_types.py +28 -0
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +12 -7
- chia/types/unfinished_header_block.py +1 -2
- chia/types/validation_state.py +1 -2
- chia/types/weight_proof.py +1 -3
- chia/util/action_scope.py +3 -3
- chia/util/block_cache.py +1 -2
- chia/util/byte_types.py +1 -1
- chia/util/casts.py +21 -0
- chia/util/config.py +0 -37
- chia/util/db_wrapper.py +8 -1
- chia/util/errors.py +3 -2
- chia/util/initial-config.yaml +21 -5
- chia/util/keychain.py +6 -7
- chia/util/keyring_wrapper.py +5 -5
- chia/util/limited_semaphore.py +1 -1
- chia/util/priority_mutex.py +1 -1
- chia/util/streamable.py +63 -5
- chia/util/task_timing.py +1 -1
- chia/util/virtual_project_analysis.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +7 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
- chia/wallet/cat_wallet/cat_utils.py +1 -1
- chia/wallet/cat_wallet/cat_wallet.py +44 -36
- chia/wallet/cat_wallet/lineage_store.py +7 -0
- chia/wallet/cat_wallet/r_cat_wallet.py +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.5rc2.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.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.5rc2.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/entry_points.txt +0 -0
|
@@ -2,16 +2,15 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
|
-
from chia_rs import SpendBundleConditions
|
|
5
|
+
from chia_rs import FullBlock, SpendBundleConditions
|
|
6
6
|
from chia_rs.sized_ints import uint32, uint64
|
|
7
7
|
|
|
8
|
+
from chia.consensus.augmented_chain import AugmentedBlockchain
|
|
8
9
|
from chia.consensus.block_body_validation import ForkInfo
|
|
9
10
|
from chia.consensus.blockchain import AddBlockResult, Blockchain
|
|
10
11
|
from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
|
|
11
12
|
from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
|
|
12
|
-
from chia.types.full_block import FullBlock
|
|
13
13
|
from chia.types.validation_state import ValidationState
|
|
14
|
-
from chia.util.augmented_chain import AugmentedBlockchain
|
|
15
14
|
from chia.util.errors import Err
|
|
16
15
|
|
|
17
16
|
|
|
@@ -4,15 +4,14 @@ from dataclasses import dataclass, field
|
|
|
4
4
|
from typing import TYPE_CHECKING, ClassVar, Optional, cast
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
7
|
+
from chia_rs import BlockRecord, FullBlock
|
|
7
8
|
from chia_rs.sized_bytes import bytes32
|
|
8
9
|
from chia_rs.sized_ints import uint32
|
|
9
10
|
|
|
10
11
|
from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
|
|
11
12
|
from chia._tests.util.blockchain import create_blockchain
|
|
12
|
-
from chia.consensus.
|
|
13
|
+
from chia.consensus.augmented_chain import AugmentedBlockchain
|
|
13
14
|
from chia.simulator.block_tools import BlockTools
|
|
14
|
-
from chia.types.full_block import FullBlock
|
|
15
|
-
from chia.util.augmented_chain import AugmentedBlockchain
|
|
16
15
|
from chia.util.errors import Err
|
|
17
16
|
|
|
18
17
|
|
|
@@ -1,19 +1,34 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import copy
|
|
4
5
|
import logging
|
|
5
6
|
import random
|
|
6
7
|
import time
|
|
7
8
|
from collections.abc import AsyncIterator, Awaitable
|
|
8
9
|
from contextlib import asynccontextmanager
|
|
9
|
-
from dataclasses import replace
|
|
10
|
+
from dataclasses import dataclass, replace
|
|
10
11
|
from typing import Optional
|
|
11
12
|
|
|
12
13
|
import pytest
|
|
13
|
-
from chia_rs import
|
|
14
|
+
from chia_rs import (
|
|
15
|
+
AugSchemeMPL,
|
|
16
|
+
BlockRecord,
|
|
17
|
+
ConsensusConstants,
|
|
18
|
+
EndOfSubSlotBundle,
|
|
19
|
+
FullBlock,
|
|
20
|
+
G2Element,
|
|
21
|
+
InfusedChallengeChainSubSlot,
|
|
22
|
+
MerkleSet,
|
|
23
|
+
SpendBundle,
|
|
24
|
+
SpendBundleConditions,
|
|
25
|
+
SpendConditions,
|
|
26
|
+
TransactionsInfo,
|
|
27
|
+
UnfinishedBlock,
|
|
28
|
+
is_canonical_serialization,
|
|
29
|
+
)
|
|
14
30
|
from chia_rs.sized_bytes import bytes32
|
|
15
31
|
from chia_rs.sized_ints import uint8, uint32, uint64
|
|
16
|
-
from clvm.casts import int_to_bytes
|
|
17
32
|
|
|
18
33
|
from chia._tests.blockchain.blockchain_test_utils import (
|
|
19
34
|
_validate_and_add_block,
|
|
@@ -25,40 +40,35 @@ from chia._tests.blockchain.blockchain_test_utils import (
|
|
|
25
40
|
from chia._tests.conftest import ConsensusMode
|
|
26
41
|
from chia._tests.util.blockchain import create_blockchain
|
|
27
42
|
from chia._tests.util.get_name_puzzle_conditions import get_name_puzzle_conditions
|
|
28
|
-
from chia.consensus.
|
|
43
|
+
from chia.consensus.augmented_chain import AugmentedBlockchain
|
|
44
|
+
from chia.consensus.block_body_validation import ForkAdd, ForkInfo
|
|
29
45
|
from chia.consensus.block_header_validation import validate_finished_header_block
|
|
30
|
-
from chia.consensus.block_record import BlockRecord
|
|
31
46
|
from chia.consensus.block_rewards import calculate_base_farmer_reward
|
|
32
47
|
from chia.consensus.blockchain import AddBlockResult, Blockchain
|
|
33
48
|
from chia.consensus.coinbase import create_farmer_coin
|
|
34
49
|
from chia.consensus.find_fork_point import lookup_fork_chain
|
|
35
50
|
from chia.consensus.full_block_to_block_record import block_to_block_record
|
|
51
|
+
from chia.consensus.generator_tools import get_block_header
|
|
36
52
|
from chia.consensus.get_block_generator import get_block_generator
|
|
37
53
|
from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
|
|
38
54
|
from chia.consensus.pot_iterations import is_overflow_block
|
|
39
55
|
from chia.simulator.block_tools import BlockTools, create_block_tools_async
|
|
40
56
|
from chia.simulator.keyring import TempKeyring
|
|
57
|
+
from chia.simulator.vdf_prover import get_vdf_info_and_proof
|
|
41
58
|
from chia.simulator.wallet_tools import WalletTool
|
|
42
59
|
from chia.types.blockchain_format.classgroup import ClassgroupElement
|
|
43
60
|
from chia.types.blockchain_format.coin import Coin
|
|
44
61
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
45
|
-
from chia.types.blockchain_format.slots import InfusedChallengeChainSubSlot
|
|
46
62
|
from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
|
|
47
63
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
48
64
|
from chia.types.condition_with_args import ConditionWithArgs
|
|
49
|
-
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
50
|
-
from chia.types.full_block import FullBlock
|
|
51
65
|
from chia.types.generator_types import BlockGenerator
|
|
52
|
-
from chia.types.spend_bundle import SpendBundle
|
|
53
|
-
from chia.types.unfinished_block import UnfinishedBlock
|
|
54
66
|
from chia.types.validation_state import ValidationState
|
|
55
|
-
from chia.util.
|
|
67
|
+
from chia.util.casts import int_to_bytes
|
|
56
68
|
from chia.util.errors import Err
|
|
57
|
-
from chia.util.generator_tools import get_block_header
|
|
58
69
|
from chia.util.hash import std_hash
|
|
59
70
|
from chia.util.keychain import Keychain
|
|
60
71
|
from chia.util.recursive_replace import recursive_replace
|
|
61
|
-
from chia.util.vdf_prover import get_vdf_info_and_proof
|
|
62
72
|
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import (
|
|
63
73
|
DEFAULT_HIDDEN_PUZZLE_HASH,
|
|
64
74
|
calculate_synthetic_secret_key,
|
|
@@ -166,7 +176,7 @@ class TestBlockHeaderValidation:
|
|
|
166
176
|
uint64(10_000_000),
|
|
167
177
|
)
|
|
168
178
|
block_bad = recursive_replace(
|
|
169
|
-
block, "finished_sub_slots", [new_finished_ss
|
|
179
|
+
block, "finished_sub_slots", [new_finished_ss, *block.finished_sub_slots[1:]]
|
|
170
180
|
)
|
|
171
181
|
header_block_bad = get_block_header(block_bad)
|
|
172
182
|
# TODO: Inspect these block values as they are currently None
|
|
@@ -190,7 +200,7 @@ class TestBlockHeaderValidation:
|
|
|
190
200
|
uint64(10_000_000),
|
|
191
201
|
)
|
|
192
202
|
block_bad_2 = recursive_replace(
|
|
193
|
-
block, "finished_sub_slots", [new_finished_ss_2
|
|
203
|
+
block, "finished_sub_slots", [new_finished_ss_2, *block.finished_sub_slots[1:]]
|
|
194
204
|
)
|
|
195
205
|
|
|
196
206
|
header_block_bad_2 = get_block_header(block_bad_2)
|
|
@@ -504,7 +514,7 @@ class TestBlockHeaderValidation:
|
|
|
504
514
|
bytes([2] * 32),
|
|
505
515
|
)
|
|
506
516
|
block_0_bad = recursive_replace(
|
|
507
|
-
blocks[0], "finished_sub_slots", [new_finished_ss
|
|
517
|
+
blocks[0], "finished_sub_slots", [new_finished_ss, *blocks[0].finished_sub_slots[1:]]
|
|
508
518
|
)
|
|
509
519
|
|
|
510
520
|
header_block_bad = get_block_header(block_0_bad)
|
|
@@ -532,7 +542,7 @@ class TestBlockHeaderValidation:
|
|
|
532
542
|
bytes([2] * 32),
|
|
533
543
|
)
|
|
534
544
|
block_1_bad = recursive_replace(
|
|
535
|
-
blocks[1], "finished_sub_slots", [new_finished_ss
|
|
545
|
+
blocks[1], "finished_sub_slots", [new_finished_ss, *blocks[1].finished_sub_slots[1:]]
|
|
536
546
|
)
|
|
537
547
|
|
|
538
548
|
await _validate_and_add_block(empty_blockchain, blocks[0])
|
|
@@ -559,7 +569,7 @@ class TestBlockHeaderValidation:
|
|
|
559
569
|
bytes([2] * 32),
|
|
560
570
|
)
|
|
561
571
|
block_1_bad = recursive_replace(
|
|
562
|
-
blocks[1], "finished_sub_slots", blocks[1].finished_sub_slots[:-1]
|
|
572
|
+
blocks[1], "finished_sub_slots", [*blocks[1].finished_sub_slots[:-1], new_finished_ss]
|
|
563
573
|
)
|
|
564
574
|
await _validate_and_add_block(empty_blockchain, blocks[0])
|
|
565
575
|
|
|
@@ -591,7 +601,7 @@ class TestBlockHeaderValidation:
|
|
|
591
601
|
),
|
|
592
602
|
)
|
|
593
603
|
block_0_bad = recursive_replace(
|
|
594
|
-
blocks[0], "finished_sub_slots", [new_finished_ss
|
|
604
|
+
blocks[0], "finished_sub_slots", [new_finished_ss, *blocks[0].finished_sub_slots[1:]]
|
|
595
605
|
)
|
|
596
606
|
await _validate_and_add_block(empty_blockchain, block_0_bad, expected_error=Err.SHOULD_NOT_HAVE_ICC)
|
|
597
607
|
|
|
@@ -625,7 +635,7 @@ class TestBlockHeaderValidation:
|
|
|
625
635
|
),
|
|
626
636
|
)
|
|
627
637
|
block_bad = recursive_replace(
|
|
628
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
638
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss]
|
|
629
639
|
)
|
|
630
640
|
await _validate_and_add_block(bc1, block_bad, expected_error=Err.INVALID_ICC_EOS_VDF)
|
|
631
641
|
|
|
@@ -643,7 +653,7 @@ class TestBlockHeaderValidation:
|
|
|
643
653
|
)
|
|
644
654
|
log.warning(f"Proof: {block.finished_sub_slots[-1].proofs}")
|
|
645
655
|
block_bad_2 = recursive_replace(
|
|
646
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
656
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_2]
|
|
647
657
|
)
|
|
648
658
|
await _validate_and_add_block(bc1, block_bad_2, expected_error=Err.INVALID_ICC_EOS_VDF)
|
|
649
659
|
|
|
@@ -660,7 +670,7 @@ class TestBlockHeaderValidation:
|
|
|
660
670
|
),
|
|
661
671
|
)
|
|
662
672
|
block_bad_3 = recursive_replace(
|
|
663
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
673
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_3]
|
|
664
674
|
)
|
|
665
675
|
await _validate_and_add_block(bc1, block_bad_3, expected_error=Err.INVALID_ICC_EOS_VDF)
|
|
666
676
|
|
|
@@ -671,7 +681,7 @@ class TestBlockHeaderValidation:
|
|
|
671
681
|
VDFProof(uint8(0), b"1239819023890", False),
|
|
672
682
|
)
|
|
673
683
|
block_bad_5 = recursive_replace(
|
|
674
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
684
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_5]
|
|
675
685
|
)
|
|
676
686
|
await _validate_and_add_block(bc1, block_bad_5, expected_error=Err.INVALID_ICC_EOS_VDF)
|
|
677
687
|
|
|
@@ -715,7 +725,7 @@ class TestBlockHeaderValidation:
|
|
|
715
725
|
),
|
|
716
726
|
)
|
|
717
727
|
block_bad = recursive_replace(
|
|
718
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
728
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss]
|
|
719
729
|
)
|
|
720
730
|
|
|
721
731
|
header_block_bad = get_block_header(block_bad)
|
|
@@ -737,7 +747,7 @@ class TestBlockHeaderValidation:
|
|
|
737
747
|
block.finished_sub_slots[-1].reward_chain.replace(infused_challenge_chain_sub_slot_hash=None),
|
|
738
748
|
)
|
|
739
749
|
block_bad = recursive_replace(
|
|
740
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
750
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_bad_rc]
|
|
741
751
|
)
|
|
742
752
|
await _validate_and_add_block(blockchain, block_bad, expected_error=Err.INVALID_ICC_HASH_RC)
|
|
743
753
|
elif len(block.finished_sub_slots) > 0 and block.finished_sub_slots[-1].infused_challenge_chain is None:
|
|
@@ -751,7 +761,7 @@ class TestBlockHeaderValidation:
|
|
|
751
761
|
),
|
|
752
762
|
)
|
|
753
763
|
block_bad = recursive_replace(
|
|
754
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
764
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_bad_cc]
|
|
755
765
|
)
|
|
756
766
|
await _validate_and_add_block(blockchain, block_bad, expected_error=Err.INVALID_ICC_HASH_CC)
|
|
757
767
|
|
|
@@ -765,7 +775,7 @@ class TestBlockHeaderValidation:
|
|
|
765
775
|
),
|
|
766
776
|
)
|
|
767
777
|
block_bad = recursive_replace(
|
|
768
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
778
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_bad_rc]
|
|
769
779
|
)
|
|
770
780
|
await _validate_and_add_block(blockchain, block_bad, expected_error=Err.INVALID_ICC_HASH_RC)
|
|
771
781
|
|
|
@@ -786,7 +796,7 @@ class TestBlockHeaderValidation:
|
|
|
786
796
|
blocks[-1].finished_sub_slots[-1].challenge_chain.replace(subepoch_summary_hash=std_hash(b"0")),
|
|
787
797
|
)
|
|
788
798
|
block_bad = recursive_replace(
|
|
789
|
-
blocks[-1], "finished_sub_slots", blocks[-1].finished_sub_slots[:-1]
|
|
799
|
+
blocks[-1], "finished_sub_slots", [*blocks[-1].finished_sub_slots[:-1], new_finished_ss]
|
|
790
800
|
)
|
|
791
801
|
|
|
792
802
|
header_block_bad = get_block_header(block_bad)
|
|
@@ -835,7 +845,7 @@ class TestBlockHeaderValidation:
|
|
|
835
845
|
blocks[-1].finished_sub_slots[-1].reward_chain.replace(challenge_chain_sub_slot_hash=bytes32([3] * 32)),
|
|
836
846
|
)
|
|
837
847
|
block_1_bad = recursive_replace(
|
|
838
|
-
blocks[-1], "finished_sub_slots", blocks[-1].finished_sub_slots[:-1]
|
|
848
|
+
blocks[-1], "finished_sub_slots", [*blocks[-1].finished_sub_slots[:-1], new_finished_ss]
|
|
839
849
|
)
|
|
840
850
|
|
|
841
851
|
await _validate_and_add_block(blockchain, block_1_bad, expected_error=Err.INVALID_CHALLENGE_SLOT_HASH_RC)
|
|
@@ -873,7 +883,7 @@ class TestBlockHeaderValidation:
|
|
|
873
883
|
)
|
|
874
884
|
log.warning(f"Num slots: {len(block.finished_sub_slots)}")
|
|
875
885
|
block_bad = recursive_replace(
|
|
876
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
886
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss]
|
|
877
887
|
)
|
|
878
888
|
log.warning(f"Signage point index: {block_bad.reward_chain_block.signage_point_index}")
|
|
879
889
|
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_CC_EOS_VDF)
|
|
@@ -895,7 +905,7 @@ class TestBlockHeaderValidation:
|
|
|
895
905
|
new_finished_ss_2.challenge_chain.get_hash(),
|
|
896
906
|
)
|
|
897
907
|
block_bad_2 = recursive_replace(
|
|
898
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
908
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_2]
|
|
899
909
|
)
|
|
900
910
|
await _validate_and_add_block(empty_blockchain, block_bad_2, expected_error=Err.INVALID_CC_EOS_VDF)
|
|
901
911
|
|
|
@@ -916,7 +926,7 @@ class TestBlockHeaderValidation:
|
|
|
916
926
|
new_finished_ss_3.challenge_chain.get_hash(),
|
|
917
927
|
)
|
|
918
928
|
block_bad_3 = recursive_replace(
|
|
919
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
929
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_3]
|
|
920
930
|
)
|
|
921
931
|
|
|
922
932
|
await _validate_and_add_block_multi_error(
|
|
@@ -932,7 +942,7 @@ class TestBlockHeaderValidation:
|
|
|
932
942
|
VDFProof(uint8(0), b"1239819023890", False),
|
|
933
943
|
)
|
|
934
944
|
block_bad_5 = recursive_replace(
|
|
935
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
945
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_5]
|
|
936
946
|
)
|
|
937
947
|
await _validate_and_add_block(empty_blockchain, block_bad_5, expected_error=Err.INVALID_CC_EOS_VDF)
|
|
938
948
|
|
|
@@ -964,7 +974,7 @@ class TestBlockHeaderValidation:
|
|
|
964
974
|
),
|
|
965
975
|
)
|
|
966
976
|
block_bad = recursive_replace(
|
|
967
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
977
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss]
|
|
968
978
|
)
|
|
969
979
|
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_RC_EOS_VDF)
|
|
970
980
|
|
|
@@ -979,7 +989,7 @@ class TestBlockHeaderValidation:
|
|
|
979
989
|
),
|
|
980
990
|
)
|
|
981
991
|
block_bad_2 = recursive_replace(
|
|
982
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
992
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_2]
|
|
983
993
|
)
|
|
984
994
|
await _validate_and_add_block(empty_blockchain, block_bad_2, expected_error=Err.INVALID_RC_EOS_VDF)
|
|
985
995
|
|
|
@@ -994,7 +1004,7 @@ class TestBlockHeaderValidation:
|
|
|
994
1004
|
),
|
|
995
1005
|
)
|
|
996
1006
|
block_bad_3 = recursive_replace(
|
|
997
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
1007
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_3]
|
|
998
1008
|
)
|
|
999
1009
|
await _validate_and_add_block(empty_blockchain, block_bad_3, expected_error=Err.INVALID_RC_EOS_VDF)
|
|
1000
1010
|
|
|
@@ -1005,7 +1015,7 @@ class TestBlockHeaderValidation:
|
|
|
1005
1015
|
VDFProof(uint8(0), b"1239819023890", False),
|
|
1006
1016
|
)
|
|
1007
1017
|
block_bad_5 = recursive_replace(
|
|
1008
|
-
block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
1018
|
+
block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss_5]
|
|
1009
1019
|
)
|
|
1010
1020
|
await _validate_and_add_block(empty_blockchain, block_bad_5, expected_error=Err.INVALID_RC_EOS_VDF)
|
|
1011
1021
|
|
|
@@ -1024,7 +1034,7 @@ class TestBlockHeaderValidation:
|
|
|
1024
1034
|
bt.constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK - 1,
|
|
1025
1035
|
),
|
|
1026
1036
|
)
|
|
1027
|
-
block_bad = recursive_replace(block, "finished_sub_slots", block.finished_sub_slots[:-1]
|
|
1037
|
+
block_bad = recursive_replace(block, "finished_sub_slots", [*block.finished_sub_slots[:-1], new_finished_ss])
|
|
1028
1038
|
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_DEFICIT)
|
|
1029
1039
|
|
|
1030
1040
|
@pytest.mark.anyio
|
|
@@ -1053,7 +1063,7 @@ class TestBlockHeaderValidation:
|
|
|
1053
1063
|
case_2 = True
|
|
1054
1064
|
|
|
1055
1065
|
block_bad = recursive_replace(
|
|
1056
|
-
blocks[-1], "finished_sub_slots", blocks[-1].finished_sub_slots[:-1]
|
|
1066
|
+
blocks[-1], "finished_sub_slots", [*blocks[-1].finished_sub_slots[:-1], new_finished_ss]
|
|
1057
1067
|
)
|
|
1058
1068
|
await _validate_and_add_block_multi_error(
|
|
1059
1069
|
empty_blockchain, block_bad, [Err.INVALID_DEFICIT, Err.INVALID_ICC_HASH_CC]
|
|
@@ -1082,7 +1092,7 @@ class TestBlockHeaderValidation:
|
|
|
1082
1092
|
challenge_chain_sub_slot_hash=new_finished_ss.challenge_chain.get_hash()
|
|
1083
1093
|
),
|
|
1084
1094
|
)
|
|
1085
|
-
block_bad = recursive_replace(block, "finished_sub_slots", [new_finished_ss
|
|
1095
|
+
block_bad = recursive_replace(block, "finished_sub_slots", [new_finished_ss, *block.finished_sub_slots[1:]])
|
|
1086
1096
|
with pytest.raises(AssertionError):
|
|
1087
1097
|
# Fails pre validation
|
|
1088
1098
|
await _validate_and_add_block(
|
|
@@ -1118,7 +1128,7 @@ class TestBlockHeaderValidation:
|
|
|
1118
1128
|
),
|
|
1119
1129
|
)
|
|
1120
1130
|
block_bad = recursive_replace(
|
|
1121
|
-
blocks[-1], "finished_sub_slots", [new_finished_ss
|
|
1131
|
+
blocks[-1], "finished_sub_slots", [new_finished_ss, *blocks[-1].finished_sub_slots[1:]]
|
|
1122
1132
|
)
|
|
1123
1133
|
await _validate_and_add_block_multi_error(
|
|
1124
1134
|
empty_blockchain,
|
|
@@ -1150,7 +1160,7 @@ class TestBlockHeaderValidation:
|
|
|
1150
1160
|
)
|
|
1151
1161
|
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
|
|
1152
1162
|
|
|
1153
|
-
block_bad = recursive_replace(blocks[-1], "reward_chain_block.proof_of_space.
|
|
1163
|
+
block_bad = recursive_replace(blocks[-1], "reward_chain_block.proof_of_space.version_and_size", 62)
|
|
1154
1164
|
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
|
|
1155
1165
|
|
|
1156
1166
|
block_bad = recursive_replace(
|
|
@@ -1161,14 +1171,14 @@ class TestBlockHeaderValidation:
|
|
|
1161
1171
|
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
|
|
1162
1172
|
block_bad = recursive_replace(
|
|
1163
1173
|
blocks[-1],
|
|
1164
|
-
"reward_chain_block.proof_of_space.
|
|
1174
|
+
"reward_chain_block.proof_of_space.version_and_size",
|
|
1165
1175
|
32,
|
|
1166
1176
|
)
|
|
1167
1177
|
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
|
|
1168
1178
|
block_bad = recursive_replace(
|
|
1169
1179
|
blocks[-1],
|
|
1170
1180
|
"reward_chain_block.proof_of_space.proof",
|
|
1171
|
-
bytes([1] * int(blocks[-1].reward_chain_block.proof_of_space.
|
|
1181
|
+
bytes([1] * int((blocks[-1].reward_chain_block.proof_of_space.version_and_size & 0x7F) * 64 / 8)),
|
|
1172
1182
|
)
|
|
1173
1183
|
await _validate_and_add_block(empty_blockchain, block_bad, expected_error=Err.INVALID_POSPACE)
|
|
1174
1184
|
|
|
@@ -3642,6 +3652,41 @@ class TestReorgs:
|
|
|
3642
3652
|
assert len(blocks) == 200
|
|
3643
3653
|
assert blocks[-1].height == 199
|
|
3644
3654
|
|
|
3655
|
+
@pytest.mark.anyio
|
|
3656
|
+
async def test_overlong_generator_encoding(
|
|
3657
|
+
self, empty_blockchain: Blockchain, bt: BlockTools, consensus_mode: ConsensusMode
|
|
3658
|
+
) -> None:
|
|
3659
|
+
# add enough blocks to pass the hard fork
|
|
3660
|
+
blocks = bt.get_consecutive_blocks(10)
|
|
3661
|
+
for b in blocks[:-1]:
|
|
3662
|
+
await _validate_and_add_block(empty_blockchain, b)
|
|
3663
|
+
|
|
3664
|
+
while not blocks[-1].is_transaction_block():
|
|
3665
|
+
await _validate_and_add_block(empty_blockchain, blocks[-1])
|
|
3666
|
+
blocks = bt.get_consecutive_blocks(1, block_list_input=blocks)
|
|
3667
|
+
original_block: FullBlock = blocks[-1]
|
|
3668
|
+
|
|
3669
|
+
# overlong encoding
|
|
3670
|
+
generator = SerializedProgram.fromhex("c00101")
|
|
3671
|
+
assert not is_canonical_serialization(bytes(generator))
|
|
3672
|
+
|
|
3673
|
+
block = recursive_replace(original_block, "transactions_generator", generator)
|
|
3674
|
+
block = recursive_replace(block, "transactions_info.generator_root", std_hash(bytes(generator)))
|
|
3675
|
+
block = recursive_replace(
|
|
3676
|
+
block, "foliage_transaction_block.transactions_info_hash", std_hash(bytes(block.transactions_info))
|
|
3677
|
+
)
|
|
3678
|
+
block = recursive_replace(
|
|
3679
|
+
block, "foliage.foliage_transaction_block_hash", std_hash(bytes(block.foliage_transaction_block))
|
|
3680
|
+
)
|
|
3681
|
+
|
|
3682
|
+
# overlong encoding became invalid in the 3.0 hard fork
|
|
3683
|
+
if consensus_mode == ConsensusMode.HARD_FORK_3_0:
|
|
3684
|
+
expected_error = Err.INVALID_TRANSACTIONS_GENERATOR_ENCODING
|
|
3685
|
+
else:
|
|
3686
|
+
expected_error = None
|
|
3687
|
+
|
|
3688
|
+
await _validate_and_add_block(empty_blockchain, block, expected_error=expected_error, skip_prevalidation=True)
|
|
3689
|
+
|
|
3645
3690
|
|
|
3646
3691
|
@pytest.mark.anyio
|
|
3647
3692
|
async def test_reorg_new_ref(empty_blockchain: Blockchain, bt: BlockTools) -> None:
|
|
@@ -4193,3 +4238,175 @@ async def test_get_header_blocks_in_range_tx_filter_non_tx_block(empty_blockchai
|
|
|
4193
4238
|
blocks_with_filter = await b.get_header_blocks_in_range(0, 42, tx_filter=True)
|
|
4194
4239
|
empty_tx_filter = b"\x00"
|
|
4195
4240
|
assert blocks_with_filter[non_tx_block.header_hash].transactions_filter == empty_tx_filter
|
|
4241
|
+
|
|
4242
|
+
|
|
4243
|
+
@dataclass(frozen=True)
|
|
4244
|
+
class ForkInfoTestSetup:
|
|
4245
|
+
fork_info: ForkInfo
|
|
4246
|
+
initial_additions_since_fork: dict[bytes32, ForkAdd]
|
|
4247
|
+
test_block: FullBlock
|
|
4248
|
+
coin: Coin
|
|
4249
|
+
child_coin: Coin
|
|
4250
|
+
|
|
4251
|
+
@classmethod
|
|
4252
|
+
def create(cls, same_ph_as_parent: bool, same_amount_as_parent: bool) -> ForkInfoTestSetup:
|
|
4253
|
+
from chia._tests.util.network_protocol_data import full_block as test_block
|
|
4254
|
+
|
|
4255
|
+
unrelated_coin = Coin(bytes32([0] * 32), bytes32([1] * 32), uint64(42))
|
|
4256
|
+
# We add this initial state with an unrelated addition, to create a
|
|
4257
|
+
# difference between the `rollback` state and the completely empty
|
|
4258
|
+
# `reset` state.
|
|
4259
|
+
initial_additions_since_fork = {
|
|
4260
|
+
unrelated_coin.name(): ForkAdd(
|
|
4261
|
+
coin=unrelated_coin,
|
|
4262
|
+
confirmed_height=uint32(1),
|
|
4263
|
+
timestamp=uint64(0),
|
|
4264
|
+
hint=None,
|
|
4265
|
+
is_coinbase=False,
|
|
4266
|
+
same_as_parent=False,
|
|
4267
|
+
)
|
|
4268
|
+
}
|
|
4269
|
+
fork_info = ForkInfo(
|
|
4270
|
+
test_block.height - 1,
|
|
4271
|
+
test_block.height - 1,
|
|
4272
|
+
test_block.prev_header_hash,
|
|
4273
|
+
additions_since_fork=copy.copy(initial_additions_since_fork),
|
|
4274
|
+
)
|
|
4275
|
+
puzzle_hash = bytes32([2] * 32)
|
|
4276
|
+
amount = uint64(1337)
|
|
4277
|
+
coin = Coin(bytes32([3] * 32), puzzle_hash, amount)
|
|
4278
|
+
child_coin_ph = puzzle_hash if same_ph_as_parent else bytes32([4] * 32)
|
|
4279
|
+
child_coin_amount = amount if same_amount_as_parent else uint64(0)
|
|
4280
|
+
child_coin = Coin(coin.name(), child_coin_ph, child_coin_amount)
|
|
4281
|
+
return cls(
|
|
4282
|
+
fork_info=fork_info,
|
|
4283
|
+
initial_additions_since_fork=initial_additions_since_fork,
|
|
4284
|
+
test_block=test_block,
|
|
4285
|
+
coin=coin,
|
|
4286
|
+
child_coin=child_coin,
|
|
4287
|
+
)
|
|
4288
|
+
|
|
4289
|
+
def check_additions(self, expected_same_parent_additions: set[bytes32]) -> None:
|
|
4290
|
+
assert all(
|
|
4291
|
+
a in self.fork_info.additions_since_fork and self.fork_info.additions_since_fork[a].same_as_parent
|
|
4292
|
+
for a in expected_same_parent_additions
|
|
4293
|
+
)
|
|
4294
|
+
remaining_additions = set(self.fork_info.additions_since_fork) - expected_same_parent_additions
|
|
4295
|
+
assert not any(self.fork_info.additions_since_fork[a].same_as_parent for a in remaining_additions)
|
|
4296
|
+
|
|
4297
|
+
|
|
4298
|
+
@pytest.mark.parametrize("same_ph_as_parent", [True, False])
|
|
4299
|
+
@pytest.mark.parametrize("same_amount_as_parent", [True, False])
|
|
4300
|
+
@pytest.mark.parametrize("rollback", [True, False])
|
|
4301
|
+
@pytest.mark.parametrize("reset", [True, False])
|
|
4302
|
+
@pytest.mark.anyio
|
|
4303
|
+
async def test_include_spends_same_as_parent(
|
|
4304
|
+
same_ph_as_parent: bool, same_amount_as_parent: bool, rollback: bool, reset: bool
|
|
4305
|
+
) -> None:
|
|
4306
|
+
"""
|
|
4307
|
+
Tests that `ForkInfo` properly tracks same-as-parent created coins.
|
|
4308
|
+
A created coin is tracked as such if its puzzle hash and amount match the
|
|
4309
|
+
parent. We're covering here `include_spends`, `rollback` and `reset` in the
|
|
4310
|
+
context of same-as-parent coins.
|
|
4311
|
+
"""
|
|
4312
|
+
test_setup = ForkInfoTestSetup.create(same_ph_as_parent, same_amount_as_parent)
|
|
4313
|
+
# Now let's prepare the test spend bundle conditions
|
|
4314
|
+
create_coin = [(test_setup.child_coin.puzzle_hash, test_setup.child_coin.amount, None)]
|
|
4315
|
+
conds = SpendBundleConditions(
|
|
4316
|
+
[
|
|
4317
|
+
SpendConditions(
|
|
4318
|
+
test_setup.coin.name(),
|
|
4319
|
+
test_setup.coin.parent_coin_info,
|
|
4320
|
+
test_setup.coin.puzzle_hash,
|
|
4321
|
+
test_setup.coin.amount,
|
|
4322
|
+
None,
|
|
4323
|
+
None,
|
|
4324
|
+
None,
|
|
4325
|
+
None,
|
|
4326
|
+
None,
|
|
4327
|
+
None,
|
|
4328
|
+
create_coin,
|
|
4329
|
+
[],
|
|
4330
|
+
[],
|
|
4331
|
+
[],
|
|
4332
|
+
[],
|
|
4333
|
+
[],
|
|
4334
|
+
[],
|
|
4335
|
+
[],
|
|
4336
|
+
0,
|
|
4337
|
+
0,
|
|
4338
|
+
0,
|
|
4339
|
+
)
|
|
4340
|
+
],
|
|
4341
|
+
0,
|
|
4342
|
+
0,
|
|
4343
|
+
0,
|
|
4344
|
+
None,
|
|
4345
|
+
None,
|
|
4346
|
+
[],
|
|
4347
|
+
0,
|
|
4348
|
+
0,
|
|
4349
|
+
0,
|
|
4350
|
+
True,
|
|
4351
|
+
0,
|
|
4352
|
+
0,
|
|
4353
|
+
)
|
|
4354
|
+
# Now let's run the test
|
|
4355
|
+
test_setup.fork_info.include_spends(conds, test_setup.test_block, test_setup.test_block.header_hash)
|
|
4356
|
+
# Let's make sure the results are as expected
|
|
4357
|
+
expected_same_parent_additions = (
|
|
4358
|
+
{test_setup.child_coin.name()} if same_ph_as_parent and same_amount_as_parent else set()
|
|
4359
|
+
)
|
|
4360
|
+
test_setup.check_additions(expected_same_parent_additions)
|
|
4361
|
+
if rollback:
|
|
4362
|
+
# Now we rollback before the spend that belongs to the test conditions
|
|
4363
|
+
test_setup.fork_info.rollback(test_setup.test_block.prev_header_hash, test_setup.test_block.height - 1)
|
|
4364
|
+
# That should leave only the initial additions we started with, which
|
|
4365
|
+
# are unrelated to the test conditions. We added this initial state to
|
|
4366
|
+
# create a difference between `rollback` state and the completely empty
|
|
4367
|
+
# `reset` state.
|
|
4368
|
+
assert test_setup.fork_info.additions_since_fork == test_setup.initial_additions_since_fork
|
|
4369
|
+
if reset:
|
|
4370
|
+
# Now we reset to a test height and header hash
|
|
4371
|
+
test_setup.fork_info.reset(1, bytes32([0] * 32))
|
|
4372
|
+
# That should leave this empty
|
|
4373
|
+
assert test_setup.fork_info.additions_since_fork == {}
|
|
4374
|
+
|
|
4375
|
+
|
|
4376
|
+
@pytest.mark.parametrize("same_ph_as_parent", [True, False])
|
|
4377
|
+
@pytest.mark.parametrize("same_amount_as_parent", [True, False])
|
|
4378
|
+
@pytest.mark.parametrize("rollback", [True, False])
|
|
4379
|
+
@pytest.mark.parametrize("reset", [True, False])
|
|
4380
|
+
@pytest.mark.anyio
|
|
4381
|
+
async def test_include_block_same_as_parent_coins(
|
|
4382
|
+
same_ph_as_parent: bool, same_amount_as_parent: bool, rollback: bool, reset: bool
|
|
4383
|
+
) -> None:
|
|
4384
|
+
"""
|
|
4385
|
+
Tests that `ForkInfo` properly tracks same-as-parent created coins.
|
|
4386
|
+
A created coin is tracked as such if its puzzle hash and amount match the
|
|
4387
|
+
parent. We're covering here `include_block`, `rollback` and `reset` in the
|
|
4388
|
+
context of such coins.
|
|
4389
|
+
"""
|
|
4390
|
+
test_setup = ForkInfoTestSetup.create(same_ph_as_parent, same_amount_as_parent)
|
|
4391
|
+
# Now let's run the test
|
|
4392
|
+
test_setup.fork_info.include_block(
|
|
4393
|
+
[(test_setup.child_coin, None)],
|
|
4394
|
+
[(test_setup.coin.name(), test_setup.coin)],
|
|
4395
|
+
test_setup.test_block,
|
|
4396
|
+
test_setup.test_block.header_hash,
|
|
4397
|
+
)
|
|
4398
|
+
# Let's make sure the results are as expected
|
|
4399
|
+
expected_same_as_parent_additions = (
|
|
4400
|
+
{test_setup.child_coin.name()} if same_ph_as_parent and same_amount_as_parent else set()
|
|
4401
|
+
)
|
|
4402
|
+
test_setup.check_additions(expected_same_as_parent_additions)
|
|
4403
|
+
if rollback:
|
|
4404
|
+
# Now we rollback before the spend that belongs to the test conditions
|
|
4405
|
+
test_setup.fork_info.rollback(test_setup.test_block.prev_header_hash, test_setup.test_block.height - 1)
|
|
4406
|
+
# That should leave only the initial additions we started with
|
|
4407
|
+
assert test_setup.fork_info.additions_since_fork == test_setup.initial_additions_since_fork
|
|
4408
|
+
if reset:
|
|
4409
|
+
# Now we reset to a test height and header hash
|
|
4410
|
+
test_setup.fork_info.reset(1, bytes32([0] * 32))
|
|
4411
|
+
# That should leave this empty
|
|
4412
|
+
assert test_setup.fork_info.additions_since_fork == {}
|
|
@@ -3,9 +3,9 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
|
|
5
5
|
import pytest
|
|
6
|
+
from chia_rs import SpendBundle
|
|
6
7
|
from chia_rs.sized_bytes import bytes32
|
|
7
8
|
from chia_rs.sized_ints import uint32, uint64
|
|
8
|
-
from clvm.casts import int_to_bytes
|
|
9
9
|
|
|
10
10
|
from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block
|
|
11
11
|
from chia._tests.util.generator_tools_testing import run_and_get_removals_and_additions
|
|
@@ -18,9 +18,10 @@ from chia.simulator.block_tools import BlockTools, test_constants
|
|
|
18
18
|
from chia.simulator.wallet_tools import WalletTool
|
|
19
19
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
20
20
|
from chia.types.condition_with_args import ConditionWithArgs
|
|
21
|
-
from chia.
|
|
21
|
+
from chia.util.casts import int_to_bytes
|
|
22
22
|
from chia.util.errors import Err
|
|
23
23
|
from chia.wallet.conditions import AssertCoinAnnouncement, AssertPuzzleAnnouncement
|
|
24
|
+
from chia.wallet.estimate_fees import estimate_fees
|
|
24
25
|
|
|
25
26
|
BURN_PUZZLE_HASH = bytes32(b"0" * 32)
|
|
26
27
|
|
|
@@ -65,7 +66,7 @@ class TestBlockchainTransactions:
|
|
|
65
66
|
assert sb == spend_bundle
|
|
66
67
|
|
|
67
68
|
last_block = blocks[-1]
|
|
68
|
-
result =
|
|
69
|
+
result = full_node_1.mempool_manager.create_bundle_from_mempool(last_block.header_hash)
|
|
69
70
|
assert result is not None
|
|
70
71
|
next_spendbundle, _ = result
|
|
71
72
|
|