chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/blockchain/blockchain_test_utils.py +2 -3
- chia/_tests/blockchain/test_augmented_chain.py +2 -3
- chia/_tests/blockchain/test_blockchain.py +261 -44
- chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
- chia/_tests/blockchain/test_build_chains.py +197 -1
- chia/_tests/blockchain/test_get_block_generator.py +1 -1
- chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +3 -4
- chia/_tests/clvm/test_message_conditions.py +2 -2
- chia/_tests/clvm/test_puzzle_compression.py +2 -3
- chia/_tests/clvm/test_puzzles.py +1 -2
- chia/_tests/clvm/test_singletons.py +2 -3
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +30 -25
- chia/_tests/cmds/test_dev_gh.py +1 -1
- chia/_tests/cmds/test_farm_cmd.py +1 -1
- chia/_tests/cmds/test_show.py +1 -2
- chia/_tests/cmds/wallet/test_did.py +101 -56
- chia/_tests/cmds/wallet/test_nft.py +109 -84
- chia/_tests/cmds/wallet/test_notifications.py +1 -1
- chia/_tests/cmds/wallet/test_offer.toffer +1 -1
- chia/_tests/cmds/wallet/test_vcs.py +8 -8
- chia/_tests/cmds/wallet/test_wallet.py +100 -46
- chia/_tests/conftest.py +31 -20
- chia/_tests/connection_utils.py +1 -1
- chia/_tests/core/consensus/stores/__init__.py +0 -0
- chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
- chia/_tests/core/consensus/test_block_creation.py +2 -31
- chia/_tests/core/consensus/test_pot_iterations.py +38 -3
- chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
- chia/_tests/core/daemon/test_daemon.py +80 -0
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +14 -10
- chia/_tests/core/data_layer/test_data_store.py +5 -5
- chia/_tests/core/farmer/test_farmer_api.py +2 -2
- chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
- chia/_tests/core/full_node/ram_db.py +3 -1
- chia/_tests/core/full_node/stores/test_block_store.py +28 -16
- chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
- chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_address_manager.py +200 -27
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +7 -6
- chia/_tests/core/full_node/test_full_node.py +456 -40
- chia/_tests/core/full_node/test_generator_tools.py +32 -2
- chia/_tests/core/full_node/test_hint_management.py +1 -1
- chia/_tests/core/full_node/test_node_load.py +20 -21
- chia/_tests/core/full_node/test_performance.py +3 -4
- chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
- chia/_tests/core/full_node/test_subscriptions.py +1 -2
- chia/_tests/core/full_node/test_transactions.py +9 -5
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
- chia/_tests/core/large_block.py +1 -2
- chia/_tests/core/make_block_generator.py +3 -4
- chia/_tests/core/mempool/test_mempool.py +36 -86
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
- chia/_tests/core/mempool/test_mempool_manager.py +529 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +61 -132
- chia/_tests/core/server/flood.py +1 -1
- chia/_tests/core/server/test_dos.py +1 -1
- chia/_tests/core/server/test_node_discovery.py +41 -27
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +1 -1
- chia/_tests/core/services/test_services.py +5 -5
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_cost_calculation.py +6 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_crawler_rpc.py +1 -1
- chia/_tests/core/test_db_conversion.py +3 -1
- chia/_tests/core/test_db_validation.py +5 -3
- chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
- chia/_tests/core/test_filter.py +4 -1
- chia/_tests/core/test_full_node_rpc.py +99 -82
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/util/test_block_cache.py +1 -1
- chia/_tests/core/util/test_keychain.py +2 -2
- chia/_tests/core/util/test_lockfile.py +1 -1
- chia/_tests/core/util/test_log_exceptions.py +5 -5
- chia/_tests/core/util/test_streamable.py +81 -22
- chia/_tests/db/test_db_wrapper.py +1 -3
- chia/_tests/environments/wallet.py +5 -5
- chia/_tests/farmer_harvester/test_farmer.py +9 -7
- chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/generator/test_compression.py +1 -2
- chia/_tests/generator/test_rom.py +8 -4
- chia/_tests/plot_sync/test_plot_sync.py +3 -3
- chia/_tests/plot_sync/test_receiver.py +3 -3
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +3 -3
- chia/_tests/plot_sync/util.py +2 -2
- chia/_tests/pools/test_pool_cmdline.py +48 -21
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
- chia/_tests/pools/test_pool_rpc.py +237 -105
- chia/_tests/pools/test_pool_wallet.py +11 -2
- chia/_tests/pools/test_wallet_pool_store.py +5 -4
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/simulation/test_simulation.py +13 -8
- chia/_tests/simulation/test_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +191 -47
- chia/_tests/timelord/test_timelord.py +1 -1
- chia/_tests/tools/test_full_sync.py +0 -2
- chia/_tests/tools/test_run_block.py +3 -1
- chia/_tests/util/benchmark_cost.py +3 -3
- chia/_tests/util/benchmarks.py +2 -2
- chia/_tests/util/blockchain.py +11 -5
- chia/_tests/util/blockchain_mock.py +1 -4
- chia/_tests/util/coin_store.py +29 -0
- chia/_tests/util/constants.py +2 -18
- chia/_tests/util/full_sync.py +3 -3
- chia/_tests/util/generator_tools_testing.py +2 -3
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +33 -31
- chia/_tests/util/network_protocol_data.py +19 -17
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +3 -1
- chia/_tests/util/run_block.py +2 -2
- chia/_tests/util/setup_nodes.py +7 -7
- chia/_tests/util/spend_sim.py +47 -55
- chia/_tests/util/test_condition_tools.py +5 -4
- chia/_tests/util/test_config.py +2 -2
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +12 -14
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_paginator.py +4 -4
- chia/_tests/util/test_priority_mutex.py +2 -2
- chia/_tests/util/test_replace_str_to_bytes.py +15 -5
- chia/_tests/util/test_ssl_check.py +1 -1
- chia/_tests/util/test_testnet_overrides.py +13 -3
- chia/_tests/util/time_out_assert.py +4 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
- chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
- chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
- chia/_tests/wallet/conftest.py +11 -12
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
- chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
- chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
- chia/_tests/wallet/nft_wallet/config.py +1 -1
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
- chia/_tests/wallet/rpc/test_wallet_rpc.py +495 -265
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
- chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
- chia/_tests/wallet/test_clvm_casts.py +88 -0
- chia/_tests/wallet/test_coin_management.py +1 -1
- chia/_tests/wallet/test_coin_selection.py +1 -1
- chia/_tests/wallet/test_conditions.py +1 -1
- chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
- chia/_tests/wallet/test_notifications.py +5 -3
- chia/_tests/wallet/test_sign_coin_spends.py +6 -6
- chia/_tests/wallet/test_signer_protocol.py +13 -12
- chia/_tests/wallet/test_singleton.py +1 -1
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +108 -29
- chia/_tests/wallet/test_wallet_action_scope.py +9 -2
- chia/_tests/wallet/test_wallet_blockchain.py +2 -3
- chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
- chia/_tests/wallet/test_wallet_node.py +2 -4
- chia/_tests/wallet/test_wallet_retry.py +4 -2
- chia/_tests/wallet/test_wallet_state_manager.py +191 -5
- chia/_tests/wallet/test_wallet_test_framework.py +1 -1
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
- chia/_tests/wallet/wallet_block_tools.py +6 -6
- chia/_tests/weight_proof/test_weight_proof.py +10 -48
- chia/apis.py +1 -1
- chia/cmds/beta.py +1 -1
- chia/cmds/chia.py +9 -9
- chia/cmds/cmd_classes.py +12 -11
- chia/cmds/cmd_helpers.py +1 -1
- chia/cmds/cmds_util.py +12 -9
- chia/cmds/coin_funcs.py +2 -2
- chia/cmds/configure.py +2 -2
- chia/cmds/data.py +0 -2
- chia/cmds/data_funcs.py +1 -1
- chia/cmds/db_validate_func.py +1 -2
- chia/cmds/dev/__init__.py +0 -0
- chia/cmds/dev/data.py +273 -0
- chia/cmds/{gh.py → dev/gh.py} +5 -5
- chia/cmds/dev/main.py +22 -0
- chia/cmds/dev/mempool.py +78 -0
- chia/cmds/dev/mempool_funcs.py +63 -0
- chia/cmds/farm_funcs.py +5 -4
- chia/cmds/init_funcs.py +11 -11
- chia/cmds/keys.py +2 -2
- chia/cmds/keys_funcs.py +4 -4
- chia/cmds/netspace_funcs.py +1 -1
- chia/cmds/peer_funcs.py +2 -2
- chia/cmds/plotnft_funcs.py +72 -26
- chia/cmds/rpc.py +1 -1
- chia/cmds/show_funcs.py +5 -5
- chia/cmds/signer.py +8 -7
- chia/cmds/sim_funcs.py +8 -9
- chia/cmds/wallet.py +2 -2
- chia/cmds/wallet_funcs.py +165 -131
- chia/{util → consensus}/augmented_chain.py +1 -2
- chia/consensus/block_body_validation.py +54 -40
- chia/consensus/block_creation.py +42 -76
- chia/consensus/block_header_validation.py +32 -26
- chia/consensus/block_record.py +0 -3
- chia/consensus/blockchain.py +23 -32
- chia/consensus/blockchain_interface.py +1 -5
- chia/consensus/check_time_locks.py +57 -0
- chia/consensus/coin_store_protocol.py +151 -0
- chia/consensus/coinbase.py +0 -6
- chia/consensus/condition_costs.py +4 -0
- chia/{util → consensus}/condition_tools.py +4 -5
- chia/consensus/cost_calculator.py +1 -1
- chia/consensus/default_constants.py +32 -9
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +1 -2
- chia/consensus/find_fork_point.py +1 -3
- chia/consensus/full_block_to_block_record.py +1 -6
- chia/{util → consensus}/generator_tools.py +1 -3
- chia/consensus/get_block_challenge.py +30 -7
- chia/consensus/make_sub_epoch_summary.py +1 -5
- chia/consensus/multiprocess_validation.py +21 -20
- chia/consensus/pot_iterations.py +74 -13
- chia/{util → consensus}/prev_transaction_block.py +1 -1
- chia/consensus/vdf_info_computation.py +1 -3
- chia/daemon/keychain_proxy.py +5 -5
- chia/daemon/server.py +22 -5
- chia/data_layer/data_layer.py +92 -51
- chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
- chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
- chia/data_layer/data_layer_util.py +4 -6
- chia/data_layer/data_layer_wallet.py +42 -69
- chia/data_layer/dl_wallet_store.py +12 -6
- chia/data_layer/download_data.py +3 -3
- chia/data_layer/s3_plugin_service.py +0 -1
- chia/farmer/farmer.py +3 -4
- chia/farmer/farmer_api.py +11 -7
- chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
- chia/full_node/block_height_map.py +7 -6
- chia/full_node/block_store.py +5 -7
- chia/full_node/bundle_tools.py +1 -2
- chia/full_node/coin_store.py +153 -124
- chia/{types → full_node}/eligible_coin_spends.py +39 -70
- chia/full_node/fee_estimator.py +1 -1
- chia/full_node/fee_estimator_interface.py +0 -8
- chia/full_node/fee_tracker.py +25 -25
- chia/full_node/full_node.py +70 -53
- chia/full_node/full_node_api.py +57 -40
- chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
- chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
- chia/full_node/full_node_store.py +23 -8
- chia/full_node/mempool.py +206 -53
- chia/full_node/mempool_check_conditions.py +20 -63
- chia/full_node/mempool_manager.py +47 -45
- chia/full_node/subscriptions.py +1 -3
- chia/full_node/tx_processing_queue.py +50 -3
- chia/full_node/weight_proof.py +46 -37
- chia/harvester/harvester.py +1 -1
- chia/harvester/harvester_api.py +22 -7
- chia/introducer/introducer.py +1 -1
- chia/introducer/introducer_api.py +1 -1
- chia/plot_sync/exceptions.py +1 -1
- chia/plot_sync/receiver.py +1 -1
- chia/plot_sync/sender.py +2 -2
- chia/pools/pool_puzzles.py +13 -18
- chia/pools/pool_wallet.py +23 -46
- chia/protocols/farmer_protocol.py +11 -3
- chia/protocols/full_node_protocol.py +1 -4
- chia/protocols/harvester_protocol.py +3 -3
- chia/protocols/pool_protocol.py +1 -2
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +1 -3
- chia/protocols/wallet_protocol.py +3 -3
- chia/rpc/rpc_client.py +7 -8
- chia/rpc/rpc_server.py +3 -3
- chia/rpc/util.py +3 -1
- chia/seeder/crawler.py +1 -1
- chia/seeder/crawler_api.py +1 -1
- chia/seeder/dns_server.py +2 -0
- chia/seeder/start_crawler.py +3 -3
- chia/server/address_manager.py +286 -38
- chia/server/address_manager_store.py +0 -215
- chia/{types → server}/aliases.py +7 -7
- chia/server/api_protocol.py +1 -1
- chia/server/chia_policy.py +1 -1
- chia/server/node_discovery.py +76 -113
- chia/server/rate_limits.py +1 -1
- chia/server/resolve_peer_info.py +43 -0
- chia/server/server.py +5 -5
- chia/server/start_data_layer.py +4 -4
- chia/server/start_farmer.py +5 -4
- chia/server/start_full_node.py +5 -4
- chia/server/start_harvester.py +7 -5
- chia/server/start_introducer.py +2 -2
- chia/server/start_service.py +1 -1
- chia/server/start_timelord.py +7 -5
- chia/server/start_wallet.py +7 -5
- chia/server/ws_connection.py +1 -1
- chia/simulator/add_blocks_in_batches.py +2 -2
- chia/simulator/block_tools.py +245 -201
- chia/simulator/full_node_simulator.py +38 -10
- chia/simulator/setup_services.py +12 -12
- chia/simulator/simulator_full_node_rpc_api.py +2 -2
- chia/simulator/simulator_full_node_rpc_client.py +2 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +1 -1
- chia/simulator/wallet_tools.py +10 -18
- chia/ssl/create_ssl.py +1 -1
- chia/timelord/iters_from_block.py +14 -14
- chia/timelord/timelord.py +15 -11
- chia/timelord/timelord_api.py +14 -2
- chia/timelord/timelord_state.py +20 -14
- chia/types/blockchain_format/program.py +53 -10
- chia/types/blockchain_format/proof_of_space.py +73 -19
- chia/types/coin_spend.py +3 -56
- chia/types/generator_types.py +28 -0
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +12 -7
- chia/types/unfinished_header_block.py +1 -2
- chia/types/validation_state.py +1 -2
- chia/types/weight_proof.py +1 -3
- chia/util/action_scope.py +3 -3
- chia/util/block_cache.py +1 -2
- chia/util/byte_types.py +1 -1
- chia/util/casts.py +21 -0
- chia/util/config.py +0 -37
- chia/util/db_wrapper.py +8 -1
- chia/util/errors.py +3 -2
- chia/util/initial-config.yaml +21 -5
- chia/util/keychain.py +6 -7
- chia/util/keyring_wrapper.py +5 -5
- chia/util/limited_semaphore.py +1 -1
- chia/util/priority_mutex.py +1 -1
- chia/util/streamable.py +63 -5
- chia/util/task_timing.py +1 -1
- chia/util/virtual_project_analysis.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +7 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
- chia/wallet/cat_wallet/cat_utils.py +1 -1
- chia/wallet/cat_wallet/cat_wallet.py +44 -36
- chia/wallet/cat_wallet/lineage_store.py +7 -0
- chia/wallet/cat_wallet/r_cat_wallet.py +274 -0
- chia/wallet/conditions.py +5 -10
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
- chia/wallet/derivation_record.py +33 -0
- chia/wallet/derive_keys.py +3 -3
- chia/wallet/did_wallet/did_info.py +12 -3
- chia/wallet/did_wallet/did_wallet.py +132 -101
- chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
- chia/wallet/driver_protocol.py +3 -1
- chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
- chia/wallet/nft_wallet/nft_wallet.py +69 -112
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
- chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
- chia/wallet/nft_wallet/uncurry_nft.py +4 -6
- chia/wallet/notification_manager.py +2 -3
- chia/wallet/outer_puzzles.py +7 -2
- chia/wallet/puzzle_drivers.py +1 -1
- chia/wallet/puzzles/clawback/drivers.py +5 -4
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
- chia/wallet/puzzles/singleton_top_layer.py +2 -1
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
- chia/wallet/puzzles/tails.py +1 -3
- chia/wallet/signer_protocol.py +5 -6
- chia/wallet/singleton.py +5 -4
- chia/wallet/singleton_record.py +1 -1
- chia/wallet/trade_manager.py +18 -20
- chia/wallet/trade_record.py +3 -6
- chia/wallet/trading/offer.py +12 -13
- chia/wallet/uncurried_puzzle.py +2 -2
- chia/wallet/util/compute_additions.py +58 -0
- chia/wallet/util/compute_hints.py +3 -3
- chia/wallet/util/compute_memos.py +4 -4
- chia/wallet/util/curry_and_treehash.py +2 -1
- chia/wallet/util/debug_spend_bundle.py +1 -1
- chia/wallet/util/merkle_tree.py +1 -1
- chia/wallet/util/peer_request_cache.py +1 -2
- chia/wallet/util/tx_config.py +3 -8
- chia/wallet/util/wallet_sync_utils.py +10 -5
- chia/wallet/util/wallet_types.py +1 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
- chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
- chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
- chia/wallet/vc_wallet/vc_drivers.py +50 -8
- chia/wallet/vc_wallet/vc_store.py +3 -5
- chia/wallet/vc_wallet/vc_wallet.py +15 -22
- chia/wallet/wallet.py +36 -46
- chia/wallet/wallet_action_scope.py +73 -4
- chia/wallet/wallet_blockchain.py +1 -3
- chia/wallet/wallet_interested_store.py +1 -1
- chia/wallet/wallet_nft_store.py +3 -3
- chia/wallet/wallet_node.py +17 -16
- chia/wallet/wallet_node_api.py +4 -5
- chia/wallet/wallet_pool_store.py +1 -1
- chia/wallet/wallet_protocol.py +2 -0
- chia/wallet/wallet_puzzle_store.py +1 -1
- chia/{rpc → wallet}/wallet_request_types.py +670 -81
- chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
- chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
- chia/wallet/wallet_singleton_store.py +8 -7
- chia/wallet/wallet_spend_bundle.py +4 -3
- chia/wallet/wallet_state_manager.py +320 -191
- chia/wallet/wallet_weight_proof_handler.py +1 -2
- chia/wallet/wsm_apis.py +98 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/RECORD +443 -436
- mozilla-ca/cacert.pem +3 -165
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
- chia/cmds/dev.py +0 -18
- chia/types/blockchain_format/slots.py +0 -9
- chia/types/blockchain_format/sub_epoch_summary.py +0 -5
- chia/types/end_of_slot_bundle.py +0 -5
- chia/types/full_block.py +0 -5
- chia/types/header_block.py +0 -5
- chia/types/spend_bundle_conditions.py +0 -7
- chia/types/transaction_queue_entry.py +0 -56
- chia/types/unfinished_block.py +0 -5
- /chia/cmds/{installers.py → dev/installers.py} +0 -0
- /chia/cmds/{sim.py → dev/sim.py} +0 -0
- /chia/{util → cmds}/dump_keyring.py +0 -0
- /chia/{full_node → consensus}/signage_point.py +0 -0
- /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
- /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
- /chia/{util → full_node}/full_block_utils.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
- /chia/{full_node → protocols}/fee_estimate.py +0 -0
- /chia/{server → protocols}/outbound_message.py +0 -0
- /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
- /chia/{util → simulator}/vdf_prover.py +0 -0
- /chia/{util → ssl}/ssl_check.py +0 -0
- /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5.dist-info}/entry_points.txt +0 -0
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from chia_puzzles_py.programs import CHIALISP_DESERIALISATION
|
|
7
6
|
from chia_rs import (
|
|
7
|
+
CoinSpend,
|
|
8
8
|
ConsensusConstants,
|
|
9
9
|
get_flags_for_height_and_constants,
|
|
10
10
|
run_chia_program,
|
|
11
11
|
)
|
|
12
12
|
from chia_rs import get_puzzle_and_solution_for_coin2 as get_puzzle_and_solution_for_coin_rust
|
|
13
|
-
from chia_rs.
|
|
14
|
-
from chia_rs.sized_ints import uint32, uint64
|
|
13
|
+
from chia_rs.sized_ints import uint64
|
|
15
14
|
|
|
15
|
+
from chia.consensus.condition_tools import conditions_for_solution
|
|
16
16
|
from chia.types.blockchain_format.coin import Coin
|
|
17
17
|
from chia.types.blockchain_format.program import Program
|
|
18
|
-
from chia.types.
|
|
19
|
-
from chia.types.coin_spend import CoinSpend, CoinSpendWithConditions, SpendInfo, make_spend
|
|
18
|
+
from chia.types.coin_spend import CoinSpendWithConditions, SpendInfo, make_spend
|
|
20
19
|
from chia.types.generator_types import BlockGenerator
|
|
21
|
-
from chia.types.spend_bundle_conditions import SpendBundleConditions
|
|
22
|
-
from chia.util.condition_tools import conditions_for_solution
|
|
23
|
-
from chia.util.errors import Err
|
|
24
20
|
|
|
25
21
|
DESERIALIZE_MOD = Program.from_bytes(CHIALISP_DESERIALISATION)
|
|
26
22
|
|
|
@@ -61,10 +57,13 @@ def get_spends_for_block(generator: BlockGenerator, height: int, constants: Cons
|
|
|
61
57
|
spends: list[CoinSpend] = []
|
|
62
58
|
|
|
63
59
|
for spend in Program.to(ret).first().as_iter():
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
try:
|
|
61
|
+
parent, puzzle, amount, solution = spend.as_iter()
|
|
62
|
+
puzzle_hash = puzzle.get_tree_hash()
|
|
63
|
+
coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
|
|
64
|
+
spends.append(make_spend(coin, puzzle, solution))
|
|
65
|
+
except ValueError:
|
|
66
|
+
log.warning("get_spends_for_block() encountered a puzzle we couldn't serialize: {e}")
|
|
68
67
|
|
|
69
68
|
return spends
|
|
70
69
|
|
|
@@ -90,56 +89,14 @@ def get_spends_for_block_with_conditions(
|
|
|
90
89
|
spends: list[CoinSpendWithConditions] = []
|
|
91
90
|
|
|
92
91
|
for spend in Program.to(ret).first().as_iter():
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
92
|
+
try:
|
|
93
|
+
parent, puzzle, amount, solution = spend.as_iter()
|
|
94
|
+
puzzle_hash = puzzle.get_tree_hash()
|
|
95
|
+
coin = Coin(parent.as_atom(), puzzle_hash, uint64(amount.as_int()))
|
|
96
|
+
coin_spend = make_spend(coin, puzzle, solution)
|
|
97
|
+
conditions = conditions_for_solution(puzzle, solution, constants.MAX_BLOCK_COST_CLVM)
|
|
98
|
+
spends.append(CoinSpendWithConditions(coin_spend, conditions))
|
|
99
|
+
except ValueError:
|
|
100
|
+
log.warning("get_spends_for_block_with_conditions() encountered a puzzle we couldn't serialize: {e}")
|
|
99
101
|
|
|
100
102
|
return spends
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def mempool_check_time_locks(
|
|
104
|
-
removal_coin_records: dict[bytes32, CoinRecord],
|
|
105
|
-
bundle_conds: SpendBundleConditions,
|
|
106
|
-
prev_transaction_block_height: uint32,
|
|
107
|
-
timestamp: uint64,
|
|
108
|
-
) -> Optional[Err]:
|
|
109
|
-
"""
|
|
110
|
-
Check all time and height conditions against current state.
|
|
111
|
-
"""
|
|
112
|
-
|
|
113
|
-
if prev_transaction_block_height < bundle_conds.height_absolute:
|
|
114
|
-
return Err.ASSERT_HEIGHT_ABSOLUTE_FAILED
|
|
115
|
-
if timestamp < bundle_conds.seconds_absolute:
|
|
116
|
-
return Err.ASSERT_SECONDS_ABSOLUTE_FAILED
|
|
117
|
-
if bundle_conds.before_height_absolute is not None:
|
|
118
|
-
if prev_transaction_block_height >= bundle_conds.before_height_absolute:
|
|
119
|
-
return Err.ASSERT_BEFORE_HEIGHT_ABSOLUTE_FAILED
|
|
120
|
-
if bundle_conds.before_seconds_absolute is not None:
|
|
121
|
-
if timestamp >= bundle_conds.before_seconds_absolute:
|
|
122
|
-
return Err.ASSERT_BEFORE_SECONDS_ABSOLUTE_FAILED
|
|
123
|
-
|
|
124
|
-
for spend in bundle_conds.spends:
|
|
125
|
-
unspent = removal_coin_records[bytes32(spend.coin_id)]
|
|
126
|
-
if spend.birth_height is not None:
|
|
127
|
-
if spend.birth_height != unspent.confirmed_block_index:
|
|
128
|
-
return Err.ASSERT_MY_BIRTH_HEIGHT_FAILED
|
|
129
|
-
if spend.birth_seconds is not None:
|
|
130
|
-
if spend.birth_seconds != unspent.timestamp:
|
|
131
|
-
return Err.ASSERT_MY_BIRTH_SECONDS_FAILED
|
|
132
|
-
if spend.height_relative is not None:
|
|
133
|
-
if prev_transaction_block_height < unspent.confirmed_block_index + spend.height_relative:
|
|
134
|
-
return Err.ASSERT_HEIGHT_RELATIVE_FAILED
|
|
135
|
-
if spend.seconds_relative is not None:
|
|
136
|
-
if timestamp < unspent.timestamp + spend.seconds_relative:
|
|
137
|
-
return Err.ASSERT_SECONDS_RELATIVE_FAILED
|
|
138
|
-
if spend.before_height_relative is not None:
|
|
139
|
-
if prev_transaction_block_height >= unspent.confirmed_block_index + spend.before_height_relative:
|
|
140
|
-
return Err.ASSERT_BEFORE_HEIGHT_RELATIVE_FAILED
|
|
141
|
-
if spend.before_seconds_relative is not None:
|
|
142
|
-
if timestamp >= unspent.timestamp + spend.before_seconds_relative:
|
|
143
|
-
return Err.ASSERT_BEFORE_SECONDS_RELATIVE_FAILED
|
|
144
|
-
|
|
145
|
-
return None
|
|
@@ -13,7 +13,8 @@ from chia_rs import (
|
|
|
13
13
|
ELIGIBLE_FOR_FF,
|
|
14
14
|
BLSCache,
|
|
15
15
|
ConsensusConstants,
|
|
16
|
-
|
|
16
|
+
SpendBundle,
|
|
17
|
+
SpendBundleConditions,
|
|
17
18
|
supports_fast_forward,
|
|
18
19
|
validate_clvm_and_signature,
|
|
19
20
|
)
|
|
@@ -22,23 +23,21 @@ from chia_rs.sized_ints import uint32, uint64
|
|
|
22
23
|
from chiabip158 import PyBIP158
|
|
23
24
|
|
|
24
25
|
from chia.consensus.block_record import BlockRecordProtocol
|
|
26
|
+
from chia.consensus.check_time_locks import check_time_locks
|
|
25
27
|
from chia.consensus.cost_calculator import NPCResult
|
|
26
28
|
from chia.full_node.bitcoin_fee_estimator import create_bitcoin_fee_estimator
|
|
29
|
+
from chia.full_node.eligible_coin_spends import EligibilityAndAdditions
|
|
27
30
|
from chia.full_node.fee_estimation import FeeBlockInfo, MempoolInfo, MempoolItemInfo
|
|
28
31
|
from chia.full_node.fee_estimator_interface import FeeEstimatorInterface
|
|
29
32
|
from chia.full_node.mempool import MEMPOOL_ITEM_FEE_LIMIT, Mempool, MempoolRemoveInfo, MempoolRemoveReason
|
|
30
|
-
from chia.full_node.mempool_check_conditions import mempool_check_time_locks
|
|
31
33
|
from chia.full_node.pending_tx_cache import ConflictTxCache, PendingTxCache
|
|
32
34
|
from chia.types.blockchain_format.coin import Coin
|
|
33
35
|
from chia.types.clvm_cost import CLVMCost
|
|
34
36
|
from chia.types.coin_record import CoinRecord
|
|
35
|
-
from chia.types.eligible_coin_spends import EligibilityAndAdditions, UnspentLineageInfo
|
|
36
37
|
from chia.types.fee_rate import FeeRate
|
|
37
|
-
from chia.types.generator_types import
|
|
38
|
+
from chia.types.generator_types import NewBlockGenerator
|
|
38
39
|
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
39
|
-
from chia.types.mempool_item import BundleCoinSpend, MempoolItem
|
|
40
|
-
from chia.types.spend_bundle import SpendBundle
|
|
41
|
-
from chia.types.spend_bundle_conditions import SpendBundleConditions
|
|
40
|
+
from chia.types.mempool_item import BundleCoinSpend, MempoolItem, UnspentLineageInfo
|
|
42
41
|
from chia.util.db_wrapper import SQLITE_INT_MAX
|
|
43
42
|
from chia.util.errors import Err, ValidationError
|
|
44
43
|
from chia.util.inline_executor import InlineExecutor
|
|
@@ -259,7 +258,22 @@ def check_removals(
|
|
|
259
258
|
for item in conflicting_items:
|
|
260
259
|
if item in conflicts:
|
|
261
260
|
continue
|
|
262
|
-
conflict_bcs = item.bundle_coin_spends
|
|
261
|
+
conflict_bcs = item.bundle_coin_spends.get(coin_id)
|
|
262
|
+
if conflict_bcs is None:
|
|
263
|
+
# Check if this is an item that spends an older ff singleton
|
|
264
|
+
# version with a latest version that matches our coin ID.
|
|
265
|
+
conflict_bcs = next(
|
|
266
|
+
(
|
|
267
|
+
bcs
|
|
268
|
+
for bcs in item.bundle_coin_spends.values()
|
|
269
|
+
if bcs.latest_singleton_lineage is not None and bcs.latest_singleton_lineage.coin_id == coin_id
|
|
270
|
+
),
|
|
271
|
+
None,
|
|
272
|
+
)
|
|
273
|
+
# We're not expected to get here but let's handle it gracefully
|
|
274
|
+
if conflict_bcs is None:
|
|
275
|
+
log.warning(f"Coin ID {coin_id} expected but not found in mempool item {item.name}")
|
|
276
|
+
return Err.INVALID_SPEND_BUNDLE, []
|
|
263
277
|
# if the spend we're adding to the mempool is not DEDUP nor FF, it's
|
|
264
278
|
# just a regular conflict
|
|
265
279
|
if not coin_bcs.eligible_for_fast_forward and not coin_bcs.eligible_for_dedup:
|
|
@@ -362,43 +376,30 @@ class MempoolManager:
|
|
|
362
376
|
self.pool.shutdown(wait=True)
|
|
363
377
|
|
|
364
378
|
# TODO: remove this, use create_generator() instead
|
|
365
|
-
|
|
366
|
-
self,
|
|
367
|
-
last_tb_header_hash: bytes32,
|
|
368
|
-
item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
|
|
369
|
-
) -> Optional[tuple[SpendBundle, list[Coin]]]:
|
|
379
|
+
def create_bundle_from_mempool(self, last_tb_header_hash: bytes32) -> Optional[tuple[SpendBundle, list[Coin]]]:
|
|
370
380
|
"""
|
|
371
381
|
Returns aggregated spendbundle that can be used for creating new block,
|
|
372
382
|
additions and removals in that spend_bundle
|
|
373
383
|
"""
|
|
374
|
-
|
|
375
|
-
lineage_cache = LineageInfoCache(self.get_unspent_lineage_info_for_puzzle_hash)
|
|
376
|
-
|
|
377
384
|
if self.peak is None or self.peak.header_hash != last_tb_header_hash:
|
|
378
385
|
return None
|
|
379
|
-
return
|
|
380
|
-
lineage_cache.get_unspent_lineage_info, self.constants, self.peak.height, item_inclusion_filter
|
|
381
|
-
)
|
|
386
|
+
return self.mempool.create_bundle_from_mempool_items(self.constants, self.peak.height)
|
|
382
387
|
|
|
383
|
-
|
|
384
|
-
self,
|
|
385
|
-
last_tb_header_hash: bytes32,
|
|
386
|
-
item_inclusion_filter: Optional[Callable[[bytes32], bool]] = None,
|
|
387
|
-
) -> Optional[tuple[BlockGenerator, G2Element, list[Coin], list[Coin]]]:
|
|
388
|
+
def create_block_generator(self, last_tb_header_hash: bytes32, timeout: float) -> Optional[NewBlockGenerator]:
|
|
388
389
|
"""
|
|
389
390
|
Returns a block generator program, the aggregate signature and all additions and removals, for a new block
|
|
390
391
|
"""
|
|
391
392
|
if self.peak is None or self.peak.header_hash != last_tb_header_hash:
|
|
392
393
|
return None
|
|
394
|
+
return self.mempool.create_block_generator(self.constants, self.peak.height, timeout)
|
|
393
395
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
)
|
|
396
|
+
def create_block_generator2(self, last_tb_header_hash: bytes32, timeout: float) -> Optional[NewBlockGenerator]:
|
|
397
|
+
"""
|
|
398
|
+
Returns a block generator program, the aggregate signature and all additions, for a new block
|
|
399
|
+
"""
|
|
400
|
+
if self.peak is None or self.peak.header_hash != last_tb_header_hash:
|
|
401
|
+
return None
|
|
402
|
+
return self.mempool.create_block_generator2(self.constants, self.peak.height, timeout)
|
|
402
403
|
|
|
403
404
|
def get_filter(self) -> bytes:
|
|
404
405
|
all_transactions: set[bytes32] = set()
|
|
@@ -572,12 +573,13 @@ class MempoolManager:
|
|
|
572
573
|
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
|
|
573
574
|
) -> tuple[Optional[Err], Optional[MempoolItem], list[bytes32]]:
|
|
574
575
|
"""
|
|
575
|
-
Validates new_spend with the given
|
|
576
|
+
Validates new_spend with the given SpendBundleConditions, and
|
|
577
|
+
spend_name, and the current mempool. The mempool should
|
|
576
578
|
be locked during this call (blockchain lock).
|
|
577
579
|
|
|
578
580
|
Args:
|
|
579
581
|
new_spend: spend bundle to validate
|
|
580
|
-
conds: result of running the clvm transaction
|
|
582
|
+
conds: result of running the clvm transaction
|
|
581
583
|
spend_name: hash of the spend bundle data, passed in as an optimization
|
|
582
584
|
first_added_height: The block height that `new_spend` first entered this node's mempool.
|
|
583
585
|
Used to estimate how long a spend has taken to be included on the chain.
|
|
@@ -630,7 +632,7 @@ class MempoolManager:
|
|
|
630
632
|
return Err.INVALID_COIN_SOLUTION, None, []
|
|
631
633
|
|
|
632
634
|
mark_as_fast_forward = eligibility_info.ff_puzzle_hash is not None and supports_fast_forward(coin_spend)
|
|
633
|
-
|
|
635
|
+
lineage_info = None
|
|
634
636
|
if mark_as_fast_forward:
|
|
635
637
|
# Make sure the fast forward spend still has a version that is
|
|
636
638
|
# still unspent, because if the singleton has been melted, the
|
|
@@ -638,14 +640,13 @@ class MempoolManager:
|
|
|
638
640
|
assert eligibility_info.ff_puzzle_hash is not None
|
|
639
641
|
lineage_info = await get_unspent_lineage_info_for_puzzle_hash(eligibility_info.ff_puzzle_hash)
|
|
640
642
|
if lineage_info is None:
|
|
641
|
-
|
|
642
|
-
latest_singleton_coin = lineage_info.coin_id
|
|
643
|
+
mark_as_fast_forward = False
|
|
643
644
|
bundle_coin_spends[coin_id] = BundleCoinSpend(
|
|
644
645
|
coin_spend=coin_spend,
|
|
645
646
|
eligible_for_dedup=supports_dedup,
|
|
646
647
|
eligible_for_fast_forward=mark_as_fast_forward,
|
|
647
648
|
additions=eligibility_info.spend_additions,
|
|
648
|
-
|
|
649
|
+
latest_singleton_lineage=lineage_info,
|
|
649
650
|
)
|
|
650
651
|
|
|
651
652
|
if removal_names != removal_names_from_coin_spends:
|
|
@@ -739,7 +740,7 @@ class MempoolManager:
|
|
|
739
740
|
# point-of-view of the next block to be farmed. Therefore we pass in the
|
|
740
741
|
# current peak's height and timestamp
|
|
741
742
|
assert self.peak.timestamp is not None
|
|
742
|
-
tl_error: Optional[Err] =
|
|
743
|
+
tl_error: Optional[Err] = check_time_locks(
|
|
743
744
|
removal_record_dict,
|
|
744
745
|
conds,
|
|
745
746
|
self.peak.height,
|
|
@@ -857,7 +858,7 @@ class MempoolManager:
|
|
|
857
858
|
# rebasing a fast forward spend is more expensive than to just
|
|
858
859
|
# evict the item. So, any FF spend we may need to rebase, defer
|
|
859
860
|
# them until after we've gone through all spends
|
|
860
|
-
deferred_ff_items: set[tuple[bytes32,
|
|
861
|
+
deferred_ff_items: set[tuple[bytes32, MempoolItem]] = set()
|
|
861
862
|
|
|
862
863
|
for spend in spent_coins:
|
|
863
864
|
items = self.mempool.get_items_by_coin_id(spend)
|
|
@@ -872,7 +873,7 @@ class MempoolManager:
|
|
|
872
873
|
continue
|
|
873
874
|
|
|
874
875
|
bcs = item.bundle_coin_spends.get(spend)
|
|
875
|
-
if bcs is not None and bcs.
|
|
876
|
+
if bcs is not None and bcs.latest_singleton_lineage is None:
|
|
876
877
|
# this is a regular coin spend that's now made it into
|
|
877
878
|
# a block and we just evict its mempool item
|
|
878
879
|
included_items.append(MempoolItemInfo(item.cost, item.fee, item.height_added_to_mempool))
|
|
@@ -880,7 +881,7 @@ class MempoolManager:
|
|
|
880
881
|
spendbundle_ids_to_remove.add(item_name)
|
|
881
882
|
continue
|
|
882
883
|
|
|
883
|
-
deferred_ff_items.add((spend,
|
|
884
|
+
deferred_ff_items.add((spend, item))
|
|
884
885
|
|
|
885
886
|
# fast forward spends are indexed under the latest singleton coin ID
|
|
886
887
|
# if it's spent, we need to update the index in the mempool. This
|
|
@@ -888,14 +889,15 @@ class MempoolManager:
|
|
|
888
889
|
# new_coin_id, current_coin_id, mempool item name
|
|
889
890
|
spends_to_update: list[tuple[bytes32, bytes32, bytes32]] = []
|
|
890
891
|
|
|
891
|
-
for spend,
|
|
892
|
+
for spend, item in deferred_ff_items:
|
|
893
|
+
item_name = item.spend_bundle_name
|
|
892
894
|
if item_name in spendbundle_ids_to_remove:
|
|
893
895
|
continue
|
|
894
896
|
# there may be multiple matching spends in the mempool
|
|
895
897
|
# item, for the same singleton
|
|
896
898
|
found_matches = 0
|
|
897
899
|
for bcs in item.bundle_coin_spends.values():
|
|
898
|
-
if bcs.
|
|
900
|
+
if bcs.latest_singleton_lineage is None or bcs.latest_singleton_lineage.coin_id != spend:
|
|
899
901
|
continue
|
|
900
902
|
found_matches += 1
|
|
901
903
|
|
|
@@ -911,7 +913,7 @@ class MempoolManager:
|
|
|
911
913
|
break
|
|
912
914
|
|
|
913
915
|
spends_to_update.append((lineage_info.coin_id, spend, item_name))
|
|
914
|
-
bcs.
|
|
916
|
+
bcs.latest_singleton_lineage = lineage_info
|
|
915
917
|
|
|
916
918
|
if found_matches == 0: # pragma: no cover
|
|
917
919
|
# We are not expected to get here. this is all
|
chia/full_node/subscriptions.py
CHANGED
|
@@ -3,12 +3,10 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
5
|
|
|
6
|
-
from chia_rs import Coin
|
|
6
|
+
from chia_rs import Coin, SpendBundleConditions
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
8
8
|
from chia_rs.sized_ints import uint64
|
|
9
9
|
|
|
10
|
-
from chia.types.spend_bundle_conditions import SpendBundleConditions
|
|
11
|
-
|
|
12
10
|
log = logging.getLogger(__name__)
|
|
13
11
|
|
|
14
12
|
|
|
@@ -1,20 +1,67 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import dataclasses
|
|
4
5
|
import logging
|
|
5
|
-
from dataclasses import dataclass
|
|
6
|
+
from dataclasses import dataclass, field
|
|
6
7
|
from queue import SimpleQueue
|
|
7
|
-
from typing import Optional
|
|
8
|
+
from typing import ClassVar, Generic, Optional, TypeVar, Union
|
|
8
9
|
|
|
10
|
+
from chia_rs import SpendBundle
|
|
9
11
|
from chia_rs.sized_bytes import bytes32
|
|
10
12
|
|
|
11
|
-
from chia.
|
|
13
|
+
from chia.server.ws_connection import WSChiaConnection
|
|
14
|
+
from chia.types.mempool_inclusion_status import MempoolInclusionStatus
|
|
15
|
+
from chia.util.errors import Err
|
|
16
|
+
|
|
17
|
+
T = TypeVar("T")
|
|
12
18
|
|
|
13
19
|
|
|
14
20
|
class TransactionQueueFull(Exception):
|
|
15
21
|
pass
|
|
16
22
|
|
|
17
23
|
|
|
24
|
+
class ValuedEventSentinel:
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclasses.dataclass
|
|
29
|
+
class ValuedEvent(Generic[T]):
|
|
30
|
+
_value_sentinel: ClassVar[ValuedEventSentinel] = ValuedEventSentinel()
|
|
31
|
+
|
|
32
|
+
_event: asyncio.Event = dataclasses.field(default_factory=asyncio.Event)
|
|
33
|
+
_value: Union[ValuedEventSentinel, T] = _value_sentinel
|
|
34
|
+
|
|
35
|
+
def set(self, value: T) -> None:
|
|
36
|
+
if not isinstance(self._value, ValuedEventSentinel):
|
|
37
|
+
raise Exception("Value already set")
|
|
38
|
+
self._value = value
|
|
39
|
+
self._event.set()
|
|
40
|
+
|
|
41
|
+
async def wait(self) -> T:
|
|
42
|
+
await self._event.wait()
|
|
43
|
+
if isinstance(self._value, ValuedEventSentinel):
|
|
44
|
+
raise Exception("Value not set despite event being set")
|
|
45
|
+
return self._value
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass(frozen=True)
|
|
49
|
+
class TransactionQueueEntry:
|
|
50
|
+
"""
|
|
51
|
+
A transaction received from peer. This is put into a queue, and not yet in the mempool.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
transaction: SpendBundle = field(compare=False)
|
|
55
|
+
transaction_bytes: Optional[bytes] = field(compare=False)
|
|
56
|
+
spend_name: bytes32
|
|
57
|
+
peer: Optional[WSChiaConnection] = field(compare=False)
|
|
58
|
+
test: bool = field(compare=False)
|
|
59
|
+
done: ValuedEvent[tuple[MempoolInclusionStatus, Optional[Err]]] = field(
|
|
60
|
+
default_factory=ValuedEvent,
|
|
61
|
+
compare=False,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
18
65
|
@dataclass
|
|
19
66
|
class TransactionQueue:
|
|
20
67
|
"""
|
chia/full_node/weight_proof.py
CHANGED
|
@@ -10,29 +10,36 @@ from concurrent.futures.process import ProcessPoolExecutor
|
|
|
10
10
|
from multiprocessing.context import BaseContext
|
|
11
11
|
from typing import IO, Optional
|
|
12
12
|
|
|
13
|
-
from chia_rs import
|
|
13
|
+
from chia_rs import (
|
|
14
|
+
BlockRecord,
|
|
15
|
+
ChallengeChainSubSlot,
|
|
16
|
+
ConsensusConstants,
|
|
17
|
+
EndOfSubSlotBundle,
|
|
18
|
+
HeaderBlock,
|
|
19
|
+
RewardChainSubSlot,
|
|
20
|
+
SubEpochChallengeSegment,
|
|
21
|
+
SubEpochData,
|
|
22
|
+
SubEpochSegments,
|
|
23
|
+
SubEpochSummary,
|
|
24
|
+
SubSlotData,
|
|
25
|
+
)
|
|
14
26
|
from chia_rs.sized_bytes import bytes32
|
|
15
27
|
from chia_rs.sized_ints import uint8, uint32, uint64, uint128
|
|
16
28
|
|
|
17
29
|
from chia.consensus.block_header_validation import validate_finished_header_block
|
|
18
|
-
from chia.consensus.block_record import BlockRecord
|
|
19
30
|
from chia.consensus.blockchain_interface import BlockchainInterface
|
|
20
31
|
from chia.consensus.deficit import calculate_deficit
|
|
21
32
|
from chia.consensus.full_block_to_block_record import header_block_to_sub_block_record
|
|
33
|
+
from chia.consensus.get_block_challenge import prev_tx_block
|
|
22
34
|
from chia.consensus.pot_iterations import (
|
|
23
35
|
calculate_ip_iters,
|
|
24
|
-
calculate_iterations_quality,
|
|
25
36
|
calculate_sp_iters,
|
|
26
37
|
is_overflow_block,
|
|
38
|
+
validate_pospace_and_get_required_iters,
|
|
27
39
|
)
|
|
28
40
|
from chia.consensus.vdf_info_computation import get_signage_point_vdf_info
|
|
29
41
|
from chia.types.blockchain_format.classgroup import ClassgroupElement
|
|
30
|
-
from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
|
|
31
|
-
from chia.types.blockchain_format.slots import ChallengeChainSubSlot, RewardChainSubSlot
|
|
32
|
-
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
33
42
|
from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
|
|
34
|
-
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
35
|
-
from chia.types.header_block import HeaderBlock
|
|
36
43
|
from chia.types.validation_state import ValidationState
|
|
37
44
|
from chia.types.weight_proof import (
|
|
38
45
|
RecentChainData,
|
|
@@ -994,7 +1001,7 @@ def _validate_segment(
|
|
|
994
1001
|
if sampled and sub_slot_data.is_challenge():
|
|
995
1002
|
after_challenge = True
|
|
996
1003
|
required_iters = __validate_pospace(
|
|
997
|
-
constants, segment, idx, curr_difficulty, ses, first_segment_in_se, height
|
|
1004
|
+
constants, segment, idx, curr_difficulty, curr_ssi, ses, first_segment_in_se, height
|
|
998
1005
|
)
|
|
999
1006
|
if required_iters is None:
|
|
1000
1007
|
return False, uint64(0), uint64(0), uint64(0), []
|
|
@@ -1142,7 +1149,7 @@ def sub_slot_data_vdf_input(
|
|
|
1142
1149
|
if is_overflow and new_sub_slot:
|
|
1143
1150
|
if sub_slot_idx >= 2:
|
|
1144
1151
|
if sub_slots[sub_slot_idx - 2].cc_slot_end_info is None:
|
|
1145
|
-
for ssd_idx in reversed(range(
|
|
1152
|
+
for ssd_idx in reversed(range(sub_slot_idx - 1)):
|
|
1146
1153
|
ssd = sub_slots[ssd_idx]
|
|
1147
1154
|
if ssd.cc_slot_end_info is not None:
|
|
1148
1155
|
ssd = sub_slots[ssd_idx + 1]
|
|
@@ -1157,7 +1164,7 @@ def sub_slot_data_vdf_input(
|
|
|
1157
1164
|
return cc_input
|
|
1158
1165
|
|
|
1159
1166
|
elif not is_overflow and not new_sub_slot:
|
|
1160
|
-
for ssd_idx in reversed(range(
|
|
1167
|
+
for ssd_idx in reversed(range(sub_slot_idx)):
|
|
1161
1168
|
ssd = sub_slots[ssd_idx]
|
|
1162
1169
|
if ssd.cc_slot_end_info is not None:
|
|
1163
1170
|
ssd = sub_slots[ssd_idx + 1]
|
|
@@ -1174,7 +1181,7 @@ def sub_slot_data_vdf_input(
|
|
|
1174
1181
|
|
|
1175
1182
|
elif not new_sub_slot and is_overflow:
|
|
1176
1183
|
slots_seen = 0
|
|
1177
|
-
for ssd_idx in reversed(range(
|
|
1184
|
+
for ssd_idx in reversed(range(sub_slot_idx)):
|
|
1178
1185
|
ssd = sub_slots[ssd_idx]
|
|
1179
1186
|
if ssd.cc_slot_end_info is not None:
|
|
1180
1187
|
slots_seen += 1
|
|
@@ -1239,7 +1246,7 @@ def validate_recent_blocks(
|
|
|
1239
1246
|
if sub_slot.challenge_chain.new_difficulty is not None:
|
|
1240
1247
|
diff = sub_slot.challenge_chain.new_difficulty
|
|
1241
1248
|
|
|
1242
|
-
if (challenge is not None) and (prev_challenge is not None):
|
|
1249
|
+
if (challenge is not None) and (prev_challenge is not None) and transaction_blocks > 1:
|
|
1243
1250
|
overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
|
|
1244
1251
|
if not adjusted:
|
|
1245
1252
|
assert prev_block_record is not None
|
|
@@ -1260,7 +1267,9 @@ def validate_recent_blocks(
|
|
|
1260
1267
|
assert caluclated_required_iters is not None
|
|
1261
1268
|
required_iters = caluclated_required_iters
|
|
1262
1269
|
else:
|
|
1263
|
-
ret = _validate_pospace_recent_chain(
|
|
1270
|
+
ret = _validate_pospace_recent_chain(
|
|
1271
|
+
constants, sub_blocks, block, challenge, diff, ssi, overflow, prev_challenge
|
|
1272
|
+
)
|
|
1264
1273
|
if ret is None:
|
|
1265
1274
|
return False, []
|
|
1266
1275
|
required_iters = ret
|
|
@@ -1298,9 +1307,11 @@ def validate_recent_blocks(
|
|
|
1298
1307
|
|
|
1299
1308
|
def _validate_pospace_recent_chain(
|
|
1300
1309
|
constants: ConsensusConstants,
|
|
1310
|
+
blocks: BlockCache,
|
|
1301
1311
|
block: HeaderBlock,
|
|
1302
1312
|
challenge: bytes32,
|
|
1303
1313
|
diff: uint64,
|
|
1314
|
+
ssi: uint64,
|
|
1304
1315
|
overflow: bool,
|
|
1305
1316
|
prev_challenge: bytes32,
|
|
1306
1317
|
) -> Optional[uint64]:
|
|
@@ -1310,23 +1321,21 @@ def _validate_pospace_recent_chain(
|
|
|
1310
1321
|
else:
|
|
1311
1322
|
cc_sp_hash = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
|
|
1312
1323
|
assert cc_sp_hash is not None
|
|
1313
|
-
|
|
1314
|
-
|
|
1324
|
+
|
|
1325
|
+
required_iters = validate_pospace_and_get_required_iters(
|
|
1315
1326
|
constants,
|
|
1327
|
+
block.reward_chain_block.proof_of_space,
|
|
1316
1328
|
challenge if not overflow else prev_challenge,
|
|
1317
1329
|
cc_sp_hash,
|
|
1318
|
-
|
|
1330
|
+
block.height,
|
|
1331
|
+
diff,
|
|
1332
|
+
ssi,
|
|
1333
|
+
prev_tx_block(blocks, blocks.block_record(block.prev_header_hash)),
|
|
1319
1334
|
)
|
|
1320
|
-
if
|
|
1335
|
+
if required_iters is None:
|
|
1321
1336
|
log.error(f"could not verify proof of space block {block.height} {overflow}")
|
|
1322
1337
|
return None
|
|
1323
|
-
|
|
1324
|
-
constants.DIFFICULTY_CONSTANT_FACTOR,
|
|
1325
|
-
q_str,
|
|
1326
|
-
block.reward_chain_block.proof_of_space.size,
|
|
1327
|
-
diff,
|
|
1328
|
-
cc_sp_hash,
|
|
1329
|
-
)
|
|
1338
|
+
|
|
1330
1339
|
return required_iters
|
|
1331
1340
|
|
|
1332
1341
|
|
|
@@ -1335,6 +1344,7 @@ def __validate_pospace(
|
|
|
1335
1344
|
segment: SubEpochChallengeSegment,
|
|
1336
1345
|
idx: int,
|
|
1337
1346
|
curr_diff: uint64,
|
|
1347
|
+
curr_sub_slot_iters: uint64,
|
|
1338
1348
|
ses: Optional[SubEpochSummary],
|
|
1339
1349
|
first_in_sub_epoch: bool,
|
|
1340
1350
|
height: uint32,
|
|
@@ -1360,23 +1370,22 @@ def __validate_pospace(
|
|
|
1360
1370
|
|
|
1361
1371
|
# validate proof of space
|
|
1362
1372
|
assert sub_slot_data.proof_of_space is not None
|
|
1363
|
-
|
|
1364
|
-
|
|
1373
|
+
|
|
1374
|
+
required_iters = validate_pospace_and_get_required_iters(
|
|
1365
1375
|
constants,
|
|
1376
|
+
sub_slot_data.proof_of_space,
|
|
1366
1377
|
challenge,
|
|
1367
1378
|
cc_sp_hash,
|
|
1368
|
-
height
|
|
1379
|
+
height,
|
|
1380
|
+
curr_diff,
|
|
1381
|
+
curr_sub_slot_iters,
|
|
1382
|
+
uint32(0), # prev_tx_block(blocks, prev_b), todo need to get height of prev tx block somehow here
|
|
1369
1383
|
)
|
|
1370
|
-
if
|
|
1384
|
+
if required_iters is None:
|
|
1371
1385
|
log.error("could not verify proof of space")
|
|
1372
1386
|
return None
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
q_str,
|
|
1376
|
-
sub_slot_data.proof_of_space.size,
|
|
1377
|
-
curr_diff,
|
|
1378
|
-
cc_sp_hash,
|
|
1379
|
-
)
|
|
1387
|
+
|
|
1388
|
+
return required_iters
|
|
1380
1389
|
|
|
1381
1390
|
|
|
1382
1391
|
def __get_rc_sub_slot(
|
|
@@ -1465,7 +1474,7 @@ def __get_rc_sub_slot(
|
|
|
1465
1474
|
|
|
1466
1475
|
def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: Optional[SubEpochSummary]) -> ChallengeChainSubSlot:
|
|
1467
1476
|
sub_slot: Optional[SubSlotData] = None
|
|
1468
|
-
for i in reversed(range(
|
|
1477
|
+
for i in reversed(range(idx)):
|
|
1469
1478
|
sub_slot = sub_slots[i]
|
|
1470
1479
|
if sub_slot.cc_slot_end_info is not None:
|
|
1471
1480
|
break
|
chia/harvester/harvester.py
CHANGED
|
@@ -36,8 +36,8 @@ from chia.plotting.util import (
|
|
|
36
36
|
remove_plot_directory,
|
|
37
37
|
update_harvester_config,
|
|
38
38
|
)
|
|
39
|
+
from chia.protocols.outbound_message import NodeType
|
|
39
40
|
from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
|
|
40
|
-
from chia.server.outbound_message import NodeType
|
|
41
41
|
from chia.server.server import ChiaServer
|
|
42
42
|
from chia.server.ws_connection import WSChiaConnection
|
|
43
43
|
from chia.util.cpu import available_logical_cores
|