chia-blockchain 2.5.4rc2__py3-none-any.whl → 2.5.5rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/_tests/blockchain/blockchain_test_utils.py +2 -3
- chia/_tests/blockchain/test_augmented_chain.py +2 -3
- chia/_tests/blockchain/test_blockchain.py +261 -44
- chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
- chia/_tests/blockchain/test_build_chains.py +197 -1
- chia/_tests/blockchain/test_get_block_generator.py +1 -1
- chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +3 -4
- chia/_tests/clvm/test_message_conditions.py +2 -2
- chia/_tests/clvm/test_puzzle_compression.py +2 -3
- chia/_tests/clvm/test_puzzles.py +1 -2
- chia/_tests/clvm/test_singletons.py +2 -3
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +30 -25
- chia/_tests/cmds/test_dev_gh.py +1 -1
- chia/_tests/cmds/test_farm_cmd.py +1 -1
- chia/_tests/cmds/test_show.py +1 -2
- chia/_tests/cmds/wallet/test_did.py +101 -56
- chia/_tests/cmds/wallet/test_nft.py +109 -84
- chia/_tests/cmds/wallet/test_notifications.py +1 -1
- chia/_tests/cmds/wallet/test_offer.toffer +1 -1
- chia/_tests/cmds/wallet/test_vcs.py +8 -8
- chia/_tests/cmds/wallet/test_wallet.py +100 -46
- chia/_tests/conftest.py +31 -20
- chia/_tests/connection_utils.py +1 -1
- chia/_tests/core/consensus/stores/__init__.py +0 -0
- chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
- chia/_tests/core/consensus/test_block_creation.py +2 -31
- chia/_tests/core/consensus/test_pot_iterations.py +38 -3
- chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
- chia/_tests/core/daemon/test_daemon.py +80 -0
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +14 -10
- chia/_tests/core/data_layer/test_data_store.py +5 -5
- chia/_tests/core/farmer/test_farmer_api.py +2 -2
- chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
- chia/_tests/core/full_node/ram_db.py +3 -1
- chia/_tests/core/full_node/stores/test_block_store.py +28 -16
- chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
- chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_address_manager.py +200 -27
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +7 -6
- chia/_tests/core/full_node/test_full_node.py +456 -40
- chia/_tests/core/full_node/test_generator_tools.py +32 -2
- chia/_tests/core/full_node/test_hint_management.py +1 -1
- chia/_tests/core/full_node/test_node_load.py +20 -21
- chia/_tests/core/full_node/test_performance.py +3 -4
- chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
- chia/_tests/core/full_node/test_subscriptions.py +1 -2
- chia/_tests/core/full_node/test_transactions.py +9 -5
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
- chia/_tests/core/large_block.py +1 -2
- chia/_tests/core/make_block_generator.py +3 -4
- chia/_tests/core/mempool/test_mempool.py +36 -86
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
- chia/_tests/core/mempool/test_mempool_manager.py +421 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
- chia/_tests/core/server/flood.py +1 -1
- chia/_tests/core/server/test_dos.py +1 -1
- chia/_tests/core/server/test_node_discovery.py +41 -27
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +1 -1
- chia/_tests/core/services/test_services.py +5 -5
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_cost_calculation.py +6 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_crawler_rpc.py +1 -1
- chia/_tests/core/test_db_conversion.py +3 -1
- chia/_tests/core/test_db_validation.py +5 -3
- chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
- chia/_tests/core/test_filter.py +4 -1
- chia/_tests/core/test_full_node_rpc.py +99 -82
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/util/test_block_cache.py +1 -1
- chia/_tests/core/util/test_keychain.py +2 -2
- chia/_tests/core/util/test_lockfile.py +1 -1
- chia/_tests/core/util/test_log_exceptions.py +5 -5
- chia/_tests/core/util/test_streamable.py +81 -22
- chia/_tests/db/test_db_wrapper.py +1 -3
- chia/_tests/environments/wallet.py +5 -5
- chia/_tests/farmer_harvester/test_farmer.py +9 -7
- chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/generator/test_compression.py +1 -2
- chia/_tests/generator/test_rom.py +8 -4
- chia/_tests/plot_sync/test_plot_sync.py +3 -3
- chia/_tests/plot_sync/test_receiver.py +3 -3
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +3 -3
- chia/_tests/plot_sync/util.py +2 -2
- chia/_tests/pools/test_pool_cmdline.py +48 -21
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
- chia/_tests/pools/test_pool_rpc.py +237 -105
- chia/_tests/pools/test_pool_wallet.py +11 -2
- chia/_tests/pools/test_wallet_pool_store.py +5 -4
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/simulation/test_simulation.py +13 -8
- chia/_tests/simulation/test_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +191 -47
- chia/_tests/timelord/test_timelord.py +1 -1
- chia/_tests/tools/test_full_sync.py +0 -2
- chia/_tests/tools/test_run_block.py +3 -1
- chia/_tests/util/benchmark_cost.py +3 -3
- chia/_tests/util/benchmarks.py +2 -2
- chia/_tests/util/blockchain.py +11 -5
- chia/_tests/util/blockchain_mock.py +1 -4
- chia/_tests/util/coin_store.py +29 -0
- chia/_tests/util/constants.py +2 -18
- chia/_tests/util/full_sync.py +3 -3
- chia/_tests/util/generator_tools_testing.py +2 -3
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +33 -31
- chia/_tests/util/network_protocol_data.py +19 -17
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +3 -1
- chia/_tests/util/run_block.py +2 -2
- chia/_tests/util/setup_nodes.py +7 -7
- chia/_tests/util/spend_sim.py +47 -55
- chia/_tests/util/test_condition_tools.py +5 -4
- chia/_tests/util/test_config.py +2 -2
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +12 -14
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_paginator.py +4 -4
- chia/_tests/util/test_priority_mutex.py +2 -2
- chia/_tests/util/test_replace_str_to_bytes.py +15 -5
- chia/_tests/util/test_ssl_check.py +1 -1
- chia/_tests/util/test_testnet_overrides.py +13 -3
- chia/_tests/util/time_out_assert.py +4 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
- chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
- chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
- chia/_tests/wallet/conftest.py +11 -12
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
- chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
- chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
- chia/_tests/wallet/nft_wallet/config.py +1 -1
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
- chia/_tests/wallet/rpc/test_wallet_rpc.py +495 -265
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
- chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
- chia/_tests/wallet/test_clvm_casts.py +88 -0
- chia/_tests/wallet/test_coin_management.py +1 -1
- chia/_tests/wallet/test_coin_selection.py +1 -1
- chia/_tests/wallet/test_conditions.py +1 -1
- chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
- chia/_tests/wallet/test_notifications.py +5 -3
- chia/_tests/wallet/test_sign_coin_spends.py +6 -6
- chia/_tests/wallet/test_signer_protocol.py +13 -12
- chia/_tests/wallet/test_singleton.py +1 -1
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +108 -29
- chia/_tests/wallet/test_wallet_action_scope.py +9 -2
- chia/_tests/wallet/test_wallet_blockchain.py +2 -3
- chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
- chia/_tests/wallet/test_wallet_node.py +2 -4
- chia/_tests/wallet/test_wallet_retry.py +4 -2
- chia/_tests/wallet/test_wallet_state_manager.py +191 -5
- chia/_tests/wallet/test_wallet_test_framework.py +1 -1
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
- chia/_tests/wallet/wallet_block_tools.py +6 -6
- chia/_tests/weight_proof/test_weight_proof.py +10 -48
- chia/apis.py +1 -1
- chia/cmds/beta.py +1 -1
- chia/cmds/chia.py +9 -9
- chia/cmds/cmd_classes.py +12 -11
- chia/cmds/cmd_helpers.py +1 -1
- chia/cmds/cmds_util.py +12 -9
- chia/cmds/coin_funcs.py +2 -2
- chia/cmds/configure.py +2 -2
- chia/cmds/data.py +0 -2
- chia/cmds/data_funcs.py +1 -1
- chia/cmds/db_validate_func.py +1 -2
- chia/cmds/dev/__init__.py +0 -0
- chia/cmds/dev/data.py +273 -0
- chia/cmds/{gh.py → dev/gh.py} +5 -5
- chia/cmds/dev/main.py +22 -0
- chia/cmds/dev/mempool.py +78 -0
- chia/cmds/dev/mempool_funcs.py +63 -0
- chia/cmds/farm_funcs.py +5 -4
- chia/cmds/init_funcs.py +11 -11
- chia/cmds/keys.py +2 -2
- chia/cmds/keys_funcs.py +4 -4
- chia/cmds/netspace_funcs.py +1 -1
- chia/cmds/peer_funcs.py +2 -2
- chia/cmds/plotnft_funcs.py +72 -26
- chia/cmds/rpc.py +1 -1
- chia/cmds/show_funcs.py +5 -5
- chia/cmds/signer.py +8 -7
- chia/cmds/sim_funcs.py +8 -9
- chia/cmds/wallet.py +2 -2
- chia/cmds/wallet_funcs.py +165 -131
- chia/{util → consensus}/augmented_chain.py +1 -2
- chia/consensus/block_body_validation.py +54 -40
- chia/consensus/block_creation.py +42 -76
- chia/consensus/block_header_validation.py +32 -26
- chia/consensus/block_record.py +0 -3
- chia/consensus/blockchain.py +23 -32
- chia/consensus/blockchain_interface.py +1 -5
- chia/consensus/check_time_locks.py +57 -0
- chia/consensus/coin_store_protocol.py +151 -0
- chia/consensus/coinbase.py +0 -6
- chia/consensus/condition_costs.py +4 -0
- chia/{util → consensus}/condition_tools.py +4 -5
- chia/consensus/cost_calculator.py +1 -1
- chia/consensus/default_constants.py +32 -9
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +1 -2
- chia/consensus/find_fork_point.py +1 -3
- chia/consensus/full_block_to_block_record.py +1 -6
- chia/{util → consensus}/generator_tools.py +1 -3
- chia/consensus/get_block_challenge.py +30 -7
- chia/consensus/make_sub_epoch_summary.py +1 -5
- chia/consensus/multiprocess_validation.py +21 -20
- chia/consensus/pot_iterations.py +74 -13
- chia/{util → consensus}/prev_transaction_block.py +1 -1
- chia/consensus/vdf_info_computation.py +1 -3
- chia/daemon/keychain_proxy.py +5 -5
- chia/daemon/server.py +22 -5
- chia/data_layer/data_layer.py +92 -51
- chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
- chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
- chia/data_layer/data_layer_util.py +4 -6
- chia/data_layer/data_layer_wallet.py +42 -69
- chia/data_layer/dl_wallet_store.py +12 -6
- chia/data_layer/download_data.py +3 -3
- chia/data_layer/s3_plugin_service.py +0 -1
- chia/farmer/farmer.py +3 -4
- chia/farmer/farmer_api.py +11 -7
- chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
- chia/full_node/block_height_map.py +7 -6
- chia/full_node/block_store.py +5 -7
- chia/full_node/bundle_tools.py +1 -2
- chia/full_node/coin_store.py +143 -124
- chia/{types → full_node}/eligible_coin_spends.py +39 -70
- chia/full_node/fee_estimator.py +1 -1
- chia/full_node/fee_estimator_interface.py +0 -8
- chia/full_node/fee_tracker.py +25 -25
- chia/full_node/full_node.py +70 -53
- chia/full_node/full_node_api.py +57 -40
- chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
- chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
- chia/full_node/full_node_store.py +23 -8
- chia/full_node/mempool.py +206 -53
- chia/full_node/mempool_check_conditions.py +20 -63
- chia/full_node/mempool_manager.py +26 -40
- chia/full_node/subscriptions.py +1 -3
- chia/full_node/tx_processing_queue.py +50 -3
- chia/full_node/weight_proof.py +46 -37
- chia/harvester/harvester.py +1 -1
- chia/harvester/harvester_api.py +22 -7
- chia/introducer/introducer.py +1 -1
- chia/introducer/introducer_api.py +1 -1
- chia/plot_sync/exceptions.py +1 -1
- chia/plot_sync/receiver.py +1 -1
- chia/plot_sync/sender.py +2 -2
- chia/pools/pool_puzzles.py +13 -18
- chia/pools/pool_wallet.py +23 -46
- chia/protocols/farmer_protocol.py +11 -3
- chia/protocols/full_node_protocol.py +1 -4
- chia/protocols/harvester_protocol.py +3 -3
- chia/protocols/pool_protocol.py +1 -2
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +1 -3
- chia/protocols/wallet_protocol.py +3 -3
- chia/rpc/rpc_client.py +7 -8
- chia/rpc/rpc_server.py +3 -3
- chia/rpc/util.py +3 -1
- chia/seeder/crawler.py +1 -1
- chia/seeder/crawler_api.py +1 -1
- chia/seeder/dns_server.py +2 -0
- chia/seeder/start_crawler.py +3 -3
- chia/server/address_manager.py +286 -38
- chia/server/address_manager_store.py +0 -215
- chia/{types → server}/aliases.py +7 -7
- chia/server/api_protocol.py +1 -1
- chia/server/chia_policy.py +1 -1
- chia/server/node_discovery.py +76 -113
- chia/server/rate_limits.py +1 -1
- chia/server/resolve_peer_info.py +43 -0
- chia/server/server.py +5 -5
- chia/server/start_data_layer.py +4 -4
- chia/server/start_farmer.py +5 -4
- chia/server/start_full_node.py +5 -4
- chia/server/start_harvester.py +7 -5
- chia/server/start_introducer.py +2 -2
- chia/server/start_service.py +1 -1
- chia/server/start_timelord.py +7 -5
- chia/server/start_wallet.py +7 -5
- chia/server/ws_connection.py +1 -1
- chia/simulator/add_blocks_in_batches.py +2 -2
- chia/simulator/block_tools.py +245 -201
- chia/simulator/full_node_simulator.py +38 -10
- chia/simulator/setup_services.py +12 -12
- chia/simulator/simulator_full_node_rpc_api.py +2 -2
- chia/simulator/simulator_full_node_rpc_client.py +2 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +1 -1
- chia/simulator/wallet_tools.py +10 -18
- chia/ssl/create_ssl.py +1 -1
- chia/timelord/iters_from_block.py +14 -14
- chia/timelord/timelord.py +15 -11
- chia/timelord/timelord_api.py +14 -2
- chia/timelord/timelord_state.py +20 -14
- chia/types/blockchain_format/program.py +53 -10
- chia/types/blockchain_format/proof_of_space.py +73 -19
- chia/types/coin_spend.py +3 -56
- chia/types/generator_types.py +28 -0
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +12 -7
- chia/types/unfinished_header_block.py +1 -2
- chia/types/validation_state.py +1 -2
- chia/types/weight_proof.py +1 -3
- chia/util/action_scope.py +3 -3
- chia/util/block_cache.py +1 -2
- chia/util/byte_types.py +1 -1
- chia/util/casts.py +21 -0
- chia/util/config.py +0 -37
- chia/util/db_wrapper.py +8 -1
- chia/util/errors.py +3 -2
- chia/util/initial-config.yaml +21 -5
- chia/util/keychain.py +6 -7
- chia/util/keyring_wrapper.py +5 -5
- chia/util/limited_semaphore.py +1 -1
- chia/util/priority_mutex.py +1 -1
- chia/util/streamable.py +63 -5
- chia/util/task_timing.py +1 -1
- chia/util/virtual_project_analysis.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +7 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
- chia/wallet/cat_wallet/cat_utils.py +1 -1
- chia/wallet/cat_wallet/cat_wallet.py +44 -36
- chia/wallet/cat_wallet/lineage_store.py +7 -0
- chia/wallet/cat_wallet/r_cat_wallet.py +274 -0
- chia/wallet/conditions.py +5 -10
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
- chia/wallet/derivation_record.py +33 -0
- chia/wallet/derive_keys.py +3 -3
- chia/wallet/did_wallet/did_info.py +12 -3
- chia/wallet/did_wallet/did_wallet.py +132 -101
- chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
- chia/wallet/driver_protocol.py +3 -1
- chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
- chia/wallet/nft_wallet/nft_wallet.py +69 -112
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
- chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
- chia/wallet/nft_wallet/uncurry_nft.py +4 -6
- chia/wallet/notification_manager.py +2 -3
- chia/wallet/outer_puzzles.py +7 -2
- chia/wallet/puzzle_drivers.py +1 -1
- chia/wallet/puzzles/clawback/drivers.py +5 -4
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
- chia/wallet/puzzles/singleton_top_layer.py +2 -1
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
- chia/wallet/puzzles/tails.py +1 -3
- chia/wallet/signer_protocol.py +5 -6
- chia/wallet/singleton.py +5 -4
- chia/wallet/singleton_record.py +1 -1
- chia/wallet/trade_manager.py +18 -20
- chia/wallet/trade_record.py +3 -6
- chia/wallet/trading/offer.py +12 -13
- chia/wallet/uncurried_puzzle.py +2 -2
- chia/wallet/util/compute_additions.py +58 -0
- chia/wallet/util/compute_hints.py +3 -3
- chia/wallet/util/compute_memos.py +4 -4
- chia/wallet/util/curry_and_treehash.py +2 -1
- chia/wallet/util/debug_spend_bundle.py +1 -1
- chia/wallet/util/merkle_tree.py +1 -1
- chia/wallet/util/peer_request_cache.py +1 -2
- chia/wallet/util/tx_config.py +3 -8
- chia/wallet/util/wallet_sync_utils.py +10 -5
- chia/wallet/util/wallet_types.py +1 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
- chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
- chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
- chia/wallet/vc_wallet/vc_drivers.py +50 -8
- chia/wallet/vc_wallet/vc_store.py +3 -5
- chia/wallet/vc_wallet/vc_wallet.py +15 -22
- chia/wallet/wallet.py +36 -46
- chia/wallet/wallet_action_scope.py +73 -4
- chia/wallet/wallet_blockchain.py +1 -3
- chia/wallet/wallet_interested_store.py +1 -1
- chia/wallet/wallet_nft_store.py +3 -3
- chia/wallet/wallet_node.py +17 -16
- chia/wallet/wallet_node_api.py +4 -5
- chia/wallet/wallet_pool_store.py +1 -1
- chia/wallet/wallet_protocol.py +2 -0
- chia/wallet/wallet_puzzle_store.py +1 -1
- chia/{rpc → wallet}/wallet_request_types.py +670 -81
- chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
- chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
- chia/wallet/wallet_singleton_store.py +8 -7
- chia/wallet/wallet_spend_bundle.py +4 -3
- chia/wallet/wallet_state_manager.py +320 -191
- chia/wallet/wallet_weight_proof_handler.py +1 -2
- chia/wallet/wsm_apis.py +98 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/RECORD +443 -436
- mozilla-ca/cacert.pem +3 -165
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
- chia/cmds/dev.py +0 -18
- chia/types/blockchain_format/slots.py +0 -9
- chia/types/blockchain_format/sub_epoch_summary.py +0 -5
- chia/types/end_of_slot_bundle.py +0 -5
- chia/types/full_block.py +0 -5
- chia/types/header_block.py +0 -5
- chia/types/spend_bundle_conditions.py +0 -7
- chia/types/transaction_queue_entry.py +0 -56
- chia/types/unfinished_block.py +0 -5
- /chia/cmds/{installers.py → dev/installers.py} +0 -0
- /chia/cmds/{sim.py → dev/sim.py} +0 -0
- /chia/{util → cmds}/dump_keyring.py +0 -0
- /chia/{full_node → consensus}/signage_point.py +0 -0
- /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
- /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
- /chia/{util → full_node}/full_block_utils.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
- /chia/{full_node → protocols}/fee_estimate.py +0 -0
- /chia/{server → protocols}/outbound_message.py +0 -0
- /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
- /chia/{util → simulator}/vdf_prover.py +0 -0
- /chia/{util → ssl}/ssl_check.py +0 -0
- /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc2.dist-info → chia_blockchain-2.5.5rc2.dist-info}/entry_points.txt +0 -0
|
@@ -7,27 +7,25 @@ from collections.abc import Collection
|
|
|
7
7
|
from typing import Any, Optional, Union
|
|
8
8
|
|
|
9
9
|
import anyio
|
|
10
|
+
from chia_rs import BlockRecord, FullBlock, SpendBundle
|
|
10
11
|
from chia_rs.sized_bytes import bytes32
|
|
11
12
|
from chia_rs.sized_ints import uint8, uint32, uint64, uint128
|
|
12
13
|
|
|
14
|
+
from chia.consensus.augmented_chain import AugmentedBlockchain
|
|
13
15
|
from chia.consensus.block_body_validation import ForkInfo
|
|
14
|
-
from chia.consensus.block_record import BlockRecord
|
|
15
16
|
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
16
17
|
from chia.consensus.blockchain import BlockchainMutexPriority
|
|
17
18
|
from chia.consensus.multiprocess_validation import PreValidationResult, pre_validate_block
|
|
18
19
|
from chia.full_node.full_node import FullNode
|
|
19
20
|
from chia.full_node.full_node_api import FullNodeAPI
|
|
21
|
+
from chia.protocols.outbound_message import NodeType
|
|
20
22
|
from chia.rpc.rpc_server import default_get_connections
|
|
21
|
-
from chia.server.outbound_message import NodeType
|
|
22
23
|
from chia.simulator.add_blocks_in_batches import add_blocks_in_batches
|
|
23
24
|
from chia.simulator.block_tools import BlockTools
|
|
24
25
|
from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol
|
|
25
26
|
from chia.types.blockchain_format.coin import Coin
|
|
26
27
|
from chia.types.coin_record import CoinRecord
|
|
27
|
-
from chia.types.full_block import FullBlock
|
|
28
|
-
from chia.types.spend_bundle import SpendBundle
|
|
29
28
|
from chia.types.validation_state import ValidationState
|
|
30
|
-
from chia.util.augmented_chain import AugmentedBlockchain
|
|
31
29
|
from chia.util.config import lock_and_load_config, save_config
|
|
32
30
|
from chia.util.timing import adjusted_timeout, backoff_times
|
|
33
31
|
from chia.wallet.conditions import CreateCoin
|
|
@@ -125,7 +123,33 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
125
123
|
return self.auto_farm
|
|
126
124
|
|
|
127
125
|
async def get_all_coins(self, request: GetAllCoinsProtocol) -> list[CoinRecord]:
|
|
128
|
-
|
|
126
|
+
"""
|
|
127
|
+
Simulates fetching all coins by querying coins added at each block height.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
request: An object containing the `include_spent_coins` flag.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
A combined list of CoinRecords (including spent coins if requested).
|
|
134
|
+
"""
|
|
135
|
+
coin_records: list[CoinRecord] = []
|
|
136
|
+
current_height = 0
|
|
137
|
+
|
|
138
|
+
# `.get_peak_height` can return `None`. We use -1 in that case to exit early
|
|
139
|
+
max_block_height = self.full_node.blockchain.get_peak_height() or -1
|
|
140
|
+
|
|
141
|
+
while current_height <= max_block_height:
|
|
142
|
+
# Fetch coins added at the current block height
|
|
143
|
+
records_at_height = await self.full_node.coin_store.get_coins_added_at_height(uint32(current_height))
|
|
144
|
+
|
|
145
|
+
if not request.include_spent_coins:
|
|
146
|
+
# Filter out spent coins if not requested
|
|
147
|
+
records_at_height = [record for record in records_at_height if not record.spent]
|
|
148
|
+
|
|
149
|
+
coin_records.extend(records_at_height)
|
|
150
|
+
current_height += 1
|
|
151
|
+
|
|
152
|
+
return coin_records
|
|
129
153
|
|
|
130
154
|
async def revert_block_height(self, new_height: uint32) -> None:
|
|
131
155
|
"""
|
|
@@ -205,7 +229,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
205
229
|
await asyncio.sleep(1)
|
|
206
230
|
else:
|
|
207
231
|
current_time = False
|
|
208
|
-
mempool_bundle =
|
|
232
|
+
mempool_bundle = self.full_node.mempool_manager.create_bundle_from_mempool(curr.header_hash)
|
|
209
233
|
if mempool_bundle is None:
|
|
210
234
|
spend_bundle = None
|
|
211
235
|
else:
|
|
@@ -258,7 +282,7 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
258
282
|
await asyncio.sleep(1)
|
|
259
283
|
else:
|
|
260
284
|
current_time = False
|
|
261
|
-
mempool_bundle =
|
|
285
|
+
mempool_bundle = self.full_node.mempool_manager.create_bundle_from_mempool(curr.header_hash)
|
|
262
286
|
if mempool_bundle is None:
|
|
263
287
|
spend_bundle = None
|
|
264
288
|
else:
|
|
@@ -369,7 +393,8 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
369
393
|
if count == 0:
|
|
370
394
|
return 0
|
|
371
395
|
|
|
372
|
-
|
|
396
|
+
async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
397
|
+
target_puzzlehash = await action_scope.get_puzzle_hash(wallet.wallet_state_manager)
|
|
373
398
|
rewards = 0
|
|
374
399
|
|
|
375
400
|
block_reward_coins = set()
|
|
@@ -687,7 +712,10 @@ class FullNodeSimulator(FullNodeAPI):
|
|
|
687
712
|
for amount in amounts:
|
|
688
713
|
# We need unique puzzle hash amount combos so we'll only generate a new puzzle hash when we've already
|
|
689
714
|
# seen that amount sent to that puzzle hash
|
|
690
|
-
|
|
715
|
+
async with wallet.wallet_state_manager.new_action_scope(DEFAULT_TX_CONFIG, push=True) as action_scope:
|
|
716
|
+
puzzle_hash = await action_scope.get_puzzle_hash(
|
|
717
|
+
wallet.wallet_state_manager, override_reuse_puzhash_with=amount not in amounts_seen
|
|
718
|
+
)
|
|
691
719
|
outputs.append(CreateCoin(puzzle_hash, amount))
|
|
692
720
|
amounts_seen.add(amount)
|
|
693
721
|
|
chia/simulator/setup_services.py
CHANGED
|
@@ -18,10 +18,20 @@ from chia_rs.sized_ints import uint16
|
|
|
18
18
|
from chia.cmds.init_funcs import init
|
|
19
19
|
from chia.consensus.constants import replace_str_to_bytes
|
|
20
20
|
from chia.daemon.server import WebSocketServer, daemon_launch_lock_path
|
|
21
|
+
from chia.protocols.outbound_message import NodeType
|
|
21
22
|
from chia.protocols.shared_protocol import Capability, default_capabilities
|
|
22
23
|
from chia.seeder.dns_server import DNSServer, create_dns_server_service
|
|
23
24
|
from chia.seeder.start_crawler import create_full_node_crawler_service
|
|
24
|
-
from chia.server.
|
|
25
|
+
from chia.server.aliases import (
|
|
26
|
+
CrawlerService,
|
|
27
|
+
FarmerService,
|
|
28
|
+
FullNodeService,
|
|
29
|
+
HarvesterService,
|
|
30
|
+
IntroducerService,
|
|
31
|
+
TimelordService,
|
|
32
|
+
WalletService,
|
|
33
|
+
)
|
|
34
|
+
from chia.server.resolve_peer_info import set_peer_info
|
|
25
35
|
from chia.server.signal_handlers import SignalHandlers
|
|
26
36
|
from chia.server.start_farmer import create_farmer_service
|
|
27
37
|
from chia.server.start_full_node import create_full_node_service
|
|
@@ -35,18 +45,9 @@ from chia.simulator.ssl_certs import get_next_nodes_certs_and_keys, get_next_pri
|
|
|
35
45
|
from chia.simulator.start_simulator import SimulatorFullNodeService, create_full_node_simulator_service
|
|
36
46
|
from chia.ssl.create_ssl import create_all_ssl
|
|
37
47
|
from chia.timelord.timelord_launcher import VDFClientProcessMgr, find_vdf_client, spawn_process
|
|
38
|
-
from chia.types.aliases import (
|
|
39
|
-
CrawlerService,
|
|
40
|
-
FarmerService,
|
|
41
|
-
FullNodeService,
|
|
42
|
-
HarvesterService,
|
|
43
|
-
IntroducerService,
|
|
44
|
-
TimelordService,
|
|
45
|
-
WalletService,
|
|
46
|
-
)
|
|
47
48
|
from chia.types.peer_info import UnresolvedPeerInfo
|
|
48
49
|
from chia.util.bech32m import encode_puzzle_hash
|
|
49
|
-
from chia.util.config import config_path_for_filename, load_config, lock_and_load_config, save_config
|
|
50
|
+
from chia.util.config import config_path_for_filename, load_config, lock_and_load_config, save_config
|
|
50
51
|
from chia.util.db_wrapper import generate_in_memory_db_uri
|
|
51
52
|
from chia.util.keychain import bytes_to_mnemonic
|
|
52
53
|
from chia.util.lock import Lockfile
|
|
@@ -316,7 +317,6 @@ async def setup_wallet_node(
|
|
|
316
317
|
# filesystem operations are async on windows
|
|
317
318
|
# [WinError 32] The process cannot access the file because it is
|
|
318
319
|
# being used by another process
|
|
319
|
-
pass
|
|
320
320
|
keychain.delete_all_keys()
|
|
321
321
|
|
|
322
322
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from chia_rs import FullBlock
|
|
3
4
|
from chia_rs.sized_bytes import bytes32
|
|
4
5
|
from chia_rs.sized_ints import uint32
|
|
5
6
|
|
|
6
|
-
from chia.
|
|
7
|
+
from chia.full_node.full_node_rpc_api import FullNodeRpcApi
|
|
7
8
|
from chia.rpc.rpc_server import Endpoint, EndpointResult
|
|
8
9
|
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
9
10
|
from chia.simulator.simulator_protocol import FarmNewBlockProtocol, GetAllCoinsProtocol, ReorgProtocol
|
|
10
11
|
from chia.types.coin_record import CoinRecord
|
|
11
|
-
from chia.types.full_block import FullBlock
|
|
12
12
|
from chia.util.bech32m import decode_puzzle_hash
|
|
13
13
|
|
|
14
14
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from chia_rs import FullBlock
|
|
3
4
|
from chia_rs.sized_bytes import bytes32
|
|
4
5
|
from chia_rs.sized_ints import uint128
|
|
5
6
|
|
|
6
|
-
from chia.
|
|
7
|
+
from chia.full_node.full_node_rpc_client import FullNodeRpcClient
|
|
7
8
|
from chia.types.coin_record import CoinRecord
|
|
8
|
-
from chia.types.full_block import FullBlock
|
|
9
9
|
from chia.util.bech32m import encode_puzzle_hash
|
|
10
10
|
|
|
11
11
|
|
|
@@ -9,7 +9,6 @@ from chia_rs import PrivateKey
|
|
|
9
9
|
from chia_rs.sized_bytes import bytes32
|
|
10
10
|
from chia_rs.sized_ints import uint32
|
|
11
11
|
|
|
12
|
-
from chia.consensus.coinbase import create_puzzlehash_for_pk
|
|
13
12
|
from chia.daemon.server import WebSocketServer, daemon_launch_lock_path
|
|
14
13
|
from chia.server.signal_handlers import SignalHandlers
|
|
15
14
|
from chia.simulator.full_node_simulator import FullNodeSimulator
|
|
@@ -29,6 +28,7 @@ from chia.util.errors import KeychainFingerprintExists
|
|
|
29
28
|
from chia.util.keychain import Keychain
|
|
30
29
|
from chia.util.lock import Lockfile
|
|
31
30
|
from chia.wallet.derive_keys import master_sk_to_wallet_sk
|
|
31
|
+
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_hash_for_pk
|
|
32
32
|
|
|
33
33
|
"""
|
|
34
34
|
These functions are used to test the simulator.
|
|
@@ -56,7 +56,7 @@ def get_puzzle_hash_from_key(keychain: Keychain, fingerprint: int, key_id: int =
|
|
|
56
56
|
raise Exception("Fingerprint not found")
|
|
57
57
|
private_key = priv_key_and_entropy[0]
|
|
58
58
|
sk_for_wallet_id: PrivateKey = master_sk_to_wallet_sk(private_key, uint32(key_id))
|
|
59
|
-
puzzle_hash: bytes32 =
|
|
59
|
+
puzzle_hash: bytes32 = puzzle_hash_for_pk(sk_for_wallet_id.get_g1())
|
|
60
60
|
return puzzle_hash
|
|
61
61
|
|
|
62
62
|
|
|
@@ -12,7 +12,7 @@ from chia_rs.sized_ints import uint16
|
|
|
12
12
|
|
|
13
13
|
from chia.apis import ApiProtocolRegistry
|
|
14
14
|
from chia.full_node.full_node import FullNode
|
|
15
|
-
from chia.
|
|
15
|
+
from chia.protocols.outbound_message import NodeType
|
|
16
16
|
from chia.server.signal_handlers import SignalHandlers
|
|
17
17
|
from chia.server.start_service import Service, async_run
|
|
18
18
|
from chia.simulator.block_tools import BlockTools, test_constants
|
chia/simulator/wallet_tools.py
CHANGED
|
@@ -2,19 +2,21 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Any, Optional
|
|
4
4
|
|
|
5
|
-
from chia_rs import AugSchemeMPL, ConsensusConstants, G1Element, G2Element, PrivateKey
|
|
5
|
+
from chia_rs import AugSchemeMPL, CoinSpend, ConsensusConstants, G1Element, G2Element, PrivateKey, SpendBundle
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint32, uint64
|
|
8
|
-
from clvm.casts import int_from_bytes, int_to_bytes
|
|
9
8
|
|
|
9
|
+
from chia.consensus.condition_tools import (
|
|
10
|
+
agg_sig_additional_data,
|
|
11
|
+
conditions_dict_for_solution,
|
|
12
|
+
make_aggsig_final_message,
|
|
13
|
+
)
|
|
10
14
|
from chia.types.blockchain_format.coin import Coin
|
|
11
15
|
from chia.types.blockchain_format.program import Program
|
|
12
|
-
from chia.types.
|
|
13
|
-
from chia.types.coin_spend import CoinSpend
|
|
16
|
+
from chia.types.coin_spend import make_spend
|
|
14
17
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
15
18
|
from chia.types.condition_with_args import ConditionWithArgs
|
|
16
|
-
from chia.
|
|
17
|
-
from chia.util.condition_tools import agg_sig_additional_data, conditions_dict_for_solution, make_aggsig_final_message
|
|
19
|
+
from chia.util.casts import int_from_bytes, int_to_bytes
|
|
18
20
|
from chia.util.hash import std_hash
|
|
19
21
|
from chia.wallet.conditions import AssertCoinAnnouncement
|
|
20
22
|
from chia.wallet.derive_keys import master_sk_to_wallet_sk
|
|
@@ -160,19 +162,9 @@ class WalletTool:
|
|
|
160
162
|
ConditionWithArgs(ConditionOpcode.ASSERT_COIN_ANNOUNCEMENT, [primary_announcement_hash])
|
|
161
163
|
)
|
|
162
164
|
main_solution = self.make_solution(condition_dic)
|
|
163
|
-
spends.append(
|
|
164
|
-
CoinSpend(
|
|
165
|
-
coin, SerializedProgram.from_program(puzzle), SerializedProgram.from_program(main_solution)
|
|
166
|
-
)
|
|
167
|
-
)
|
|
165
|
+
spends.append(make_spend(coin, puzzle, main_solution))
|
|
168
166
|
else:
|
|
169
|
-
spends.append(
|
|
170
|
-
CoinSpend(
|
|
171
|
-
coin,
|
|
172
|
-
SerializedProgram.from_program(puzzle),
|
|
173
|
-
SerializedProgram.from_program(self.make_solution(secondary_coins_cond_dic)),
|
|
174
|
-
)
|
|
175
|
-
)
|
|
167
|
+
spends.append(make_spend(coin, puzzle, self.make_solution(secondary_coins_cond_dic)))
|
|
176
168
|
return spends
|
|
177
169
|
|
|
178
170
|
def sign_transaction(self, coin_spends: list[CoinSpend]) -> SpendBundle:
|
chia/ssl/create_ssl.py
CHANGED
|
@@ -13,7 +13,7 @@ from cryptography.hazmat.primitives.asymmetric import rsa
|
|
|
13
13
|
from cryptography.hazmat.primitives.serialization import load_pem_private_key
|
|
14
14
|
from cryptography.x509.oid import NameOID
|
|
15
15
|
|
|
16
|
-
from chia.
|
|
16
|
+
from chia.ssl.ssl_check import DEFAULT_PERMISSIONS_CERT_FILE, DEFAULT_PERMISSIONS_KEY_FILE
|
|
17
17
|
|
|
18
18
|
_all_private_node_names: list[str] = [
|
|
19
19
|
"full_node",
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Union
|
|
4
4
|
|
|
5
5
|
from chia_rs import ConsensusConstants, RewardChainBlock, RewardChainBlockUnfinished
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint32, uint64
|
|
8
8
|
|
|
9
|
-
from chia.consensus.pot_iterations import
|
|
10
|
-
|
|
9
|
+
from chia.consensus.pot_iterations import (
|
|
10
|
+
calculate_ip_iters,
|
|
11
|
+
calculate_sp_iters,
|
|
12
|
+
validate_pospace_and_get_required_iters,
|
|
13
|
+
)
|
|
11
14
|
|
|
12
15
|
|
|
13
16
|
def iters_from_block(
|
|
@@ -16,6 +19,7 @@ def iters_from_block(
|
|
|
16
19
|
sub_slot_iters: uint64,
|
|
17
20
|
difficulty: uint64,
|
|
18
21
|
height: uint32,
|
|
22
|
+
prev_transaction_block_height: uint32,
|
|
19
23
|
) -> tuple[uint64, uint64]:
|
|
20
24
|
if reward_chain_block.challenge_chain_sp_vdf is None:
|
|
21
25
|
assert reward_chain_block.signage_point_index == 0
|
|
@@ -23,22 +27,18 @@ def iters_from_block(
|
|
|
23
27
|
else:
|
|
24
28
|
cc_sp = reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
reward_chain_block.proof_of_space,
|
|
30
|
+
required_iters = validate_pospace_and_get_required_iters(
|
|
28
31
|
constants,
|
|
32
|
+
reward_chain_block.proof_of_space,
|
|
29
33
|
reward_chain_block.pos_ss_cc_challenge_hash,
|
|
30
34
|
cc_sp,
|
|
31
|
-
height
|
|
32
|
-
)
|
|
33
|
-
assert quality_string is not None
|
|
34
|
-
|
|
35
|
-
required_iters: uint64 = calculate_iterations_quality(
|
|
36
|
-
constants.DIFFICULTY_CONSTANT_FACTOR,
|
|
37
|
-
quality_string,
|
|
38
|
-
reward_chain_block.proof_of_space.size,
|
|
35
|
+
height,
|
|
39
36
|
difficulty,
|
|
40
|
-
|
|
37
|
+
sub_slot_iters,
|
|
38
|
+
prev_transaction_block_height,
|
|
41
39
|
)
|
|
40
|
+
assert required_iters is not None
|
|
41
|
+
|
|
42
42
|
return (
|
|
43
43
|
calculate_sp_iters(constants, sub_slot_iters, reward_chain_block.signage_point_index),
|
|
44
44
|
calculate_ip_iters(
|
chia/timelord/timelord.py
CHANGED
|
@@ -15,31 +15,32 @@ from concurrent.futures import ThreadPoolExecutor
|
|
|
15
15
|
from pathlib import Path
|
|
16
16
|
from typing import IO, TYPE_CHECKING, Any, ClassVar, Optional, cast
|
|
17
17
|
|
|
18
|
-
from chia_rs import
|
|
18
|
+
from chia_rs import (
|
|
19
|
+
ChallengeChainSubSlot,
|
|
20
|
+
ConsensusConstants,
|
|
21
|
+
EndOfSubSlotBundle,
|
|
22
|
+
InfusedChallengeChainSubSlot,
|
|
23
|
+
RewardChainBlock,
|
|
24
|
+
RewardChainSubSlot,
|
|
25
|
+
SubEpochSummary,
|
|
26
|
+
SubSlotProofs,
|
|
27
|
+
)
|
|
19
28
|
from chia_rs.sized_bytes import bytes32
|
|
20
29
|
from chia_rs.sized_ints import uint8, uint16, uint32, uint64, uint128
|
|
21
30
|
from chiavdf import create_discriminant, prove
|
|
22
31
|
|
|
23
32
|
from chia.consensus.pot_iterations import calculate_sp_iters, is_overflow_block
|
|
24
33
|
from chia.protocols import timelord_protocol
|
|
34
|
+
from chia.protocols.outbound_message import NodeType, make_msg
|
|
25
35
|
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
26
36
|
from chia.rpc.rpc_server import StateChangedProtocol, default_get_connections
|
|
27
|
-
from chia.server.outbound_message import NodeType, make_msg
|
|
28
37
|
from chia.server.server import ChiaServer
|
|
29
38
|
from chia.server.ws_connection import WSChiaConnection
|
|
30
39
|
from chia.timelord.iters_from_block import iters_from_block
|
|
31
40
|
from chia.timelord.timelord_state import LastState
|
|
32
41
|
from chia.timelord.types import Chain, IterationType, StateType
|
|
33
42
|
from chia.types.blockchain_format.classgroup import ClassgroupElement
|
|
34
|
-
from chia.types.blockchain_format.slots import (
|
|
35
|
-
ChallengeChainSubSlot,
|
|
36
|
-
InfusedChallengeChainSubSlot,
|
|
37
|
-
RewardChainSubSlot,
|
|
38
|
-
SubSlotProofs,
|
|
39
|
-
)
|
|
40
|
-
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
41
43
|
from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
|
|
42
|
-
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
43
44
|
from chia.util.streamable import Streamable, streamable
|
|
44
45
|
from chia.util.task_referencer import create_referenced_task
|
|
45
46
|
|
|
@@ -253,6 +254,7 @@ class Timelord:
|
|
|
253
254
|
sub_slot_iters,
|
|
254
255
|
difficulty,
|
|
255
256
|
self.get_height(),
|
|
257
|
+
self.last_state.get_last_tx_height(),
|
|
256
258
|
)
|
|
257
259
|
except Exception as e:
|
|
258
260
|
log.warning(f"Received invalid unfinished block: {e}.")
|
|
@@ -555,6 +557,7 @@ class Timelord:
|
|
|
555
557
|
self.last_state.get_sub_slot_iters(),
|
|
556
558
|
self.last_state.get_difficulty(),
|
|
557
559
|
self.get_height(),
|
|
560
|
+
uint32(0),
|
|
558
561
|
)
|
|
559
562
|
except Exception as e:
|
|
560
563
|
log.error(f"Error {e}")
|
|
@@ -628,7 +631,7 @@ class Timelord:
|
|
|
628
631
|
):
|
|
629
632
|
# We don't know when the last block was, so we can't make peaks
|
|
630
633
|
return
|
|
631
|
-
|
|
634
|
+
assert self.last_state.last_tx_block_block_height is not None
|
|
632
635
|
sp_total_iters = (
|
|
633
636
|
ip_total_iters
|
|
634
637
|
- ip_iters
|
|
@@ -1169,6 +1172,7 @@ class Timelord:
|
|
|
1169
1172
|
t1 = time.time()
|
|
1170
1173
|
log.info(
|
|
1171
1174
|
f"Working on compact proof for height: {picked_info.height}. "
|
|
1175
|
+
f"VDF: {picked_info.field_vdf}. "
|
|
1172
1176
|
f"Iters: {picked_info.new_proof_of_time.number_of_iterations}."
|
|
1173
1177
|
)
|
|
1174
1178
|
bluebox_process_data = BlueboxProcessData(
|
chia/timelord/timelord_api.py
CHANGED
|
@@ -38,7 +38,7 @@ class TimelordAPI:
|
|
|
38
38
|
self.timelord.state_changed_callback = callback
|
|
39
39
|
|
|
40
40
|
@metadata.request()
|
|
41
|
-
async def new_peak_timelord(self, new_peak:
|
|
41
|
+
async def new_peak_timelord(self, new_peak: NewPeakTimelord) -> None:
|
|
42
42
|
if self.timelord.last_state is None:
|
|
43
43
|
return None
|
|
44
44
|
async with self.timelord.lock:
|
|
@@ -63,6 +63,8 @@ class TimelordAPI:
|
|
|
63
63
|
"Not skipping peak, has equal weight but lower iterations,"
|
|
64
64
|
f"current peak:{self.timelord.last_state.total_iters} new peak "
|
|
65
65
|
f"{new_peak.reward_chain_block.total_iters}"
|
|
66
|
+
f"current rh: {self.timelord.last_state.peak.reward_chain_block.get_hash()}"
|
|
67
|
+
f"new peak rh: {new_peak.reward_chain_block.get_hash()}"
|
|
66
68
|
)
|
|
67
69
|
self.timelord.new_peak = new_peak
|
|
68
70
|
self.timelord.state_changed("new_peak", {"height": new_peak.reward_chain_block.height})
|
|
@@ -82,7 +84,7 @@ class TimelordAPI:
|
|
|
82
84
|
log.info(
|
|
83
85
|
"Not skipping peak, don't have. Maybe we are not the fastest timelord "
|
|
84
86
|
f"height: {new_peak.reward_chain_block.height} weight:"
|
|
85
|
-
f"{new_peak.reward_chain_block.weight} "
|
|
87
|
+
f"{new_peak.reward_chain_block.weight} rh {new_peak.reward_chain_block.get_hash()}"
|
|
86
88
|
)
|
|
87
89
|
self.timelord.new_peak = new_peak
|
|
88
90
|
self.timelord.state_changed("new_peak", {"height": new_peak.reward_chain_block.height})
|
|
@@ -99,13 +101,22 @@ class TimelordAPI:
|
|
|
99
101
|
self.timelord.state_changed("skipping_peak", {"height": new_peak.reward_chain_block.height})
|
|
100
102
|
|
|
101
103
|
def check_orphaned_unfinished_block(self, new_peak: NewPeakTimelord):
|
|
104
|
+
new_peak_unf_rh = new_peak.reward_chain_block.get_unfinished().get_hash()
|
|
102
105
|
for unf_block in self.timelord.unfinished_blocks:
|
|
103
106
|
if unf_block.reward_chain_block.total_iters <= new_peak.reward_chain_block.total_iters:
|
|
107
|
+
if unf_block.reward_chain_block.get_hash() == new_peak_unf_rh:
|
|
108
|
+
log.debug("unfinished block is the same as the new peak")
|
|
109
|
+
continue
|
|
104
110
|
# there is an unfinished block that would be orphaned by this peak
|
|
111
|
+
log.info(f"this peak would orphan unfinished block {unf_block.reward_chain_block.get_hash()}")
|
|
105
112
|
return True
|
|
106
113
|
for unf_block in self.timelord.overflow_blocks:
|
|
107
114
|
if unf_block.reward_chain_block.total_iters <= new_peak.reward_chain_block.total_iters:
|
|
115
|
+
if unf_block.reward_chain_block.get_hash() == new_peak_unf_rh:
|
|
116
|
+
log.debug("overflow unfinished block is the same as the new peak")
|
|
117
|
+
continue
|
|
108
118
|
# there is an unfinished block (overflow) that would be orphaned by this peak
|
|
119
|
+
log.info(f"this peak would orphan unfinished overflow block {unf_block.reward_chain_block.get_hash()}")
|
|
109
120
|
return True
|
|
110
121
|
return False
|
|
111
122
|
|
|
@@ -123,6 +134,7 @@ class TimelordAPI:
|
|
|
123
134
|
self.timelord.last_state.get_sub_slot_iters(),
|
|
124
135
|
self.timelord.last_state.get_difficulty(),
|
|
125
136
|
self.timelord.get_height(),
|
|
137
|
+
self.timelord.last_state.get_last_tx_height(),
|
|
126
138
|
)
|
|
127
139
|
except Exception:
|
|
128
140
|
return None
|
chia/timelord/timelord_state.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import logging
|
|
4
4
|
from typing import Optional, Union
|
|
5
5
|
|
|
6
|
-
from chia_rs import ConsensusConstants
|
|
6
|
+
from chia_rs import ChallengeBlockInfo, ConsensusConstants, EndOfSubSlotBundle, SubEpochSummary
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
8
8
|
from chia_rs.sized_ints import uint8, uint32, uint64, uint128
|
|
9
9
|
|
|
@@ -11,9 +11,6 @@ from chia.protocols import timelord_protocol
|
|
|
11
11
|
from chia.timelord.iters_from_block import iters_from_block
|
|
12
12
|
from chia.timelord.types import Chain, StateType
|
|
13
13
|
from chia.types.blockchain_format.classgroup import ClassgroupElement
|
|
14
|
-
from chia.types.blockchain_format.slots import ChallengeBlockInfo
|
|
15
|
-
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
16
|
-
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
17
14
|
|
|
18
15
|
log = logging.getLogger(__name__)
|
|
19
16
|
|
|
@@ -41,7 +38,9 @@ class LastState:
|
|
|
41
38
|
self.last_height: uint32 = uint32(0)
|
|
42
39
|
self.total_iters: uint128 = uint128(0)
|
|
43
40
|
self.last_challenge_sb_or_eos_total_iters = uint128(0)
|
|
44
|
-
self.
|
|
41
|
+
self.last_tx_block_total_iters: Optional[uint128] = None
|
|
42
|
+
self.last_tx_block_block_height: uint32 = uint32(0)
|
|
43
|
+
self.last_tx_block_sp_index: uint8 = uint8(0)
|
|
45
44
|
self.last_peak_challenge: bytes32 = constants.GENESIS_CHALLENGE
|
|
46
45
|
self.difficulty: uint64 = constants.DIFFICULTY_STARTING
|
|
47
46
|
self.sub_slot_iters: uint64 = constants.SUB_SLOT_ITERS_STARTING
|
|
@@ -55,13 +54,7 @@ class LastState:
|
|
|
55
54
|
self.state_type = StateType.PEAK
|
|
56
55
|
self.peak = state
|
|
57
56
|
self.subslot_end = None
|
|
58
|
-
|
|
59
|
-
self.constants,
|
|
60
|
-
state.reward_chain_block,
|
|
61
|
-
state.sub_slot_iters,
|
|
62
|
-
state.difficulty,
|
|
63
|
-
state.reward_chain_block.height,
|
|
64
|
-
)
|
|
57
|
+
|
|
65
58
|
self.deficit = state.deficit
|
|
66
59
|
self.sub_epoch_summary = state.sub_epoch_summary
|
|
67
60
|
self.last_weight = state.reward_chain_block.weight
|
|
@@ -71,7 +64,17 @@ class LastState:
|
|
|
71
64
|
self.difficulty = state.difficulty
|
|
72
65
|
self.sub_slot_iters = state.sub_slot_iters
|
|
73
66
|
if state.reward_chain_block.is_transaction_block:
|
|
74
|
-
self.
|
|
67
|
+
self.last_tx_block_block_height = state.reward_chain_block.height
|
|
68
|
+
self.last_tx_block_total_iters = self.total_iters
|
|
69
|
+
self.last_tx_block_sp_index = state.reward_chain_block.signage_point_index
|
|
70
|
+
_, self.last_ip = iters_from_block(
|
|
71
|
+
self.constants,
|
|
72
|
+
state.reward_chain_block,
|
|
73
|
+
state.sub_slot_iters,
|
|
74
|
+
state.difficulty,
|
|
75
|
+
state.reward_chain_block.height,
|
|
76
|
+
self.last_tx_block_block_height,
|
|
77
|
+
)
|
|
75
78
|
self.reward_challenge_cache = state.previous_reward_challenges
|
|
76
79
|
self.last_challenge_sb_or_eos_total_iters = self.peak.last_challenge_sb_or_eos_total_iters
|
|
77
80
|
self.new_epoch = False
|
|
@@ -171,7 +174,10 @@ class LastState:
|
|
|
171
174
|
return None
|
|
172
175
|
|
|
173
176
|
def get_last_block_total_iters(self) -> Optional[uint128]:
|
|
174
|
-
return self.
|
|
177
|
+
return self.last_tx_block_total_iters
|
|
178
|
+
|
|
179
|
+
def get_last_tx_height(self) -> uint32:
|
|
180
|
+
return self.last_tx_block_block_height
|
|
175
181
|
|
|
176
182
|
def get_passed_ses_height_but_not_yet_included(self) -> bool:
|
|
177
183
|
return self.passed_ses_height_but_not_yet_included
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import io
|
|
4
|
-
from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union
|
|
5
5
|
|
|
6
|
-
from chia_rs import
|
|
6
|
+
from chia_rs import MEMPOOL_MODE, run_chia_program, tree_hash
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
8
|
-
from clvm.casts import int_from_bytes
|
|
9
8
|
from clvm.CLVMObject import CLVMStorage
|
|
10
9
|
from clvm.EvalError import EvalError
|
|
11
10
|
from clvm.serialize import sexp_from_stream, sexp_to_stream
|
|
12
11
|
from clvm.SExp import SExp
|
|
12
|
+
from typing_extensions import Self
|
|
13
13
|
|
|
14
|
+
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
14
15
|
from chia.types.blockchain_format.tree_hash import sha256_treehash
|
|
15
16
|
from chia.util.byte_types import hexstr_to_bytes
|
|
17
|
+
from chia.util.casts import int_from_bytes
|
|
16
18
|
from chia.util.hash import std_hash
|
|
17
19
|
|
|
18
20
|
INFINITE_COST = 11000000000
|
|
19
21
|
|
|
20
|
-
DEFAULT_FLAGS = MEMPOOL_MODE
|
|
22
|
+
DEFAULT_FLAGS = MEMPOOL_MODE
|
|
21
23
|
|
|
22
24
|
T_CLVMStorage = TypeVar("T_CLVMStorage", bound=CLVMStorage)
|
|
23
25
|
T_Program = TypeVar("T_Program", bound="Program")
|
|
@@ -29,14 +31,27 @@ class Program(SExp):
|
|
|
29
31
|
"""
|
|
30
32
|
|
|
31
33
|
@classmethod
|
|
32
|
-
def parse(cls
|
|
34
|
+
def parse(cls, f) -> Self:
|
|
33
35
|
return sexp_from_stream(f, cls.to)
|
|
34
36
|
|
|
35
|
-
def stream(self, f):
|
|
37
|
+
def stream(self, f) -> None:
|
|
36
38
|
sexp_to_stream(self, f)
|
|
37
39
|
|
|
38
40
|
@classmethod
|
|
39
|
-
def
|
|
41
|
+
def from_serialized(cls, prg: SerializedProgram) -> Self:
|
|
42
|
+
"""
|
|
43
|
+
Convert the SerializedProgram to a Program object.
|
|
44
|
+
"""
|
|
45
|
+
return cls.from_bytes(bytes(prg))
|
|
46
|
+
|
|
47
|
+
def to_serialized(self) -> SerializedProgram:
|
|
48
|
+
"""
|
|
49
|
+
Convert a Program object to a SerializedProgram.
|
|
50
|
+
"""
|
|
51
|
+
return SerializedProgram.from_bytes(bytes(self))
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
def from_bytes(cls, blob: bytes) -> Self:
|
|
40
55
|
# this runs the program "1", which just returns the first argument.
|
|
41
56
|
# the first argument is the buffer we want to parse. This effectively
|
|
42
57
|
# leverages the rust parser and LazyNode, making it a lot faster to
|
|
@@ -50,7 +65,7 @@ class Program(SExp):
|
|
|
50
65
|
return cls.to(ret)
|
|
51
66
|
|
|
52
67
|
@classmethod
|
|
53
|
-
def fromhex(cls
|
|
68
|
+
def fromhex(cls, hexstr: str) -> Self:
|
|
54
69
|
return cls.from_bytes(hexstr_to_bytes(hexstr))
|
|
55
70
|
|
|
56
71
|
@classmethod
|
|
@@ -90,7 +105,7 @@ class Program(SExp):
|
|
|
90
105
|
raise ValueError(f"`at` got illegal character `{c}`. Only `f` & `r` allowed")
|
|
91
106
|
return v
|
|
92
107
|
|
|
93
|
-
def replace(self
|
|
108
|
+
def replace(self, **kwargs: Any) -> Self:
|
|
94
109
|
"""
|
|
95
110
|
Create a new program replacing the given paths (using `at` syntax).
|
|
96
111
|
Example:
|
|
@@ -155,7 +170,7 @@ class Program(SExp):
|
|
|
155
170
|
# (2 (1 . self) rest)
|
|
156
171
|
#
|
|
157
172
|
# Resulting in a function which places its own arguments after those
|
|
158
|
-
# curried in
|
|
173
|
+
# curried in the form of a proper list.
|
|
159
174
|
def curry(self, *args) -> Program:
|
|
160
175
|
fixed_args: Any = 1
|
|
161
176
|
for arg in reversed(args):
|
|
@@ -267,3 +282,31 @@ def _sexp_replace(sexp: T_CLVMStorage, to_sexp: Callable[[Any], T_Program], **kw
|
|
|
267
282
|
new_r = _sexp_replace(pair[1], to_sexp, **args_by_prefix.get("r", {}))
|
|
268
283
|
|
|
269
284
|
return to_sexp((new_f, new_r))
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def _run(prg: Union[SerializedProgram, Program], max_cost: int, flags: int, args: Any) -> tuple[int, Program]:
|
|
288
|
+
if isinstance(prg, SerializedProgram):
|
|
289
|
+
result = prg.run_rust(max_cost, flags, args)
|
|
290
|
+
return result[0], Program(result[1]) # type: ignore[arg-type]
|
|
291
|
+
else:
|
|
292
|
+
return prg._run(max_cost, flags, args)
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def uncurry(prg: Union[SerializedProgram, Program]) -> tuple[Program, Program]:
|
|
296
|
+
if isinstance(prg, SerializedProgram):
|
|
297
|
+
result = prg.uncurry_rust()
|
|
298
|
+
return Program(result[0]), Program(result[1]) # type: ignore[arg-type]
|
|
299
|
+
else:
|
|
300
|
+
return prg.uncurry()
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def run(prg: Union[SerializedProgram, Program], args: Any) -> Program:
|
|
304
|
+
return _run(prg, INFINITE_COST, 0, args)[1]
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def run_with_cost(prg: Union[SerializedProgram, Program], max_cost: int, args: Any) -> tuple[int, Program]:
|
|
308
|
+
return _run(prg, max_cost, 0, args)
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def run_mempool_with_cost(prg: Union[SerializedProgram, Program], max_cost: int, args: Any) -> tuple[int, Program]:
|
|
312
|
+
return _run(prg, max_cost, MEMPOOL_MODE, args)
|