chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_blockchain_transactions.py +5 -2
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +66 -31
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +273 -70
- chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
- chia/_tests/core/mempool/test_mempool.py +54 -50
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +988 -854
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +9 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +16 -15
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +374 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- 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/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +19 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +50 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +239 -223
- chia/full_node/full_node_api.py +197 -152
- chia/full_node/full_node_rpc_api.py +34 -32
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hard_fork_utils.py +44 -0
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +120 -36
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +4 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +24 -10
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +142 -106
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,13 +5,16 @@ import contextlib
|
|
|
5
5
|
import dataclasses
|
|
6
6
|
import logging
|
|
7
7
|
import random
|
|
8
|
+
import sqlite3
|
|
8
9
|
import time
|
|
9
10
|
from collections.abc import Awaitable, Coroutine
|
|
10
|
-
from typing import Any
|
|
11
|
+
from typing import Any
|
|
11
12
|
|
|
12
13
|
import pytest
|
|
13
14
|
from chia_rs import (
|
|
14
15
|
AugSchemeMPL,
|
|
16
|
+
Coin,
|
|
17
|
+
CoinRecord,
|
|
15
18
|
ConsensusConstants,
|
|
16
19
|
Foliage,
|
|
17
20
|
FoliageTransactionBlock,
|
|
@@ -33,10 +36,11 @@ from packaging.version import Version
|
|
|
33
36
|
|
|
34
37
|
from chia._tests.blockchain.blockchain_test_utils import _validate_and_add_block, _validate_and_add_block_no_error
|
|
35
38
|
from chia._tests.conftest import ConsensusMode
|
|
36
|
-
from chia._tests.connection_utils import add_dummy_connection, connect_and_get_peer
|
|
39
|
+
from chia._tests.connection_utils import add_dummy_connection, add_dummy_connection_wsc, connect_and_get_peer
|
|
37
40
|
from chia._tests.core.full_node.stores.test_coin_store import get_future_reward_coins
|
|
38
41
|
from chia._tests.core.make_block_generator import make_spend_bundle
|
|
39
42
|
from chia._tests.core.node_height import node_height_at_least
|
|
43
|
+
from chia._tests.core.test_db_validation import make_db
|
|
40
44
|
from chia._tests.util.misc import wallet_height_at_least
|
|
41
45
|
from chia._tests.util.setup_nodes import (
|
|
42
46
|
OldSimulatorsAndWallets,
|
|
@@ -52,14 +56,14 @@ from chia.consensus.get_block_challenge import get_block_challenge
|
|
|
52
56
|
from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
|
|
53
57
|
from chia.consensus.pot_iterations import is_overflow_block
|
|
54
58
|
from chia.consensus.signage_point import SignagePoint
|
|
55
|
-
from chia.full_node.full_node import WalletUpdate
|
|
59
|
+
from chia.full_node.full_node import FullNode, WalletUpdate
|
|
56
60
|
from chia.full_node.full_node_api import FullNodeAPI
|
|
57
61
|
from chia.full_node.sync_store import Peak
|
|
58
62
|
from chia.protocols import full_node_protocol, timelord_protocol, wallet_protocol
|
|
59
63
|
from chia.protocols import full_node_protocol as fnp
|
|
60
64
|
from chia.protocols.farmer_protocol import DeclareProofOfSpace
|
|
61
65
|
from chia.protocols.full_node_protocol import NewTransaction, RespondTransaction
|
|
62
|
-
from chia.protocols.outbound_message import Message, NodeType
|
|
66
|
+
from chia.protocols.outbound_message import Message, NodeType, make_msg
|
|
63
67
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
64
68
|
from chia.protocols.shared_protocol import Capability, default_capabilities
|
|
65
69
|
from chia.protocols.wallet_protocol import SendTransaction, TransactionAck
|
|
@@ -91,7 +95,6 @@ from chia.types.blockchain_format.proof_of_space import (
|
|
|
91
95
|
)
|
|
92
96
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
93
97
|
from chia.types.blockchain_format.vdf import CompressibleVDFField, VDFProof
|
|
94
|
-
from chia.types.coin_record import CoinRecord
|
|
95
98
|
from chia.types.coin_spend import make_spend
|
|
96
99
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
97
100
|
from chia.types.condition_with_args import ConditionWithArgs
|
|
@@ -102,6 +105,7 @@ from chia.util.casts import int_to_bytes
|
|
|
102
105
|
from chia.util.errors import ConsensusError, Err
|
|
103
106
|
from chia.util.hash import std_hash
|
|
104
107
|
from chia.util.limited_semaphore import LimitedSemaphore
|
|
108
|
+
from chia.util.path import path_from_root
|
|
105
109
|
from chia.util.recursive_replace import recursive_replace
|
|
106
110
|
from chia.util.task_referencer import create_referenced_task
|
|
107
111
|
from chia.wallet.estimate_fees import estimate_fees
|
|
@@ -111,6 +115,13 @@ from chia.wallet.wallet_node import WalletNode
|
|
|
111
115
|
from chia.wallet.wallet_spend_bundle import WalletSpendBundle
|
|
112
116
|
|
|
113
117
|
|
|
118
|
+
def find_reward_coin(b: FullBlock, puzzle_hash: bytes32) -> Coin:
|
|
119
|
+
for c in b.get_included_reward_coins():
|
|
120
|
+
if c.puzzle_hash == puzzle_hash:
|
|
121
|
+
return c
|
|
122
|
+
raise ValueError("no reward coin with the specified puzzle hash found")
|
|
123
|
+
|
|
124
|
+
|
|
114
125
|
def test_pre_validation_result() -> None:
|
|
115
126
|
conds = SpendBundleConditions([], 0, 0, 0, None, None, [], 0, 0, 0, True, 0, 0, 0, 0, 0)
|
|
116
127
|
results = PreValidationResult(None, uint64(1), conds, uint32(0))
|
|
@@ -246,7 +257,7 @@ async def test_block_compression(
|
|
|
246
257
|
await time_out_assert(30, check_transaction_confirmed, True, tr)
|
|
247
258
|
|
|
248
259
|
# Confirm generator is not compressed
|
|
249
|
-
program:
|
|
260
|
+
program: SerializedProgram | None = (await full_node_1.get_all_full_blocks())[-1].transactions_generator
|
|
250
261
|
assert program is not None
|
|
251
262
|
assert len((await full_node_1.get_all_full_blocks())[-1].transactions_generator_ref_list) == 0
|
|
252
263
|
|
|
@@ -812,11 +823,10 @@ async def test_respond_unfinished(
|
|
|
812
823
|
block_list_input=blocks,
|
|
813
824
|
guarantee_transaction_block=True,
|
|
814
825
|
farmer_reward_puzzle_hash=ph,
|
|
815
|
-
pool_reward_puzzle_hash=ph,
|
|
816
826
|
)
|
|
817
827
|
await full_node_1.full_node.add_block(blocks[-2])
|
|
818
828
|
await full_node_1.full_node.add_block(blocks[-1])
|
|
819
|
-
coin_to_spend = blocks[-1]
|
|
829
|
+
coin_to_spend = find_reward_coin(blocks[-1], ph)
|
|
820
830
|
|
|
821
831
|
spend_bundle = wallet_a.generate_signed_transaction(coin_to_spend.amount, ph_receiver, coin_to_spend)
|
|
822
832
|
|
|
@@ -936,7 +946,6 @@ async def test_new_transaction_and_mempool(
|
|
|
936
946
|
3,
|
|
937
947
|
guarantee_transaction_block=True,
|
|
938
948
|
farmer_reward_puzzle_hash=wallet_ph,
|
|
939
|
-
pool_reward_puzzle_hash=wallet_ph,
|
|
940
949
|
)
|
|
941
950
|
for block in blocks:
|
|
942
951
|
await full_node_1.full_node.add_block(block)
|
|
@@ -993,7 +1002,7 @@ async def test_new_transaction_and_mempool(
|
|
|
993
1002
|
included_tx = 0
|
|
994
1003
|
not_included_tx = 0
|
|
995
1004
|
seen_bigger_transaction_has_high_fee = False
|
|
996
|
-
successful_bundle:
|
|
1005
|
+
successful_bundle: WalletSpendBundle | None = None
|
|
997
1006
|
|
|
998
1007
|
# Fill mempool
|
|
999
1008
|
receiver_puzzlehash = wallet_receiver.get_new_puzzlehash()
|
|
@@ -1023,7 +1032,7 @@ async def test_new_transaction_and_mempool(
|
|
|
1023
1032
|
assert estimate_fees(spend_bundle) == fee
|
|
1024
1033
|
respond_transaction = wallet_protocol.SendTransaction(spend_bundle)
|
|
1025
1034
|
|
|
1026
|
-
await full_node_1.send_transaction(respond_transaction)
|
|
1035
|
+
await full_node_1.send_transaction(respond_transaction, fake_peer)
|
|
1027
1036
|
|
|
1028
1037
|
request = fnp.RequestTransaction(spend_bundle.get_hash())
|
|
1029
1038
|
req = await full_node_1.request_transaction(request)
|
|
@@ -1074,7 +1083,7 @@ async def test_new_transaction_and_mempool(
|
|
|
1074
1083
|
assert err is None
|
|
1075
1084
|
|
|
1076
1085
|
# Resubmission through wallet is also fine
|
|
1077
|
-
response_msg = await full_node_1.send_transaction(SendTransaction(successful_bundle), test=True)
|
|
1086
|
+
response_msg = await full_node_1.send_transaction(SendTransaction(successful_bundle), fake_peer, test=True)
|
|
1078
1087
|
assert response_msg is not None
|
|
1079
1088
|
assert TransactionAck.from_bytes(response_msg.data).status == MempoolInclusionStatus.SUCCESS.value
|
|
1080
1089
|
|
|
@@ -1127,7 +1136,6 @@ async def test_request_respond_transaction(
|
|
|
1127
1136
|
block_list_input=blocks,
|
|
1128
1137
|
guarantee_transaction_block=True,
|
|
1129
1138
|
farmer_reward_puzzle_hash=wallet_ph,
|
|
1130
|
-
pool_reward_puzzle_hash=wallet_ph,
|
|
1131
1139
|
)
|
|
1132
1140
|
|
|
1133
1141
|
incoming_queue, _dummy_node_id = await add_dummy_connection(server_1, self_hostname, 12312)
|
|
@@ -1148,9 +1156,8 @@ async def test_request_respond_transaction(
|
|
|
1148
1156
|
|
|
1149
1157
|
receiver_puzzlehash = wallet_receiver.get_new_puzzlehash()
|
|
1150
1158
|
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
)
|
|
1159
|
+
coin = find_reward_coin(blocks[-1], wallet_ph)
|
|
1160
|
+
spend_bundle = wallet_a.generate_signed_transaction(uint64(100), receiver_puzzlehash, coin)
|
|
1154
1161
|
assert spend_bundle is not None
|
|
1155
1162
|
respond_transaction = fnp.RespondTransaction(spend_bundle)
|
|
1156
1163
|
res = await full_node_1.respond_transaction(respond_transaction, peer)
|
|
@@ -1192,7 +1199,6 @@ async def test_respond_transaction_fail(
|
|
|
1192
1199
|
block_list_input=blocks,
|
|
1193
1200
|
guarantee_transaction_block=True,
|
|
1194
1201
|
farmer_reward_puzzle_hash=cb_ph,
|
|
1195
|
-
pool_reward_puzzle_hash=cb_ph,
|
|
1196
1202
|
)
|
|
1197
1203
|
await asyncio.sleep(1)
|
|
1198
1204
|
while incoming_queue.qsize() > 0:
|
|
@@ -1204,11 +1210,8 @@ async def test_respond_transaction_fail(
|
|
|
1204
1210
|
|
|
1205
1211
|
await time_out_assert(10, time_out_messages(incoming_queue, "new_peak", 3))
|
|
1206
1212
|
# Invalid transaction does not propagate
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
receiver_puzzlehash,
|
|
1210
|
-
blocks_new[-1].get_included_reward_coins()[0],
|
|
1211
|
-
)
|
|
1213
|
+
coin = find_reward_coin(blocks_new[-1], cb_ph)
|
|
1214
|
+
spend_bundle = wallet_a.generate_signed_transaction(uint64(100_000_000_000_000), receiver_puzzlehash, coin)
|
|
1212
1215
|
|
|
1213
1216
|
assert spend_bundle is not None
|
|
1214
1217
|
respond_transaction = fnp.RespondTransaction(spend_bundle)
|
|
@@ -1228,18 +1231,15 @@ async def test_request_block(
|
|
|
1228
1231
|
full_node_1, _full_node_2, _server_1, _server_2, wallet_a, wallet_receiver, bt = wallet_nodes
|
|
1229
1232
|
blocks = await full_node_1.get_all_full_blocks()
|
|
1230
1233
|
|
|
1234
|
+
wallet_ph = wallet_a.get_new_puzzlehash()
|
|
1231
1235
|
blocks = bt.get_consecutive_blocks(
|
|
1232
1236
|
3,
|
|
1233
1237
|
block_list_input=blocks,
|
|
1234
1238
|
guarantee_transaction_block=True,
|
|
1235
|
-
farmer_reward_puzzle_hash=
|
|
1236
|
-
pool_reward_puzzle_hash=wallet_a.get_new_puzzlehash(),
|
|
1237
|
-
)
|
|
1238
|
-
spend_bundle = wallet_a.generate_signed_transaction(
|
|
1239
|
-
uint64(1123),
|
|
1240
|
-
wallet_receiver.get_new_puzzlehash(),
|
|
1241
|
-
blocks[-1].get_included_reward_coins()[0],
|
|
1239
|
+
farmer_reward_puzzle_hash=wallet_ph,
|
|
1242
1240
|
)
|
|
1241
|
+
coin = find_reward_coin(blocks[-1], wallet_ph)
|
|
1242
|
+
spend_bundle = wallet_a.generate_signed_transaction(uint64(1123), wallet_receiver.get_new_puzzlehash(), coin)
|
|
1243
1243
|
blocks = bt.get_consecutive_blocks(
|
|
1244
1244
|
1, block_list_input=blocks, guarantee_transaction_block=True, transaction_data=spend_bundle
|
|
1245
1245
|
)
|
|
@@ -1280,18 +1280,19 @@ async def test_request_blocks(
|
|
|
1280
1280
|
blocks = await full_node_1.get_all_full_blocks()
|
|
1281
1281
|
|
|
1282
1282
|
# create more blocks than constants.MAX_BLOCK_COUNT_PER_REQUEST (32)
|
|
1283
|
+
wallet_ph = wallet_a.get_new_puzzlehash()
|
|
1283
1284
|
blocks = bt.get_consecutive_blocks(
|
|
1284
1285
|
33,
|
|
1285
1286
|
block_list_input=blocks,
|
|
1286
1287
|
guarantee_transaction_block=True,
|
|
1287
|
-
farmer_reward_puzzle_hash=
|
|
1288
|
-
pool_reward_puzzle_hash=wallet_a.get_new_puzzlehash(),
|
|
1288
|
+
farmer_reward_puzzle_hash=wallet_ph,
|
|
1289
1289
|
)
|
|
1290
1290
|
|
|
1291
|
+
coin = find_reward_coin(blocks[-1], wallet_ph)
|
|
1291
1292
|
spend_bundle = wallet_a.generate_signed_transaction(
|
|
1292
1293
|
uint64(1123),
|
|
1293
1294
|
wallet_receiver.get_new_puzzlehash(),
|
|
1294
|
-
|
|
1295
|
+
coin,
|
|
1295
1296
|
)
|
|
1296
1297
|
blocks_t = bt.get_consecutive_blocks(
|
|
1297
1298
|
1, block_list_input=blocks, guarantee_transaction_block=True, transaction_data=spend_bundle
|
|
@@ -1375,7 +1376,7 @@ async def test_new_unfinished_block(
|
|
|
1375
1376
|
assert res is not None
|
|
1376
1377
|
assert res is not None and res.data == bytes(fnp.RequestUnfinishedBlock(unf.partial_hash))
|
|
1377
1378
|
|
|
1378
|
-
# when we receive a new unfinished block, we
|
|
1379
|
+
# when we receive a new unfinished block, we advertise it to our peers.
|
|
1379
1380
|
# We send new_unfinished_blocks to old peers (0.0.35 and earlier) and we
|
|
1380
1381
|
# send new_unfinishe_blocks2 to new peers (0.0.6 and later). Test both
|
|
1381
1382
|
peer.protocol_version = Version(peer_version)
|
|
@@ -1473,7 +1474,7 @@ async def test_new_unfinished_block2_forward_limit(
|
|
|
1473
1474
|
|
|
1474
1475
|
unf_blocks: list[UnfinishedBlock] = []
|
|
1475
1476
|
|
|
1476
|
-
last_reward_hash:
|
|
1477
|
+
last_reward_hash: bytes32 | None = None
|
|
1477
1478
|
for idx in range(6):
|
|
1478
1479
|
# we include a different transaction in each block. This makes the
|
|
1479
1480
|
# foliage different in each of them, but the reward block (plot) the same
|
|
@@ -1769,7 +1770,7 @@ async def test_request_unfinished_block2(
|
|
|
1769
1770
|
|
|
1770
1771
|
# the "best" unfinished block according to the metric we use to pick one
|
|
1771
1772
|
# deterministically
|
|
1772
|
-
best_unf:
|
|
1773
|
+
best_unf: UnfinishedBlock | None = None
|
|
1773
1774
|
|
|
1774
1775
|
for idx in range(6):
|
|
1775
1776
|
# we include a different transaction in each block. This makes the
|
|
@@ -2450,31 +2451,30 @@ async def test_invalid_capability_can_connect(
|
|
|
2450
2451
|
@pytest.mark.anyio
|
|
2451
2452
|
async def test_node_start_with_existing_blocks(db_version: int) -> None:
|
|
2452
2453
|
with TempKeyring(populate=True) as keychain:
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
assert block_record.height == expected_height, f"wrong height on cycle {cycle + 1}"
|
|
2454
|
+
async with create_block_tools_async(keychain=keychain) as block_tools:
|
|
2455
|
+
blocks_per_cycle = 5
|
|
2456
|
+
expected_height = 0
|
|
2457
|
+
|
|
2458
|
+
for cycle in range(2):
|
|
2459
|
+
async with setup_full_node(
|
|
2460
|
+
consensus_constants=block_tools.constants,
|
|
2461
|
+
db_name="node_restart_test.db",
|
|
2462
|
+
self_hostname=block_tools.config["self_hostname"],
|
|
2463
|
+
local_bt=block_tools,
|
|
2464
|
+
simulator=True,
|
|
2465
|
+
db_version=db_version,
|
|
2466
|
+
reuse_db=True,
|
|
2467
|
+
) as service:
|
|
2468
|
+
simulator_api = service._api
|
|
2469
|
+
assert isinstance(simulator_api, FullNodeSimulator)
|
|
2470
|
+
await simulator_api.farm_blocks_to_puzzlehash(count=blocks_per_cycle)
|
|
2471
|
+
|
|
2472
|
+
expected_height += blocks_per_cycle
|
|
2473
|
+
assert simulator_api.full_node._blockchain is not None
|
|
2474
|
+
block_record = simulator_api.full_node._blockchain.get_peak()
|
|
2475
|
+
|
|
2476
|
+
assert block_record is not None, f"block_record is None on cycle {cycle + 1}"
|
|
2477
|
+
assert block_record.height == expected_height, f"wrong height on cycle {cycle + 1}"
|
|
2478
2478
|
|
|
2479
2479
|
|
|
2480
2480
|
@pytest.mark.anyio
|
|
@@ -2713,7 +2713,7 @@ async def test_long_reorg_nodes(
|
|
|
2713
2713
|
p2 = full_node_1.full_node.blockchain.get_peak()
|
|
2714
2714
|
return p1 == p2
|
|
2715
2715
|
|
|
2716
|
-
await time_out_assert(
|
|
2716
|
+
await time_out_assert(600, check_nodes_in_sync)
|
|
2717
2717
|
peak = full_node_2.full_node.blockchain.get_peak()
|
|
2718
2718
|
assert peak is not None
|
|
2719
2719
|
print(f"peak: {str(peak.header_hash)[:6]}")
|
|
@@ -2950,7 +2950,13 @@ async def test_declare_proof_of_space_no_overflow(
|
|
|
2950
2950
|
assert full_node_api.full_node.blockchain.get_peak_height() == blocks[-1].height
|
|
2951
2951
|
for i in range(10, 100):
|
|
2952
2952
|
sb = await add_tx_to_mempool(
|
|
2953
|
-
full_node_api,
|
|
2953
|
+
full_node_api,
|
|
2954
|
+
dummy_peer,
|
|
2955
|
+
wallet,
|
|
2956
|
+
blocks[-8],
|
|
2957
|
+
coinbase_puzzlehash,
|
|
2958
|
+
bytes32(i.to_bytes(32, "big")),
|
|
2959
|
+
uint64(i),
|
|
2954
2960
|
)
|
|
2955
2961
|
blocks = bt.get_consecutive_blocks(
|
|
2956
2962
|
block_list_input=blocks,
|
|
@@ -2994,7 +3000,13 @@ async def test_declare_proof_of_space_overflow(
|
|
|
2994
3000
|
assert full_node_api.full_node.blockchain.get_peak_height() == blocks[-1].height
|
|
2995
3001
|
for i in range(10, 100):
|
|
2996
3002
|
sb = await add_tx_to_mempool(
|
|
2997
|
-
full_node_api,
|
|
3003
|
+
full_node_api,
|
|
3004
|
+
dummy_peer,
|
|
3005
|
+
wallet,
|
|
3006
|
+
blocks[-8],
|
|
3007
|
+
coinbase_puzzlehash,
|
|
3008
|
+
bytes32(i.to_bytes(32, "big")),
|
|
3009
|
+
uint64(i),
|
|
2998
3010
|
)
|
|
2999
3011
|
|
|
3000
3012
|
blocks = bt.get_consecutive_blocks(
|
|
@@ -3224,12 +3236,15 @@ async def declare_pos_unfinished_block(
|
|
|
3224
3236
|
include_signature_source_data=True,
|
|
3225
3237
|
)
|
|
3226
3238
|
await full_node_api.declare_proof_of_space(pospace, dummy_peer)
|
|
3227
|
-
|
|
3239
|
+
tx_peak = blockchain.get_tx_peak()
|
|
3240
|
+
assert tx_peak is not None
|
|
3241
|
+
q_str: bytes32 | None = verify_and_get_quality_string(
|
|
3228
3242
|
block.reward_chain_block.proof_of_space,
|
|
3229
3243
|
blockchain.constants,
|
|
3230
3244
|
challenge,
|
|
3231
3245
|
challenge_chain_sp,
|
|
3232
3246
|
height=block.reward_chain_block.height,
|
|
3247
|
+
prev_transaction_block_height=tx_peak.height,
|
|
3233
3248
|
)
|
|
3234
3249
|
assert q_str is not None
|
|
3235
3250
|
unfinised_block = None
|
|
@@ -3251,12 +3266,13 @@ async def declare_pos_unfinished_block(
|
|
|
3251
3266
|
|
|
3252
3267
|
async def add_tx_to_mempool(
|
|
3253
3268
|
full_node_api: FullNodeAPI,
|
|
3269
|
+
dummy_peer: WSChiaConnection,
|
|
3254
3270
|
wallet: WalletTool,
|
|
3255
3271
|
spend_block: FullBlock,
|
|
3256
3272
|
coinbase_puzzlehash: bytes32,
|
|
3257
3273
|
receiver_puzzlehash: bytes32,
|
|
3258
3274
|
amount: uint64,
|
|
3259
|
-
) ->
|
|
3275
|
+
) -> SpendBundle | None:
|
|
3260
3276
|
spend_coin = None
|
|
3261
3277
|
coins = spend_block.get_included_reward_coins()
|
|
3262
3278
|
for coin in coins:
|
|
@@ -3266,7 +3282,7 @@ async def add_tx_to_mempool(
|
|
|
3266
3282
|
assert spend_coin is not None
|
|
3267
3283
|
spend_bundle = wallet.generate_signed_transaction(amount, receiver_puzzlehash, spend_coin)
|
|
3268
3284
|
assert spend_bundle is not None
|
|
3269
|
-
response_msg = await full_node_api.send_transaction(wallet_protocol.SendTransaction(spend_bundle))
|
|
3285
|
+
response_msg = await full_node_api.send_transaction(wallet_protocol.SendTransaction(spend_bundle), dummy_peer)
|
|
3270
3286
|
assert (
|
|
3271
3287
|
response_msg is not None
|
|
3272
3288
|
and TransactionAck.from_bytes(response_msg.data).status == MempoolInclusionStatus.SUCCESS.value
|
|
@@ -3309,7 +3325,11 @@ def compare_unfinished_blocks(block1: UnfinishedBlock, block2: UnfinishedBlock)
|
|
|
3309
3325
|
],
|
|
3310
3326
|
)
|
|
3311
3327
|
async def test_pending_tx_cache_retry_on_new_peak(
|
|
3312
|
-
condition: ConditionOpcode,
|
|
3328
|
+
condition: ConditionOpcode,
|
|
3329
|
+
error: str,
|
|
3330
|
+
blockchain_constants: ConsensusConstants,
|
|
3331
|
+
caplog: pytest.LogCaptureFixture,
|
|
3332
|
+
self_hostname: str,
|
|
3313
3333
|
) -> None:
|
|
3314
3334
|
"""
|
|
3315
3335
|
Covers PendingTXCache items that are placed there due to unmet relative or
|
|
@@ -3322,7 +3342,9 @@ async def test_pending_tx_cache_retry_on_new_peak(
|
|
|
3322
3342
|
wallet = WalletTool(test_constants)
|
|
3323
3343
|
ph = wallet.get_new_puzzlehash()
|
|
3324
3344
|
blocks = bt.get_consecutive_blocks(
|
|
3325
|
-
3,
|
|
3345
|
+
3,
|
|
3346
|
+
guarantee_transaction_block=True,
|
|
3347
|
+
farmer_reward_puzzle_hash=ph,
|
|
3326
3348
|
)
|
|
3327
3349
|
for block in blocks:
|
|
3328
3350
|
await full_node_api.full_node.add_block(block)
|
|
@@ -3330,7 +3352,7 @@ async def test_pending_tx_cache_retry_on_new_peak(
|
|
|
3330
3352
|
assert peak is not None
|
|
3331
3353
|
current_height = peak.height
|
|
3332
3354
|
# Create a transaction with a height condition that makes it pending
|
|
3333
|
-
coin = blocks[-1]
|
|
3355
|
+
coin = find_reward_coin(blocks[-1], ph)
|
|
3334
3356
|
if condition == ConditionOpcode.ASSERT_HEIGHT_RELATIVE:
|
|
3335
3357
|
condition_height = 1
|
|
3336
3358
|
else:
|
|
@@ -3339,7 +3361,9 @@ async def test_pending_tx_cache_retry_on_new_peak(
|
|
|
3339
3361
|
sb = wallet.generate_signed_transaction(uint64(42), ph, coin, condition_dic)
|
|
3340
3362
|
sb_name = sb.name()
|
|
3341
3363
|
# Send the transaction
|
|
3342
|
-
|
|
3364
|
+
_, dummy_node_id = await add_dummy_connection(full_node_api.server, self_hostname, 12312)
|
|
3365
|
+
dummy_peer = full_node_api.server.all_connections[dummy_node_id]
|
|
3366
|
+
res = await full_node_api.send_transaction(SendTransaction(sb), dummy_peer)
|
|
3343
3367
|
assert res is not None
|
|
3344
3368
|
assert ProtocolMessageTypes(res.type) == ProtocolMessageTypes.transaction_ack
|
|
3345
3369
|
transaction_ack = TransactionAck.from_bytes(res.data)
|
|
@@ -3357,3 +3381,182 @@ async def test_pending_tx_cache_retry_on_new_peak(
|
|
|
3357
3381
|
assert f"Added transaction to mempool: {sb_name}\n" in caplog.text
|
|
3358
3382
|
# Make sure the transaction was retried and got added to the mempool
|
|
3359
3383
|
assert full_node_api.full_node.mempool_manager.get_mempool_item(sb_name, include_pending=False) is not None
|
|
3384
|
+
|
|
3385
|
+
|
|
3386
|
+
@pytest.mark.anyio
|
|
3387
|
+
@pytest.mark.parametrize("mismatch_cost", [True, False])
|
|
3388
|
+
@pytest.mark.parametrize("mismatch_fee", [True, False])
|
|
3389
|
+
@pytest.mark.parametrize("tx_already_seen", [True, False])
|
|
3390
|
+
@pytest.mark.parametrize("mismatch_on_reannounce", [True, False])
|
|
3391
|
+
async def test_ban_for_mismatched_tx_cost_fee(
|
|
3392
|
+
three_nodes: list[FullNodeAPI],
|
|
3393
|
+
bt: BlockTools,
|
|
3394
|
+
self_hostname: str,
|
|
3395
|
+
mismatch_cost: bool,
|
|
3396
|
+
mismatch_fee: bool,
|
|
3397
|
+
tx_already_seen: bool,
|
|
3398
|
+
mismatch_on_reannounce: bool,
|
|
3399
|
+
) -> None:
|
|
3400
|
+
"""
|
|
3401
|
+
Tests that a peer gets banned if it sends a `NewTransaction` message with a
|
|
3402
|
+
cost and/or fee that doesn't match the transaction's validation cost/fee.
|
|
3403
|
+
We setup full nodes, and with `tx_already_seen` we control whether the
|
|
3404
|
+
first full node has this transaction already or it needs to request it.
|
|
3405
|
+
In both cases we check the transaction's validation cost and fee against
|
|
3406
|
+
the ones specified in the `NewTransaction` message.
|
|
3407
|
+
With `mismatch_on_reannounce` we control whether the peer sent us the same
|
|
3408
|
+
transaction twice with different cost and fee.
|
|
3409
|
+
"""
|
|
3410
|
+
full_node_1, full_node_2, full_node_3 = three_nodes
|
|
3411
|
+
server_1 = full_node_1.full_node.server
|
|
3412
|
+
server_2 = full_node_2.full_node.server
|
|
3413
|
+
server_3 = full_node_3.full_node.server
|
|
3414
|
+
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
3415
|
+
await server_3.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_3.full_node.on_connect)
|
|
3416
|
+
ws_con_1 = next(iter(server_1.all_connections.values()))
|
|
3417
|
+
ws_con_2 = next(iter(server_2.all_connections.values()))
|
|
3418
|
+
ws_con_3 = next(iter(server_3.all_connections.values()))
|
|
3419
|
+
wallet = WalletTool(test_constants)
|
|
3420
|
+
wallet_ph = wallet.get_new_puzzlehash()
|
|
3421
|
+
# If we're covering that the first full node has this transaction already
|
|
3422
|
+
# we must add it accordingly, otherwise we'll add it to the second node so
|
|
3423
|
+
# that the first node requests it, reacting to the NewTransaction message.
|
|
3424
|
+
if tx_already_seen:
|
|
3425
|
+
node = full_node_1.full_node
|
|
3426
|
+
ws_con = ws_con_1
|
|
3427
|
+
else:
|
|
3428
|
+
node = full_node_2.full_node
|
|
3429
|
+
ws_con = ws_con_2
|
|
3430
|
+
blocks = bt.get_consecutive_blocks(3, guarantee_transaction_block=True, farmer_reward_puzzle_hash=wallet_ph)
|
|
3431
|
+
for block in blocks:
|
|
3432
|
+
await node.add_block(block)
|
|
3433
|
+
# Create a transaction and add it to the relevant full node's mempool
|
|
3434
|
+
coin = find_reward_coin(blocks[-1], wallet_ph)
|
|
3435
|
+
sb = wallet.generate_signed_transaction(uint64(42), wallet_ph, coin)
|
|
3436
|
+
sb_name = sb.name()
|
|
3437
|
+
await node.add_transaction(sb, sb_name, ws_con)
|
|
3438
|
+
mempool_item = node.mempool_manager.get_mempool_item(sb_name)
|
|
3439
|
+
assert mempool_item is not None
|
|
3440
|
+
# Now send a NewTransaction with a cost and/or fee mismatch from the second
|
|
3441
|
+
# full node.
|
|
3442
|
+
cost = uint64(mempool_item.cost + 1) if mismatch_cost else mempool_item.cost
|
|
3443
|
+
fee = uint64(mempool_item.fee + 1) if mismatch_fee else mempool_item.fee
|
|
3444
|
+
msg = make_msg(ProtocolMessageTypes.new_transaction, NewTransaction(mempool_item.name, cost, fee))
|
|
3445
|
+
# We won't ban localhost, so let's set a different ip address for the
|
|
3446
|
+
# second node.
|
|
3447
|
+
full_node_2_ip = "1.3.3.7"
|
|
3448
|
+
ws_con_1.peer_info = PeerInfo(full_node_2_ip, ws_con_1.peer_info.port)
|
|
3449
|
+
|
|
3450
|
+
# Send the NewTransaction message from the second node to the first
|
|
3451
|
+
async def send_from_node_2() -> None:
|
|
3452
|
+
await ws_con_2.send_message(msg)
|
|
3453
|
+
|
|
3454
|
+
# Send this message from the third node as well, just to end up with two
|
|
3455
|
+
# peers advertising the same transaction at the same time.
|
|
3456
|
+
async def send_from_node_3() -> None:
|
|
3457
|
+
await ws_con_3.send_message(msg)
|
|
3458
|
+
|
|
3459
|
+
for node in [full_node_1.full_node, full_node_2.full_node, full_node_3.full_node]:
|
|
3460
|
+
await time_out_assert(5, node.synced)
|
|
3461
|
+
await asyncio.gather(send_from_node_2(), send_from_node_3())
|
|
3462
|
+
if mismatch_on_reannounce and (mismatch_cost or mismatch_fee):
|
|
3463
|
+
# Send a second NewTransaction that doesn't match the first
|
|
3464
|
+
reannounce_cost = uint64(cost + 1) if mismatch_cost else cost
|
|
3465
|
+
reannounce_fee = uint64(fee + 1) if mismatch_fee else fee
|
|
3466
|
+
reannounce_msg = make_msg(
|
|
3467
|
+
ProtocolMessageTypes.new_transaction, NewTransaction(mempool_item.name, reannounce_cost, reannounce_fee)
|
|
3468
|
+
)
|
|
3469
|
+
await ws_con_2.send_message(reannounce_msg)
|
|
3470
|
+
# Make sure the peer is banned as it sent the same transaction twice
|
|
3471
|
+
# with different cost and/or fee.
|
|
3472
|
+
await time_out_assert(5, lambda: full_node_2_ip in server_1.banned_peers)
|
|
3473
|
+
return
|
|
3474
|
+
if not tx_already_seen:
|
|
3475
|
+
# When the first full node receives the NewTransaction message and it
|
|
3476
|
+
# hasn't seen the transaction before, it will issue a transaction
|
|
3477
|
+
# request. We need to wait until it receives the transaction and add it
|
|
3478
|
+
# to its mempool.
|
|
3479
|
+
await time_out_assert(30, lambda: full_node_1.full_node.mempool_manager.seen(mempool_item.name))
|
|
3480
|
+
# Make sure the first full node has banned the second as the item it has
|
|
3481
|
+
# already seen has a different validation cost and/or fee than the one from
|
|
3482
|
+
# the NewTransaction message.
|
|
3483
|
+
if mismatch_cost or mismatch_fee:
|
|
3484
|
+
await time_out_assert(5, lambda: full_node_2_ip in server_1.banned_peers)
|
|
3485
|
+
else:
|
|
3486
|
+
await time_out_assert(5, lambda: full_node_2_ip not in server_1.banned_peers)
|
|
3487
|
+
|
|
3488
|
+
|
|
3489
|
+
@pytest.mark.anyio
|
|
3490
|
+
async def test_new_tx_zero_cost(
|
|
3491
|
+
setup_two_nodes_fixture: tuple[list[FullNodeSimulator], list[tuple[WalletNode, ChiaServer]], BlockTools],
|
|
3492
|
+
self_hostname: str,
|
|
3493
|
+
) -> None:
|
|
3494
|
+
"""
|
|
3495
|
+
Tests that a peer gets banned if it sends a `NewTransaction` message with
|
|
3496
|
+
zero cost.
|
|
3497
|
+
"""
|
|
3498
|
+
[full_node_1, full_node_2], _, bt = setup_two_nodes_fixture
|
|
3499
|
+
server_1 = full_node_1.full_node.server
|
|
3500
|
+
server_2 = full_node_2.full_node.server
|
|
3501
|
+
await server_2.start_client(PeerInfo(self_hostname, server_1.get_port()), full_node_2.full_node.on_connect)
|
|
3502
|
+
ws_con_1 = next(iter(server_1.all_connections.values()))
|
|
3503
|
+
ws_con_2 = next(iter(server_2.all_connections.values()))
|
|
3504
|
+
await full_node_1.full_node.add_block(bt.get_consecutive_blocks(1)[0])
|
|
3505
|
+
# Send a NewTransaction with zero cost
|
|
3506
|
+
msg = make_msg(
|
|
3507
|
+
ProtocolMessageTypes.new_transaction, NewTransaction(bytes32.random(), cost=uint64(0), fees=uint64(42))
|
|
3508
|
+
)
|
|
3509
|
+
# We won't ban localhost, so let's set a different ip address for the
|
|
3510
|
+
# second node.
|
|
3511
|
+
full_node_2_ip = "1.3.3.7"
|
|
3512
|
+
ws_con_1.peer_info = PeerInfo(full_node_2_ip, ws_con_1.peer_info.port)
|
|
3513
|
+
await ws_con_2.send_message(msg)
|
|
3514
|
+
# Make sure the first full node has banned the second.
|
|
3515
|
+
await time_out_assert(3, lambda: full_node_2_ip in server_1.banned_peers)
|
|
3516
|
+
|
|
3517
|
+
|
|
3518
|
+
@pytest.mark.anyio
|
|
3519
|
+
@pytest.mark.limit_consensus_modes(allowed=[ConsensusMode.HARD_FORK_2_0], reason="save time")
|
|
3520
|
+
async def test_corrupt_blockchain(bt: BlockTools, default_400_blocks: list[FullBlock]) -> None:
|
|
3521
|
+
full_node = await FullNode.create(
|
|
3522
|
+
bt.config["full_node"],
|
|
3523
|
+
root_path=bt.root_path,
|
|
3524
|
+
consensus_constants=bt.constants,
|
|
3525
|
+
)
|
|
3526
|
+
|
|
3527
|
+
config = bt.config["full_node"]
|
|
3528
|
+
db_path_replaced: str = config["database_path"].replace("CHALLENGE", config["selected_network"])
|
|
3529
|
+
db_path = path_from_root(bt.root_path, db_path_replaced)
|
|
3530
|
+
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
3531
|
+
|
|
3532
|
+
await make_db(db_path, default_400_blocks)
|
|
3533
|
+
with contextlib.closing(sqlite3.connect(db_path)) as conn:
|
|
3534
|
+
conn.execute("DELETE FROM current_peak;")
|
|
3535
|
+
conn.commit()
|
|
3536
|
+
|
|
3537
|
+
with pytest.raises(RuntimeError, match="corrupt blockchain DB"):
|
|
3538
|
+
# the blockchain is empty (without a peak)
|
|
3539
|
+
# but there are coins in the coin store
|
|
3540
|
+
async with full_node.manage():
|
|
3541
|
+
pass # pragma: no cover
|
|
3542
|
+
|
|
3543
|
+
|
|
3544
|
+
@pytest.mark.anyio
|
|
3545
|
+
async def test_send_transaction_peer_tx_queue_full(
|
|
3546
|
+
one_node_one_block: tuple[FullNodeSimulator, ChiaServer, BlockTools], self_hostname: str
|
|
3547
|
+
) -> None:
|
|
3548
|
+
"""
|
|
3549
|
+
Covers the case where a peer's transaction queue is full and it sends a
|
|
3550
|
+
`SendTransaction` message. The full node should send the proper
|
|
3551
|
+
`TransactionAck` response with a correct error.
|
|
3552
|
+
"""
|
|
3553
|
+
full_node_api, server, _ = one_node_one_block
|
|
3554
|
+
# Set limit to 0 to trigger queue full exception
|
|
3555
|
+
full_node_api.full_node.transaction_queue.peer_size_limit = 0
|
|
3556
|
+
spend_bundle = SpendBundle([], G2Element())
|
|
3557
|
+
dummy_peer, _ = await add_dummy_connection_wsc(server, self_hostname, 1337, NodeType.WALLET)
|
|
3558
|
+
response_msg = await full_node_api.send_transaction(wallet_protocol.SendTransaction(spend_bundle), dummy_peer)
|
|
3559
|
+
assert response_msg is not None
|
|
3560
|
+
response = wallet_protocol.TransactionAck.from_bytes(response_msg.data)
|
|
3561
|
+
assert MempoolInclusionStatus(response.status) == MempoolInclusionStatus.FAILED
|
|
3562
|
+
assert response.error == "Transaction queue full"
|