chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__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_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 +59 -30
- 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 +225 -62
- 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 +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- 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 +963 -839
- 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 +8 -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 +43 -47
- 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 +4 -6
- 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 +14 -14
- 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 +372 -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 +16 -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 +42 -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 +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- 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 +34 -13
- 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 +3 -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 +22 -8
- 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 +120 -105
- 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.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- 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.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import contextlib
|
|
4
5
|
import logging
|
|
5
6
|
import time
|
|
6
|
-
from collections.abc import Awaitable, Collection
|
|
7
|
+
from collections.abc import AsyncIterator, Awaitable, Callable, Collection
|
|
7
8
|
from concurrent.futures import Executor, ThreadPoolExecutor
|
|
8
9
|
from dataclasses import dataclass, field
|
|
9
|
-
from
|
|
10
|
+
from types import TracebackType
|
|
11
|
+
from typing import TypeVar
|
|
10
12
|
|
|
11
13
|
from chia_rs import (
|
|
12
14
|
ELIGIBLE_FOR_DEDUP,
|
|
13
15
|
ELIGIBLE_FOR_FF,
|
|
14
16
|
MEMPOOL_MODE,
|
|
15
17
|
BLSCache,
|
|
18
|
+
CoinRecord,
|
|
16
19
|
ConsensusConstants,
|
|
17
20
|
SpendBundle,
|
|
18
21
|
SpendBundleConditions,
|
|
22
|
+
check_time_locks,
|
|
19
23
|
get_flags_for_height_and_constants,
|
|
20
24
|
supports_fast_forward,
|
|
21
25
|
validate_clvm_and_signature,
|
|
@@ -23,9 +27,9 @@ from chia_rs import (
|
|
|
23
27
|
from chia_rs.sized_bytes import bytes32
|
|
24
28
|
from chia_rs.sized_ints import uint32, uint64
|
|
25
29
|
from chiabip158 import PyBIP158
|
|
30
|
+
from typing_extensions import Self
|
|
26
31
|
|
|
27
32
|
from chia.consensus.block_record import BlockRecordProtocol
|
|
28
|
-
from chia.consensus.check_time_locks import check_time_locks
|
|
29
33
|
from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator
|
|
30
34
|
from chia.full_node.fee_estimation import FeeBlockInfo, MempoolInfo, MempoolItemInfo
|
|
31
35
|
from chia.full_node.fee_estimator_interface import FeeEstimatorInterface
|
|
@@ -33,7 +37,6 @@ from chia.full_node.mempool import MEMPOOL_ITEM_FEE_LIMIT, Mempool, MempoolRemov
|
|
|
33
37
|
from chia.full_node.pending_tx_cache import ConflictTxCache, PendingTxCache
|
|
34
38
|
from chia.types.blockchain_format.coin import Coin
|
|
35
39
|
from chia.types.clvm_cost import CLVMCost
|
|
36
|
-
from chia.types.coin_record import CoinRecord
|
|
37
40
|
from chia.types.fee_rate import FeeRate
|
|
38
41
|
from chia.types.generator_types import NewBlockGenerator
|
|
39
42
|
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
@@ -53,16 +56,16 @@ MEMPOOL_MIN_FEE_INCREASE = uint64(10000000)
|
|
|
53
56
|
class TimelockConditions:
|
|
54
57
|
assert_height: uint32 = uint32(0)
|
|
55
58
|
assert_seconds: uint64 = uint64(0)
|
|
56
|
-
assert_before_height:
|
|
57
|
-
assert_before_seconds:
|
|
59
|
+
assert_before_height: uint32 | None = None
|
|
60
|
+
assert_before_seconds: uint64 | None = None
|
|
58
61
|
|
|
59
62
|
|
|
60
63
|
@dataclass
|
|
61
64
|
class LineageInfoCache:
|
|
62
|
-
_fun: Callable[[bytes32], Awaitable[
|
|
63
|
-
_cache: dict[bytes32,
|
|
65
|
+
_fun: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]]
|
|
66
|
+
_cache: dict[bytes32, UnspentLineageInfo | None] = field(default_factory=dict)
|
|
64
67
|
|
|
65
|
-
async def get_unspent_lineage_info(self, puzzle_hash: bytes32) ->
|
|
68
|
+
async def get_unspent_lineage_info(self, puzzle_hash: bytes32) -> UnspentLineageInfo | None:
|
|
66
69
|
# we rely on KeyError to distinguish between a stored
|
|
67
70
|
# None value and a missing entry
|
|
68
71
|
try:
|
|
@@ -125,10 +128,10 @@ def compute_assert_height(
|
|
|
125
128
|
|
|
126
129
|
@dataclass
|
|
127
130
|
class SpendBundleAddInfo:
|
|
128
|
-
cost:
|
|
131
|
+
cost: uint64 | None
|
|
129
132
|
status: MempoolInclusionStatus
|
|
130
133
|
removals: list[MempoolRemoveInfo]
|
|
131
|
-
error:
|
|
134
|
+
error: Err | None
|
|
132
135
|
|
|
133
136
|
|
|
134
137
|
@dataclass
|
|
@@ -233,7 +236,7 @@ def check_removals(
|
|
|
233
236
|
bundle_coin_spends: dict[bytes32, BundleCoinSpend],
|
|
234
237
|
*,
|
|
235
238
|
get_items_by_coin_ids: Callable[[list[bytes32]], list[MempoolItem]],
|
|
236
|
-
) -> tuple[
|
|
239
|
+
) -> tuple[Err | None, list[MempoolItem]]:
|
|
237
240
|
"""
|
|
238
241
|
This function checks for double spends, unknown spends and conflicting transactions in mempool.
|
|
239
242
|
Returns Error (if any), the set of existing MempoolItems with conflicting spends (if any).
|
|
@@ -299,7 +302,7 @@ class MempoolManager:
|
|
|
299
302
|
constants: ConsensusConstants
|
|
300
303
|
seen_bundle_hashes: dict[bytes32, bytes32]
|
|
301
304
|
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]]
|
|
302
|
-
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[
|
|
305
|
+
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]]
|
|
303
306
|
nonzero_fee_minimum_fpc: int
|
|
304
307
|
mempool_max_total_cost: int
|
|
305
308
|
# a cache of MempoolItems that conflict with existing items in the pool
|
|
@@ -307,7 +310,9 @@ class MempoolManager:
|
|
|
307
310
|
# cache of MempoolItems with height conditions making them not valid yet
|
|
308
311
|
_pending_cache: PendingTxCache
|
|
309
312
|
seen_cache_size: int
|
|
310
|
-
peak
|
|
313
|
+
# the peak is only ever set to a transaction block. We use it to validate
|
|
314
|
+
# timelocks against, so it must have a timestamp.
|
|
315
|
+
peak: BlockRecordProtocol | None
|
|
311
316
|
mempool: Mempool
|
|
312
317
|
_worker_queue_size: int
|
|
313
318
|
max_block_clvm_cost: uint64
|
|
@@ -316,11 +321,11 @@ class MempoolManager:
|
|
|
316
321
|
def __init__(
|
|
317
322
|
self,
|
|
318
323
|
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
|
|
319
|
-
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[
|
|
324
|
+
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]],
|
|
320
325
|
consensus_constants: ConsensusConstants,
|
|
321
326
|
*,
|
|
322
327
|
single_threaded: bool = False,
|
|
323
|
-
max_tx_clvm_cost:
|
|
328
|
+
max_tx_clvm_cost: uint64 | None = None,
|
|
324
329
|
):
|
|
325
330
|
self.constants: ConsensusConstants = consensus_constants
|
|
326
331
|
|
|
@@ -356,7 +361,7 @@ class MempoolManager:
|
|
|
356
361
|
self.pool = ThreadPoolExecutor(max_workers=2, thread_name_prefix="mempool-")
|
|
357
362
|
|
|
358
363
|
# The mempool will correspond to a certain peak
|
|
359
|
-
self.peak:
|
|
364
|
+
self.peak: BlockRecordProtocol | None = None
|
|
360
365
|
self.fee_estimator: FeeEstimatorInterface = create_bitcoin_fee_estimator(self.max_block_clvm_cost)
|
|
361
366
|
mempool_info = MempoolInfo(
|
|
362
367
|
CLVMCost(uint64(self.mempool_max_total_cost)),
|
|
@@ -365,11 +370,45 @@ class MempoolManager:
|
|
|
365
370
|
)
|
|
366
371
|
self.mempool: Mempool = Mempool(mempool_info, self.fee_estimator)
|
|
367
372
|
|
|
373
|
+
@classmethod
|
|
374
|
+
@contextlib.asynccontextmanager
|
|
375
|
+
async def managed(
|
|
376
|
+
cls,
|
|
377
|
+
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
|
|
378
|
+
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]],
|
|
379
|
+
consensus_constants: ConsensusConstants,
|
|
380
|
+
single_threaded: bool = False,
|
|
381
|
+
max_tx_clvm_cost: uint64 | None = None,
|
|
382
|
+
) -> AsyncIterator[Self]:
|
|
383
|
+
self = cls(
|
|
384
|
+
get_coin_records,
|
|
385
|
+
get_unspent_lineage_info_for_puzzle_hash,
|
|
386
|
+
consensus_constants,
|
|
387
|
+
single_threaded=single_threaded,
|
|
388
|
+
max_tx_clvm_cost=max_tx_clvm_cost,
|
|
389
|
+
)
|
|
390
|
+
try:
|
|
391
|
+
yield self
|
|
392
|
+
finally:
|
|
393
|
+
self.shut_down()
|
|
394
|
+
|
|
368
395
|
def shut_down(self) -> None:
|
|
369
396
|
self.pool.shutdown(wait=True)
|
|
397
|
+
self.mempool.close()
|
|
398
|
+
|
|
399
|
+
def __enter__(self) -> Self:
|
|
400
|
+
return self
|
|
401
|
+
|
|
402
|
+
def __exit__(
|
|
403
|
+
self,
|
|
404
|
+
exc_type: type[BaseException] | None,
|
|
405
|
+
exc: BaseException | None,
|
|
406
|
+
traceback: TracebackType | None,
|
|
407
|
+
) -> None:
|
|
408
|
+
self.shut_down()
|
|
370
409
|
|
|
371
410
|
# TODO: remove this, use create_generator() instead
|
|
372
|
-
def create_bundle_from_mempool(self, last_tb_header_hash: bytes32) ->
|
|
411
|
+
def create_bundle_from_mempool(self, last_tb_header_hash: bytes32) -> tuple[SpendBundle, list[Coin]] | None:
|
|
373
412
|
"""
|
|
374
413
|
Returns aggregated spendbundle that can be used for creating new block,
|
|
375
414
|
additions and removals in that spend_bundle
|
|
@@ -378,7 +417,7 @@ class MempoolManager:
|
|
|
378
417
|
return None
|
|
379
418
|
return self.mempool.create_bundle_from_mempool_items(self.constants, self.peak.height)
|
|
380
419
|
|
|
381
|
-
def create_block_generator(self, last_tb_header_hash: bytes32, timeout: float) ->
|
|
420
|
+
def create_block_generator(self, last_tb_header_hash: bytes32, timeout: float) -> NewBlockGenerator | None:
|
|
382
421
|
"""
|
|
383
422
|
Returns a block generator program, the aggregate signature and all additions and removals, for a new block
|
|
384
423
|
"""
|
|
@@ -386,7 +425,7 @@ class MempoolManager:
|
|
|
386
425
|
return None
|
|
387
426
|
return self.mempool.create_block_generator(self.constants, self.peak.height, timeout)
|
|
388
427
|
|
|
389
|
-
def create_block_generator2(self, last_tb_header_hash: bytes32, timeout: float) ->
|
|
428
|
+
def create_block_generator2(self, last_tb_header_hash: bytes32, timeout: float) -> NewBlockGenerator | None:
|
|
390
429
|
"""
|
|
391
430
|
Returns a block generator program, the aggregate signature and all additions, for a new block
|
|
392
431
|
"""
|
|
@@ -435,7 +474,7 @@ class MempoolManager:
|
|
|
435
474
|
self.seen_bundle_hashes.pop(bundle_hash)
|
|
436
475
|
|
|
437
476
|
async def pre_validate_spendbundle(
|
|
438
|
-
self, spend_bundle: SpendBundle, spend_bundle_id:
|
|
477
|
+
self, spend_bundle: SpendBundle, spend_bundle_id: bytes32 | None = None, bls_cache: BLSCache | None = None
|
|
439
478
|
) -> SpendBundleConditions:
|
|
440
479
|
"""
|
|
441
480
|
Errors are included within the cached_result.
|
|
@@ -469,6 +508,12 @@ class MempoolManager:
|
|
|
469
508
|
finally:
|
|
470
509
|
self._worker_queue_size -= 1
|
|
471
510
|
|
|
511
|
+
if sbc.num_atoms > sbc.cost * 60_000_000 / self.constants.MAX_BLOCK_COST_CLVM:
|
|
512
|
+
raise ValidationError(Err.INVALID_SPEND_BUNDLE, "too many atoms")
|
|
513
|
+
|
|
514
|
+
if sbc.num_pairs > sbc.cost * 60_000_000 / self.constants.MAX_BLOCK_COST_CLVM:
|
|
515
|
+
raise ValidationError(Err.INVALID_SPEND_BUNDLE, "too many pairs")
|
|
516
|
+
|
|
472
517
|
if bls_cache is not None:
|
|
473
518
|
bls_cache.update(new_cache_entries)
|
|
474
519
|
|
|
@@ -488,10 +533,9 @@ class MempoolManager:
|
|
|
488
533
|
conds: SpendBundleConditions,
|
|
489
534
|
spend_name: bytes32,
|
|
490
535
|
first_added_height: uint32,
|
|
491
|
-
get_coin_records:
|
|
492
|
-
get_unspent_lineage_info_for_puzzle_hash:
|
|
493
|
-
|
|
494
|
-
] = None,
|
|
536
|
+
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]] | None = None,
|
|
537
|
+
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]]
|
|
538
|
+
| None = None,
|
|
495
539
|
) -> SpendBundleAddInfo:
|
|
496
540
|
"""
|
|
497
541
|
Validates and adds to mempool a new_spend with the given
|
|
@@ -561,8 +605,8 @@ class MempoolManager:
|
|
|
561
605
|
spend_name: bytes32,
|
|
562
606
|
first_added_height: uint32,
|
|
563
607
|
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
|
|
564
|
-
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[
|
|
565
|
-
) -> tuple[
|
|
608
|
+
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[UnspentLineageInfo | None]],
|
|
609
|
+
) -> tuple[Err | None, MempoolItem | None, list[bytes32]]:
|
|
566
610
|
"""
|
|
567
611
|
Validates new_spend with the given SpendBundleConditions, and
|
|
568
612
|
spend_name, and the current mempool. The mempool should
|
|
@@ -724,12 +768,15 @@ class MempoolManager:
|
|
|
724
768
|
# point-of-view of the next block to be farmed. Therefore we pass in the
|
|
725
769
|
# current peak's height and timestamp
|
|
726
770
|
assert self.peak.timestamp is not None
|
|
727
|
-
|
|
771
|
+
tl_error_rust: int | None = check_time_locks(
|
|
728
772
|
removal_record_dict,
|
|
729
773
|
conds,
|
|
730
774
|
self.peak.height,
|
|
731
775
|
self.peak.timestamp,
|
|
732
776
|
)
|
|
777
|
+
tl_error: Err | None = None
|
|
778
|
+
if tl_error_rust is not None:
|
|
779
|
+
tl_error = Err(tl_error_rust)
|
|
733
780
|
|
|
734
781
|
timelocks: TimelockConditions = compute_assert_height(removal_record_dict, conds)
|
|
735
782
|
|
|
@@ -777,14 +824,14 @@ class MempoolManager:
|
|
|
777
824
|
|
|
778
825
|
return None, potential, [item.name for item in conflicts]
|
|
779
826
|
|
|
780
|
-
def get_spendbundle(self, bundle_hash: bytes32) ->
|
|
827
|
+
def get_spendbundle(self, bundle_hash: bytes32) -> SpendBundle | None:
|
|
781
828
|
"""Returns a full SpendBundle if it's inside one the mempools"""
|
|
782
|
-
item:
|
|
829
|
+
item: MempoolItem | None = self.mempool.get_item_by_id(bundle_hash)
|
|
783
830
|
if item is not None:
|
|
784
831
|
return item.to_spend_bundle()
|
|
785
832
|
return None
|
|
786
833
|
|
|
787
|
-
def get_mempool_item(self, bundle_hash: bytes32, include_pending: bool = False) ->
|
|
834
|
+
def get_mempool_item(self, bundle_hash: bytes32, include_pending: bool = False) -> MempoolItem | None:
|
|
788
835
|
"""
|
|
789
836
|
Returns the MempoolItem in the mempool that matches the provided spend bundle hash (id)
|
|
790
837
|
or None if not found.
|
|
@@ -800,9 +847,7 @@ class MempoolManager:
|
|
|
800
847
|
|
|
801
848
|
return item
|
|
802
849
|
|
|
803
|
-
async def new_peak(
|
|
804
|
-
self, new_peak: Optional[BlockRecordProtocol], spent_coins: Optional[list[bytes32]]
|
|
805
|
-
) -> NewPeakInfo:
|
|
850
|
+
async def new_peak(self, new_peak: BlockRecordProtocol | None, spent_coins: list[bytes32] | None) -> NewPeakInfo:
|
|
806
851
|
"""
|
|
807
852
|
Called when a new peak is available, we try to recreate a mempool for the new tip.
|
|
808
853
|
new_peak should always be the most recent *transaction* block of the chain. Since
|
|
@@ -967,6 +1012,8 @@ class MempoolManager:
|
|
|
967
1012
|
# Item is most likely included in the block.
|
|
968
1013
|
included_items.append(MempoolItemInfo(item.cost, item.fee, item.height_added_to_mempool))
|
|
969
1014
|
|
|
1015
|
+
old_pool.close()
|
|
1016
|
+
|
|
970
1017
|
potential_txs = self._pending_cache.drain(new_peak.height)
|
|
971
1018
|
potential_txs.update(self._conflict_cache.drain())
|
|
972
1019
|
txs_added = []
|
|
@@ -992,8 +1039,8 @@ class MempoolManager:
|
|
|
992
1039
|
log.log(logging.WARNING if duration > 1 else logging.INFO, f"new_peak() took {duration:0.2f} seconds")
|
|
993
1040
|
return NewPeakInfo(txs_added, mempool_item_removals)
|
|
994
1041
|
|
|
995
|
-
def get_items_not_in_filter(self, mempool_filter: PyBIP158, limit: int = 100) -> list[
|
|
996
|
-
items: list[
|
|
1042
|
+
def get_items_not_in_filter(self, mempool_filter: PyBIP158, limit: int = 100) -> list[MempoolItem]:
|
|
1043
|
+
items: list[MempoolItem] = []
|
|
997
1044
|
|
|
998
1045
|
assert limit > 0
|
|
999
1046
|
|
|
@@ -1003,7 +1050,7 @@ class MempoolManager:
|
|
|
1003
1050
|
return items
|
|
1004
1051
|
if mempool_filter.Match(bytearray(item.spend_bundle_name)):
|
|
1005
1052
|
continue
|
|
1006
|
-
items.append(item
|
|
1053
|
+
items.append(item)
|
|
1007
1054
|
|
|
1008
1055
|
return items
|
|
1009
1056
|
|
|
@@ -1011,11 +1058,11 @@ class MempoolManager:
|
|
|
1011
1058
|
T = TypeVar("T", uint32, uint64)
|
|
1012
1059
|
|
|
1013
1060
|
|
|
1014
|
-
def optional_min(a:
|
|
1061
|
+
def optional_min(a: T | None, b: T | None) -> T | None:
|
|
1015
1062
|
return min((v for v in [a, b] if v is not None), default=None)
|
|
1016
1063
|
|
|
1017
1064
|
|
|
1018
|
-
def optional_max(a:
|
|
1065
|
+
def optional_max(a: T | None, b: T | None) -> T | None:
|
|
1019
1066
|
return max((v for v in [a, b] if v is not None), default=None)
|
|
1020
1067
|
|
|
1021
1068
|
|
|
@@ -1029,9 +1076,9 @@ def can_replace(conflicting_items: list[MempoolItem], new_item: MempoolItem) ->
|
|
|
1029
1076
|
|
|
1030
1077
|
conflicting_fees = 0
|
|
1031
1078
|
conflicting_cost = 0
|
|
1032
|
-
assert_height:
|
|
1033
|
-
assert_before_height:
|
|
1034
|
-
assert_before_seconds:
|
|
1079
|
+
assert_height: uint32 | None = None
|
|
1080
|
+
assert_before_height: uint32 | None = None
|
|
1081
|
+
assert_before_seconds: uint64 | None = None
|
|
1035
1082
|
# we don't allow replacing mempool items with new ones that remove
|
|
1036
1083
|
# eligibility for dedup and fast-forward. Doing so could be abused by
|
|
1037
1084
|
# denying such spends from operating as intended
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from chia_rs.sized_bytes import bytes32
|
|
7
6
|
from chia_rs.sized_ints import uint32
|
|
@@ -17,7 +16,7 @@ class ConflictTxCache:
|
|
|
17
16
|
_cache_cost: int = field(default=0, init=False)
|
|
18
17
|
_txs: dict[bytes32, MempoolItem] = field(default_factory=dict, init=False)
|
|
19
18
|
|
|
20
|
-
def get(self, bundle_name: bytes32) ->
|
|
19
|
+
def get(self, bundle_name: bytes32) -> MempoolItem | None:
|
|
21
20
|
return self._txs.get(bundle_name, None)
|
|
22
21
|
|
|
23
22
|
def add(self, item: MempoolItem) -> None:
|
|
@@ -56,7 +55,7 @@ class PendingTxCache:
|
|
|
56
55
|
_txs: dict[bytes32, MempoolItem] = field(default_factory=dict, init=False)
|
|
57
56
|
_by_height: SortedDict[uint32, dict[bytes32, MempoolItem]] = field(default_factory=SortedDict, init=False)
|
|
58
57
|
|
|
59
|
-
def get(self, bundle_name: bytes32) ->
|
|
58
|
+
def get(self, bundle_name: bytes32) -> MempoolItem | None:
|
|
60
59
|
return self._txs.get(bundle_name, None)
|
|
61
60
|
|
|
62
61
|
def add(self, item: MempoolItem) -> None:
|
|
@@ -4,12 +4,12 @@ import os
|
|
|
4
4
|
import pathlib
|
|
5
5
|
import sys
|
|
6
6
|
from multiprocessing import freeze_support
|
|
7
|
-
from typing import Any
|
|
7
|
+
from typing import Any
|
|
8
8
|
|
|
9
9
|
from chia_rs import ConsensusConstants
|
|
10
10
|
from chia_rs.sized_ints import uint16
|
|
11
11
|
|
|
12
|
-
from chia.apis import
|
|
12
|
+
from chia.apis import StubMetadataRegistry
|
|
13
13
|
from chia.consensus.constants import replace_str_to_bytes
|
|
14
14
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS, update_testnet_overrides
|
|
15
15
|
from chia.full_node.full_node import FullNode
|
|
@@ -36,7 +36,7 @@ async def create_full_node_service(
|
|
|
36
36
|
config: dict[str, Any],
|
|
37
37
|
consensus_constants: ConsensusConstants,
|
|
38
38
|
connect_to_daemon: bool = True,
|
|
39
|
-
override_capabilities:
|
|
39
|
+
override_capabilities: list[tuple[uint16, str]] | None = None,
|
|
40
40
|
) -> FullNodeService:
|
|
41
41
|
service_config = config[SERVICE_NAME]
|
|
42
42
|
|
|
@@ -52,7 +52,7 @@ async def create_full_node_service(
|
|
|
52
52
|
)
|
|
53
53
|
peer_api = FullNodeAPI(node)
|
|
54
54
|
|
|
55
|
-
rpc_info:
|
|
55
|
+
rpc_info: RpcInfo[FullNodeRpcApi] | None = None
|
|
56
56
|
if service_config.get("start_rpc_server", True):
|
|
57
57
|
rpc_info = (FullNodeRpcApi, service_config["rpc_port"])
|
|
58
58
|
|
|
@@ -71,7 +71,7 @@ async def create_full_node_service(
|
|
|
71
71
|
rpc_info=rpc_info,
|
|
72
72
|
connect_to_daemon=connect_to_daemon,
|
|
73
73
|
override_capabilities=override_capabilities,
|
|
74
|
-
|
|
74
|
+
stub_metadata_for_type=StubMetadataRegistry,
|
|
75
75
|
)
|
|
76
76
|
|
|
77
77
|
|
chia/full_node/sync_store.py
CHANGED
|
@@ -6,7 +6,6 @@ import logging
|
|
|
6
6
|
from collections import OrderedDict
|
|
7
7
|
from collections import OrderedDict as orderedDict
|
|
8
8
|
from dataclasses import dataclass, field
|
|
9
|
-
from typing import Optional
|
|
10
9
|
|
|
11
10
|
import typing_extensions
|
|
12
11
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -33,7 +32,7 @@ class SyncStore:
|
|
|
33
32
|
# peer node id : Peak
|
|
34
33
|
peer_to_peak: dict[bytes32, Peak] = field(default_factory=dict)
|
|
35
34
|
# Peak we are syncing towards
|
|
36
|
-
target_peak:
|
|
35
|
+
target_peak: Peak | None = None
|
|
37
36
|
peers_changed: asyncio.Event = field(default_factory=asyncio.Event)
|
|
38
37
|
# Set of nodes which we are batch syncing from
|
|
39
38
|
batch_syncing: set[bytes32] = field(default_factory=set)
|
|
@@ -103,7 +102,7 @@ class SyncStore:
|
|
|
103
102
|
ret[peer_id] = peak
|
|
104
103
|
return ret
|
|
105
104
|
|
|
106
|
-
def get_heaviest_peak(self) ->
|
|
105
|
+
def get_heaviest_peak(self) -> Peak | None:
|
|
107
106
|
"""
|
|
108
107
|
Returns: the header_hash, height, and weight of the heaviest block that one of our peers has notified
|
|
109
108
|
us of.
|
|
@@ -111,7 +110,7 @@ class SyncStore:
|
|
|
111
110
|
|
|
112
111
|
if len(self.peer_to_peak) == 0:
|
|
113
112
|
return None
|
|
114
|
-
heaviest_peak:
|
|
113
|
+
heaviest_peak: Peak | None = None
|
|
115
114
|
for peak in self.peer_to_peak.values():
|
|
116
115
|
if peak.header_hash not in self.peak_to_peer:
|
|
117
116
|
continue
|
|
@@ -4,11 +4,12 @@ import asyncio
|
|
|
4
4
|
import dataclasses
|
|
5
5
|
import logging
|
|
6
6
|
from dataclasses import dataclass, field
|
|
7
|
-
from queue import SimpleQueue
|
|
8
|
-
from typing import ClassVar, Generic,
|
|
7
|
+
from queue import PriorityQueue, SimpleQueue
|
|
8
|
+
from typing import ClassVar, Generic, TypeVar
|
|
9
9
|
|
|
10
10
|
from chia_rs import SpendBundle
|
|
11
11
|
from chia_rs.sized_bytes import bytes32
|
|
12
|
+
from chia_rs.sized_ints import uint64
|
|
12
13
|
|
|
13
14
|
from chia.server.ws_connection import WSChiaConnection
|
|
14
15
|
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
@@ -30,7 +31,7 @@ class ValuedEvent(Generic[T]):
|
|
|
30
31
|
_value_sentinel: ClassVar[ValuedEventSentinel] = ValuedEventSentinel()
|
|
31
32
|
|
|
32
33
|
_event: asyncio.Event = dataclasses.field(default_factory=asyncio.Event)
|
|
33
|
-
_value:
|
|
34
|
+
_value: ValuedEventSentinel | T = _value_sentinel
|
|
34
35
|
|
|
35
36
|
def set(self, value: T) -> None:
|
|
36
37
|
if not isinstance(self._value, ValuedEventSentinel):
|
|
@@ -45,18 +46,28 @@ class ValuedEvent(Generic[T]):
|
|
|
45
46
|
return self._value
|
|
46
47
|
|
|
47
48
|
|
|
48
|
-
@dataclass(frozen=True)
|
|
49
|
+
@dataclasses.dataclass(frozen=True)
|
|
50
|
+
class PeerWithTx:
|
|
51
|
+
peer_host: str
|
|
52
|
+
advertised_fee: uint64
|
|
53
|
+
advertised_cost: uint64
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass(frozen=True, order=True)
|
|
49
57
|
class TransactionQueueEntry:
|
|
50
58
|
"""
|
|
51
59
|
A transaction received from peer. This is put into a queue, and not yet in the mempool.
|
|
52
60
|
"""
|
|
53
61
|
|
|
54
62
|
transaction: SpendBundle = field(compare=False)
|
|
55
|
-
transaction_bytes:
|
|
63
|
+
transaction_bytes: bytes | None = field(compare=False)
|
|
56
64
|
spend_name: bytes32
|
|
57
|
-
peer:
|
|
65
|
+
peer: WSChiaConnection | None = field(compare=False)
|
|
58
66
|
test: bool = field(compare=False)
|
|
59
|
-
|
|
67
|
+
# IDs of peers that advertised this transaction via new_transaction, along
|
|
68
|
+
# with their hostname, fee and cost.
|
|
69
|
+
peers_with_tx: dict[bytes32, PeerWithTx] = field(default_factory=dict, compare=False)
|
|
70
|
+
done: ValuedEvent[tuple[MempoolInclusionStatus, Err | None]] = field(
|
|
60
71
|
default_factory=ValuedEvent,
|
|
61
72
|
compare=False,
|
|
62
73
|
)
|
|
@@ -74,7 +85,7 @@ class TransactionQueue:
|
|
|
74
85
|
_list_cursor: int # this is which index
|
|
75
86
|
_queue_length: asyncio.Semaphore
|
|
76
87
|
_index_to_peer_map: list[bytes32]
|
|
77
|
-
_queue_dict: dict[bytes32,
|
|
88
|
+
_queue_dict: dict[bytes32, PriorityQueue[tuple[float, TransactionQueueEntry]]]
|
|
78
89
|
_high_priority_queue: SimpleQueue[TransactionQueueEntry]
|
|
79
90
|
peer_size_limit: int
|
|
80
91
|
log: logging.Logger
|
|
@@ -88,15 +99,25 @@ class TransactionQueue:
|
|
|
88
99
|
self.peer_size_limit = peer_size_limit
|
|
89
100
|
self.log = log
|
|
90
101
|
|
|
91
|
-
|
|
102
|
+
def put(self, tx: TransactionQueueEntry, peer_id: bytes32 | None, high_priority: bool = False) -> None:
|
|
92
103
|
if peer_id is None or high_priority: # when it's local there is no peer_id.
|
|
93
104
|
self._high_priority_queue.put(tx)
|
|
94
105
|
else:
|
|
95
106
|
if peer_id not in self._queue_dict:
|
|
96
|
-
self._queue_dict[peer_id] =
|
|
107
|
+
self._queue_dict[peer_id] = PriorityQueue()
|
|
97
108
|
self._index_to_peer_map.append(peer_id)
|
|
98
109
|
if self._queue_dict[peer_id].qsize() < self.peer_size_limit:
|
|
99
|
-
|
|
110
|
+
tx_info = tx.peers_with_tx.get(peer_id)
|
|
111
|
+
if tx_info is not None and tx_info.advertised_cost > 0:
|
|
112
|
+
fpc = tx_info.advertised_fee / tx_info.advertised_cost
|
|
113
|
+
# PriorityQueue returns lowest first so we invert
|
|
114
|
+
priority = -fpc
|
|
115
|
+
else:
|
|
116
|
+
# This peer didn't advertise cost and fee information for
|
|
117
|
+
# this transaction (it sent a `RespondTransaction` message
|
|
118
|
+
# instead of a `NewTransaction` one).
|
|
119
|
+
priority = float("inf")
|
|
120
|
+
self._queue_dict[peer_id].put((priority, tx))
|
|
100
121
|
else:
|
|
101
122
|
self.log.warning(f"Transaction queue full for peer {peer_id}")
|
|
102
123
|
raise TransactionQueueFull(f"Transaction queue full for peer {peer_id}")
|
|
@@ -106,11 +127,11 @@ class TransactionQueue:
|
|
|
106
127
|
await self._queue_length.acquire()
|
|
107
128
|
if not self._high_priority_queue.empty():
|
|
108
129
|
return self._high_priority_queue.get()
|
|
109
|
-
result:
|
|
130
|
+
result: TransactionQueueEntry | None = None
|
|
110
131
|
while True:
|
|
111
132
|
peer_queue = self._queue_dict[self._index_to_peer_map[self._list_cursor]]
|
|
112
133
|
if not peer_queue.empty():
|
|
113
|
-
result = peer_queue.get()
|
|
134
|
+
_, result = peer_queue.get()
|
|
114
135
|
self._list_cursor += 1
|
|
115
136
|
if self._list_cursor > len(self._index_to_peer_map) - 1:
|
|
116
137
|
# reset iterator
|