chia-blockchain 2.5.0rc2__py3-none-any.whl → 2.5.1rc2__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/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1rc2.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc2.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc2.dist-info → chia_blockchain-2.5.1rc2.dist-info}/entry_points.txt +0 -0
|
@@ -4,7 +4,7 @@ import asyncio
|
|
|
4
4
|
import dataclasses
|
|
5
5
|
import logging
|
|
6
6
|
import time
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Optional
|
|
8
8
|
|
|
9
9
|
from chia.consensus.block_record import BlockRecord
|
|
10
10
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
@@ -33,8 +33,8 @@ log = logging.getLogger(__name__)
|
|
|
33
33
|
@dataclasses.dataclass(frozen=True)
|
|
34
34
|
class FullNodeStorePeakResult(Streamable):
|
|
35
35
|
added_eos: Optional[EndOfSubSlotBundle]
|
|
36
|
-
new_signage_points:
|
|
37
|
-
new_infusion_points:
|
|
36
|
+
new_signage_points: list[tuple[uint8, SignagePoint]]
|
|
37
|
+
new_infusion_points: list[timelord_protocol.NewInfusionPointVDF]
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
@dataclasses.dataclass
|
|
@@ -49,8 +49,8 @@ class UnfinishedBlockEntry:
|
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
def find_best_block(
|
|
52
|
-
result:
|
|
53
|
-
) ->
|
|
52
|
+
result: dict[Optional[bytes32], UnfinishedBlockEntry],
|
|
53
|
+
) -> tuple[Optional[bytes32], Optional[UnfinishedBlock]]:
|
|
54
54
|
"""
|
|
55
55
|
Given a collection of UnfinishedBlocks (all with the same reward block
|
|
56
56
|
hash), return the "best" one. i.e. the one with the smallest foliage hash.
|
|
@@ -67,7 +67,7 @@ def find_best_block(
|
|
|
67
67
|
else:
|
|
68
68
|
return foliage_hash, entry.unfinished_block
|
|
69
69
|
|
|
70
|
-
def include_block(item:
|
|
70
|
+
def include_block(item: tuple[Optional[bytes32], UnfinishedBlockEntry]) -> bool:
|
|
71
71
|
foliage_hash, entry = item
|
|
72
72
|
return foliage_hash is not None and entry.unfinished_block is not None
|
|
73
73
|
|
|
@@ -88,14 +88,14 @@ class FullNodeStore:
|
|
|
88
88
|
constants: ConsensusConstants
|
|
89
89
|
|
|
90
90
|
# Blocks which we have created, but don't have plot signatures yet, so not yet "unfinished blocks"
|
|
91
|
-
candidate_blocks:
|
|
92
|
-
candidate_backup_blocks:
|
|
91
|
+
candidate_blocks: dict[bytes32, tuple[uint32, UnfinishedBlock]]
|
|
92
|
+
candidate_backup_blocks: dict[bytes32, tuple[uint32, UnfinishedBlock]]
|
|
93
93
|
|
|
94
94
|
# Block hashes of unfinished blocks that we have seen recently. This is
|
|
95
|
-
# effectively a
|
|
95
|
+
# effectively a set[bytes32] but in order to evict the oldest items first,
|
|
96
96
|
# we use a Dict that preserves insertion order, and remove from the
|
|
97
97
|
# beginning
|
|
98
|
-
seen_unfinished_blocks:
|
|
98
|
+
seen_unfinished_blocks: dict[bytes32, None]
|
|
99
99
|
|
|
100
100
|
# Unfinished blocks, keyed from reward hash
|
|
101
101
|
# There may be multiple different unfinished blocks with the same partial
|
|
@@ -107,36 +107,36 @@ class FullNodeStore:
|
|
|
107
107
|
# The inner key (the foliage hash) is Optional, where None either means
|
|
108
108
|
# it's not a transaction block, or it's a block we learned about via the old
|
|
109
109
|
# protocol, where all we get is the reward block hash.
|
|
110
|
-
_unfinished_blocks:
|
|
110
|
+
_unfinished_blocks: dict[bytes32, dict[Optional[bytes32], UnfinishedBlockEntry]]
|
|
111
111
|
|
|
112
112
|
# Finished slots and sps from the peak's slot onwards
|
|
113
113
|
# We store all 32 SPs for each slot, starting as 32 Nones and filling them as we go
|
|
114
114
|
# Also stores the total iters at the end of slot
|
|
115
115
|
# For the first sub-slot, EndOfSlotBundle is None
|
|
116
|
-
finished_sub_slots:
|
|
116
|
+
finished_sub_slots: list[tuple[Optional[EndOfSubSlotBundle], list[Optional[SignagePoint]], uint128]]
|
|
117
117
|
|
|
118
118
|
# These caches maintain objects which depend on infused blocks in the reward chain, that we
|
|
119
119
|
# might receive before the blocks themselves. The dict keys are the reward chain challenge hashes.
|
|
120
120
|
|
|
121
121
|
# End of slots which depend on infusions that we don't have
|
|
122
|
-
future_eos_cache:
|
|
122
|
+
future_eos_cache: dict[bytes32, list[EndOfSubSlotBundle]]
|
|
123
123
|
|
|
124
124
|
# Signage points which depend on infusions that we don't have
|
|
125
|
-
future_sp_cache:
|
|
125
|
+
future_sp_cache: dict[bytes32, list[tuple[uint8, SignagePoint]]]
|
|
126
126
|
|
|
127
127
|
# Infusion point VDFs which depend on infusions that we don't have
|
|
128
|
-
future_ip_cache:
|
|
128
|
+
future_ip_cache: dict[bytes32, list[timelord_protocol.NewInfusionPointVDF]]
|
|
129
129
|
|
|
130
130
|
# This stores the time that each key was added to the future cache, so we can clear old keys
|
|
131
|
-
future_cache_key_times:
|
|
131
|
+
future_cache_key_times: dict[bytes32, int]
|
|
132
132
|
|
|
133
133
|
# These recent caches are for pooling support
|
|
134
|
-
recent_signage_points: LRUCache[bytes32,
|
|
135
|
-
recent_eos: LRUCache[bytes32,
|
|
134
|
+
recent_signage_points: LRUCache[bytes32, tuple[SignagePoint, float]]
|
|
135
|
+
recent_eos: LRUCache[bytes32, tuple[EndOfSubSlotBundle, float]]
|
|
136
136
|
|
|
137
|
-
pending_tx_request:
|
|
138
|
-
peers_with_tx:
|
|
139
|
-
tx_fetch_tasks:
|
|
137
|
+
pending_tx_request: dict[bytes32, bytes32] # tx_id: peer_id
|
|
138
|
+
peers_with_tx: dict[bytes32, set[bytes32]] # tx_id: set[peer_ids}
|
|
139
|
+
tx_fetch_tasks: dict[bytes32, asyncio.Task[None]] # Task id: task
|
|
140
140
|
serialized_wp_message: Optional[Message]
|
|
141
141
|
serialized_wp_message_tip: Optional[bytes32]
|
|
142
142
|
|
|
@@ -166,7 +166,7 @@ class FullNodeStore:
|
|
|
166
166
|
|
|
167
167
|
def is_requesting_unfinished_block(
|
|
168
168
|
self, reward_block_hash: bytes32, foliage_hash: Optional[bytes32]
|
|
169
|
-
) ->
|
|
169
|
+
) -> tuple[bool, int]:
|
|
170
170
|
"""
|
|
171
171
|
Asks if we are already requesting this specific unfinished block (given
|
|
172
172
|
the reward block hash and foliage hash). The returned bool is true if we
|
|
@@ -212,7 +212,7 @@ class FullNodeStore:
|
|
|
212
212
|
|
|
213
213
|
def get_candidate_block(
|
|
214
214
|
self, quality_string: bytes32, backup: bool = False
|
|
215
|
-
) -> Optional[
|
|
215
|
+
) -> Optional[tuple[uint32, UnfinishedBlock]]:
|
|
216
216
|
if backup:
|
|
217
217
|
return self.candidate_backup_blocks.get(quality_string, None)
|
|
218
218
|
else:
|
|
@@ -268,12 +268,12 @@ class FullNodeStore:
|
|
|
268
268
|
# deterministic property.
|
|
269
269
|
# this sorts the UnfinishedBlocks by the foliage hash, and picks the
|
|
270
270
|
# smallest hash
|
|
271
|
-
|
|
271
|
+
_foliage_hash, block = find_best_block(result)
|
|
272
272
|
return block
|
|
273
273
|
|
|
274
274
|
def get_unfinished_block2(
|
|
275
275
|
self, unfinished_reward_hash: bytes32, unfinished_foliage_hash: Optional[bytes32]
|
|
276
|
-
) ->
|
|
276
|
+
) -> tuple[Optional[UnfinishedBlock], int, bool]:
|
|
277
277
|
"""
|
|
278
278
|
Looks up an UnfinishedBlock by its reward block hash and foliage hash.
|
|
279
279
|
If the foliage hash is None (e.g. it's not a transaction block), we fall
|
|
@@ -315,8 +315,8 @@ class FullNodeStore:
|
|
|
315
315
|
return result.get(unfinished_foliage_hash)
|
|
316
316
|
|
|
317
317
|
# returns all unfinished blocks for the specified height
|
|
318
|
-
def get_unfinished_blocks(self, height: uint32) ->
|
|
319
|
-
ret:
|
|
318
|
+
def get_unfinished_blocks(self, height: uint32) -> list[UnfinishedBlock]:
|
|
319
|
+
ret: list[UnfinishedBlock] = []
|
|
320
320
|
for entry in self._unfinished_blocks.values():
|
|
321
321
|
for ube in entry.values():
|
|
322
322
|
if ube.height == height and ube.unfinished_block is not None:
|
|
@@ -324,9 +324,9 @@ class FullNodeStore:
|
|
|
324
324
|
return ret
|
|
325
325
|
|
|
326
326
|
def clear_unfinished_blocks_below(self, height: uint32) -> None:
|
|
327
|
-
del_partial:
|
|
327
|
+
del_partial: list[bytes32] = []
|
|
328
328
|
for partial_hash, entry in self._unfinished_blocks.items():
|
|
329
|
-
del_foliage:
|
|
329
|
+
del_foliage: list[Optional[bytes32]] = []
|
|
330
330
|
for foliage_hash, ube in entry.items():
|
|
331
331
|
if ube.height < height:
|
|
332
332
|
del_foliage.append(foliage_hash)
|
|
@@ -377,12 +377,12 @@ class FullNodeStore:
|
|
|
377
377
|
self.future_sp_cache[signage_point.rc_vdf.challenge].append((index, signage_point))
|
|
378
378
|
log.info(f"Don't have rc hash {signage_point.rc_vdf.challenge.hex()}. caching signage point {index}.")
|
|
379
379
|
|
|
380
|
-
def get_future_ip(self, rc_challenge_hash: bytes32) ->
|
|
380
|
+
def get_future_ip(self, rc_challenge_hash: bytes32) -> list[timelord_protocol.NewInfusionPointVDF]:
|
|
381
381
|
return self.future_ip_cache.get(rc_challenge_hash, [])
|
|
382
382
|
|
|
383
383
|
def clear_old_cache_entries(self) -> None:
|
|
384
384
|
current_time: int = int(time.time())
|
|
385
|
-
remove_keys:
|
|
385
|
+
remove_keys: list[bytes32] = []
|
|
386
386
|
for rc_hash, time_added in self.future_cache_key_times.items():
|
|
387
387
|
if current_time - time_added > 3600:
|
|
388
388
|
remove_keys.append(rc_hash)
|
|
@@ -395,7 +395,7 @@ class FullNodeStore:
|
|
|
395
395
|
def clear_slots(self) -> None:
|
|
396
396
|
self.finished_sub_slots.clear()
|
|
397
397
|
|
|
398
|
-
def get_sub_slot(self, challenge_hash: bytes32) -> Optional[
|
|
398
|
+
def get_sub_slot(self, challenge_hash: bytes32) -> Optional[tuple[EndOfSubSlotBundle, int, uint128]]:
|
|
399
399
|
assert len(self.finished_sub_slots) >= 1
|
|
400
400
|
for index, (sub_slot, _, total_iters) in enumerate(self.finished_sub_slots):
|
|
401
401
|
if sub_slot is not None and sub_slot.challenge_chain.get_hash() == challenge_hash:
|
|
@@ -414,7 +414,7 @@ class FullNodeStore:
|
|
|
414
414
|
next_sub_slot_iters: uint64,
|
|
415
415
|
next_difficulty: uint64,
|
|
416
416
|
peak_full_block: Optional[FullBlock],
|
|
417
|
-
) -> Optional[
|
|
417
|
+
) -> Optional[list[timelord_protocol.NewInfusionPointVDF]]:
|
|
418
418
|
"""
|
|
419
419
|
Returns false if not added. Returns a list if added. The list contains all infusion points that depended
|
|
420
420
|
on this sub slot
|
|
@@ -671,7 +671,7 @@ class FullNodeStore:
|
|
|
671
671
|
new_cc_hash = eos.challenge_chain.get_hash()
|
|
672
672
|
self.recent_eos.put(new_cc_hash, (eos, time.time()))
|
|
673
673
|
|
|
674
|
-
new_ips:
|
|
674
|
+
new_ips: list[timelord_protocol.NewInfusionPointVDF] = []
|
|
675
675
|
for ip in self.future_ip_cache.get(eos.reward_chain.get_hash(), []):
|
|
676
676
|
new_ips.append(ip)
|
|
677
677
|
|
|
@@ -904,8 +904,8 @@ class FullNodeStore:
|
|
|
904
904
|
self.initialize_genesis_sub_slot()
|
|
905
905
|
else:
|
|
906
906
|
# This is not the first sub-slot in the chain
|
|
907
|
-
sp_sub_slot_sps:
|
|
908
|
-
ip_sub_slot_sps:
|
|
907
|
+
sp_sub_slot_sps: list[Optional[SignagePoint]] = [None] * self.constants.NUM_SPS_SUB_SLOT
|
|
908
|
+
ip_sub_slot_sps: list[Optional[SignagePoint]] = [None] * self.constants.NUM_SPS_SUB_SLOT
|
|
909
909
|
|
|
910
910
|
if fork_block is not None and fork_block.sub_slot_iters != peak.sub_slot_iters:
|
|
911
911
|
# If there was a reorg and a difficulty adjustment, just clear all the slots
|
|
@@ -921,7 +921,7 @@ class FullNodeStore:
|
|
|
921
921
|
if fork_block is None:
|
|
922
922
|
# If this is not a reorg, we still want to remove signage points after the new peak
|
|
923
923
|
fork_block = peak
|
|
924
|
-
replaced_sps:
|
|
924
|
+
replaced_sps: list[Optional[SignagePoint]] = [] # index 0 is the end of sub slot
|
|
925
925
|
for i, sp in enumerate(sps):
|
|
926
926
|
if (total_iters + i * interval_iters) < fork_block.total_iters:
|
|
927
927
|
# Sps before the fork point as still valid
|
|
@@ -951,10 +951,10 @@ class FullNodeStore:
|
|
|
951
951
|
self.finished_sub_slots.append((ip_sub_slot, ip_sub_slot_sps, ip_sub_slot_total_iters))
|
|
952
952
|
|
|
953
953
|
new_eos: Optional[EndOfSubSlotBundle] = None
|
|
954
|
-
new_sps:
|
|
955
|
-
new_ips:
|
|
954
|
+
new_sps: list[tuple[uint8, SignagePoint]] = []
|
|
955
|
+
new_ips: list[timelord_protocol.NewInfusionPointVDF] = []
|
|
956
956
|
|
|
957
|
-
future_eos:
|
|
957
|
+
future_eos: list[EndOfSubSlotBundle] = self.future_eos_cache.get(peak.reward_infusion_new_challenge, []).copy()
|
|
958
958
|
for eos in future_eos:
|
|
959
959
|
if (
|
|
960
960
|
self.new_finished_sub_slot(eos, blocks, peak, next_sub_slot_iters, next_difficulty, peak_full_block)
|
|
@@ -963,7 +963,7 @@ class FullNodeStore:
|
|
|
963
963
|
new_eos = eos
|
|
964
964
|
break
|
|
965
965
|
|
|
966
|
-
future_sps:
|
|
966
|
+
future_sps: list[tuple[uint8, SignagePoint]] = self.future_sp_cache.get(
|
|
967
967
|
peak.reward_infusion_new_challenge, []
|
|
968
968
|
).copy()
|
|
969
969
|
for index, sp in future_sps:
|
|
@@ -990,7 +990,7 @@ class FullNodeStore:
|
|
|
990
990
|
block_records: BlockRecordsProtocol,
|
|
991
991
|
prev_b: Optional[BlockRecord],
|
|
992
992
|
last_challenge_to_add: bytes32,
|
|
993
|
-
) -> Optional[
|
|
993
|
+
) -> Optional[list[EndOfSubSlotBundle]]:
|
|
994
994
|
"""
|
|
995
995
|
Retrieves the EndOfSubSlotBundles that are in the store either:
|
|
996
996
|
1. From the starting challenge if prev_b is None
|
|
@@ -1015,7 +1015,7 @@ class FullNodeStore:
|
|
|
1015
1015
|
# No additional slots to add
|
|
1016
1016
|
return []
|
|
1017
1017
|
|
|
1018
|
-
collected_sub_slots:
|
|
1018
|
+
collected_sub_slots: list[EndOfSubSlotBundle] = []
|
|
1019
1019
|
found_last_challenge = False
|
|
1020
1020
|
found_connecting_challenge = False
|
|
1021
1021
|
for sub_slot, sps, total_iters in self.finished_sub_slots[1:]:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Callable,
|
|
3
|
+
from typing import Callable, Optional
|
|
4
4
|
|
|
5
5
|
from chia.consensus.blockchain import StateChangeSummary
|
|
6
6
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -10,16 +10,16 @@ def get_hints_and_subscription_coin_ids(
|
|
|
10
10
|
state_change_summary: StateChangeSummary,
|
|
11
11
|
has_coin_subscription: Callable[[bytes32], bool],
|
|
12
12
|
has_puzzle_subscription: Callable[[bytes32], bool],
|
|
13
|
-
) ->
|
|
13
|
+
) -> tuple[list[tuple[bytes32, bytes]], list[bytes32]]:
|
|
14
14
|
# Precondition: all hints passed in are max 32 bytes long
|
|
15
15
|
# Returns the hints that we need to add to the DB, and the coin ids that need to be looked up
|
|
16
16
|
|
|
17
17
|
# Finds the coin IDs that we need to lookup in order to notify wallets of hinted transactions
|
|
18
18
|
hint: Optional[bytes]
|
|
19
|
-
hints_to_add:
|
|
19
|
+
hints_to_add: list[tuple[bytes32, bytes]] = []
|
|
20
20
|
|
|
21
21
|
# Goes through additions and removals for each block and flattens to a map and a set
|
|
22
|
-
lookup_coin_ids:
|
|
22
|
+
lookup_coin_ids: set[bytes32] = set()
|
|
23
23
|
|
|
24
24
|
def add_if_coin_subscription(coin_id: bytes32) -> None:
|
|
25
25
|
if has_coin_subscription(coin_id):
|
chia/full_node/hint_store.py
CHANGED
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
import logging
|
|
5
|
-
from typing import List, Set, Tuple
|
|
6
5
|
|
|
7
6
|
import typing_extensions
|
|
8
7
|
|
|
@@ -32,23 +31,23 @@ class HintStore:
|
|
|
32
31
|
await conn.execute("CREATE INDEX IF NOT EXISTS hint_index on hints(hint)")
|
|
33
32
|
return self
|
|
34
33
|
|
|
35
|
-
async def get_coin_ids(self, hint: bytes, *, max_items: int = 50000) ->
|
|
34
|
+
async def get_coin_ids(self, hint: bytes, *, max_items: int = 50000) -> list[bytes32]:
|
|
36
35
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
37
36
|
cursor = await conn.execute("SELECT coin_id from hints WHERE hint=? LIMIT ?", (hint, max_items))
|
|
38
37
|
rows = await cursor.fetchall()
|
|
39
38
|
await cursor.close()
|
|
40
39
|
return [bytes32(row[0]) for row in rows]
|
|
41
40
|
|
|
42
|
-
async def get_coin_ids_multi(self, hints:
|
|
43
|
-
coin_ids:
|
|
41
|
+
async def get_coin_ids_multi(self, hints: set[bytes], *, max_items: int = 50000) -> list[bytes32]:
|
|
42
|
+
coin_ids: list[bytes32] = []
|
|
44
43
|
|
|
45
44
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
46
45
|
for batch in to_batches(hints, SQLITE_MAX_VARIABLE_NUMBER):
|
|
47
|
-
hints_db:
|
|
46
|
+
hints_db: tuple[bytes, ...] = tuple(batch.entries)
|
|
48
47
|
cursor = await conn.execute(
|
|
49
48
|
f"SELECT coin_id from hints INDEXED BY hint_index "
|
|
50
49
|
f'WHERE hint IN ({"?," * (len(batch.entries) - 1)}?) LIMIT ?',
|
|
51
|
-
hints_db
|
|
50
|
+
(*hints_db, max_items),
|
|
52
51
|
)
|
|
53
52
|
rows = await cursor.fetchall()
|
|
54
53
|
coin_ids.extend([bytes32(row[0]) for row in rows])
|
|
@@ -56,12 +55,12 @@ class HintStore:
|
|
|
56
55
|
|
|
57
56
|
return coin_ids
|
|
58
57
|
|
|
59
|
-
async def get_hints(self, coin_ids:
|
|
60
|
-
hints:
|
|
58
|
+
async def get_hints(self, coin_ids: list[bytes32]) -> list[bytes32]:
|
|
59
|
+
hints: list[bytes32] = []
|
|
61
60
|
|
|
62
61
|
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
63
62
|
for batch in to_batches(coin_ids, SQLITE_MAX_VARIABLE_NUMBER):
|
|
64
|
-
coin_ids_db:
|
|
63
|
+
coin_ids_db: tuple[bytes32, ...] = tuple(batch.entries)
|
|
65
64
|
cursor = await conn.execute(
|
|
66
65
|
f'SELECT hint from hints WHERE coin_id IN ({"?," * (len(batch.entries) - 1)}?)',
|
|
67
66
|
coin_ids_db,
|
|
@@ -72,7 +71,7 @@ class HintStore:
|
|
|
72
71
|
|
|
73
72
|
return hints
|
|
74
73
|
|
|
75
|
-
async def add_hints(self, coin_hint_list:
|
|
74
|
+
async def add_hints(self, coin_hint_list: list[tuple[bytes32, bytes]]) -> None:
|
|
76
75
|
if len(coin_hint_list) == 0:
|
|
77
76
|
return None
|
|
78
77
|
|
chia/full_node/mempool.py
CHANGED
|
@@ -2,11 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import sqlite3
|
|
5
|
+
from collections.abc import Awaitable, Iterator
|
|
5
6
|
from dataclasses import dataclass
|
|
6
7
|
from datetime import datetime
|
|
7
8
|
from enum import Enum
|
|
8
9
|
from time import monotonic
|
|
9
|
-
from typing import
|
|
10
|
+
from typing import Callable, Optional
|
|
10
11
|
|
|
11
12
|
from chia_rs import AugSchemeMPL, Coin, G2Element
|
|
12
13
|
|
|
@@ -50,13 +51,13 @@ MEMPOOL_ITEM_FEE_LIMIT = 2**50
|
|
|
50
51
|
|
|
51
52
|
@dataclass
|
|
52
53
|
class MempoolRemoveInfo:
|
|
53
|
-
items:
|
|
54
|
+
items: list[InternalMempoolItem]
|
|
54
55
|
reason: MempoolRemoveReason
|
|
55
56
|
|
|
56
57
|
|
|
57
58
|
@dataclass
|
|
58
59
|
class MempoolAddInfo:
|
|
59
|
-
removals:
|
|
60
|
+
removals: list[MempoolRemoveInfo]
|
|
60
61
|
error: Optional[Err]
|
|
61
62
|
|
|
62
63
|
|
|
@@ -71,7 +72,7 @@ class Mempool:
|
|
|
71
72
|
_db_conn: sqlite3.Connection
|
|
72
73
|
# it's expensive to serialize and deserialize G2Element, so we keep those in
|
|
73
74
|
# this separate dictionary
|
|
74
|
-
_items:
|
|
75
|
+
_items: dict[bytes32, InternalMempoolItem]
|
|
75
76
|
|
|
76
77
|
# the most recent block height and timestamp that we know of
|
|
77
78
|
_block_height: uint32
|
|
@@ -164,18 +165,18 @@ class Mempool:
|
|
|
164
165
|
for row in cursor:
|
|
165
166
|
yield self._row_to_item(row)
|
|
166
167
|
|
|
167
|
-
def all_item_ids(self) ->
|
|
168
|
+
def all_item_ids(self) -> list[bytes32]:
|
|
168
169
|
with self._db_conn:
|
|
169
170
|
cursor = self._db_conn.execute("SELECT name FROM tx")
|
|
170
171
|
return [bytes32(row[0]) for row in cursor]
|
|
171
172
|
|
|
172
|
-
def items_with_coin_ids(self, coin_ids:
|
|
173
|
+
def items_with_coin_ids(self, coin_ids: set[bytes32]) -> list[bytes32]:
|
|
173
174
|
"""
|
|
174
175
|
Returns a list of transaction ids that spend or create any coins with the provided coin ids.
|
|
175
176
|
This iterates over the internal items instead of using a query.
|
|
176
177
|
"""
|
|
177
178
|
|
|
178
|
-
transaction_ids:
|
|
179
|
+
transaction_ids: list[bytes32] = []
|
|
179
180
|
|
|
180
181
|
for transaction_id, item in self._items.items():
|
|
181
182
|
conds = item.conds
|
|
@@ -197,14 +198,14 @@ class Mempool:
|
|
|
197
198
|
|
|
198
199
|
return transaction_ids
|
|
199
200
|
|
|
200
|
-
def items_with_puzzle_hashes(self, puzzle_hashes:
|
|
201
|
+
def items_with_puzzle_hashes(self, puzzle_hashes: set[bytes32], include_hints: bool) -> list[bytes32]:
|
|
201
202
|
"""
|
|
202
203
|
Returns a list of transaction ids that spend or create any coins
|
|
203
204
|
with the provided puzzle hashes (or hints, if enabled).
|
|
204
205
|
This iterates over the internal items instead of using a query.
|
|
205
206
|
"""
|
|
206
207
|
|
|
207
|
-
transaction_ids:
|
|
208
|
+
transaction_ids: list[bytes32] = []
|
|
208
209
|
|
|
209
210
|
for transaction_id, item in self._items.items():
|
|
210
211
|
conds = item.conds
|
|
@@ -261,8 +262,8 @@ class Mempool:
|
|
|
261
262
|
for row in cursor:
|
|
262
263
|
yield self._row_to_item(row)
|
|
263
264
|
|
|
264
|
-
def get_items_by_coin_ids(self, spent_coin_ids:
|
|
265
|
-
items:
|
|
265
|
+
def get_items_by_coin_ids(self, spent_coin_ids: list[bytes32]) -> list[MempoolItem]:
|
|
266
|
+
items: list[MempoolItem] = []
|
|
266
267
|
for batch in to_batches(spent_coin_ids, SQLITE_MAX_VARIABLE_NUMBER):
|
|
267
268
|
args = ",".join(["?"] * len(batch.entries))
|
|
268
269
|
cursor = self._db_conn.execute(
|
|
@@ -318,14 +319,14 @@ class Mempool:
|
|
|
318
319
|
|
|
319
320
|
return self.remove_from_pool(to_remove, MempoolRemoveReason.EXPIRED)
|
|
320
321
|
|
|
321
|
-
def remove_from_pool(self, items:
|
|
322
|
+
def remove_from_pool(self, items: list[bytes32], reason: MempoolRemoveReason) -> MempoolRemoveInfo:
|
|
322
323
|
"""
|
|
323
324
|
Removes an item from the mempool.
|
|
324
325
|
"""
|
|
325
326
|
if items == []:
|
|
326
327
|
return MempoolRemoveInfo([], reason)
|
|
327
328
|
|
|
328
|
-
removed_items:
|
|
329
|
+
removed_items: list[MempoolItemInfo] = []
|
|
329
330
|
if reason != MempoolRemoveReason.BLOCK_INCLUSION:
|
|
330
331
|
for batch in to_batches(items, SQLITE_MAX_VARIABLE_NUMBER):
|
|
331
332
|
args = ",".join(["?"] * len(batch.entries))
|
|
@@ -375,7 +376,7 @@ class Mempool:
|
|
|
375
376
|
assert item.conds is not None
|
|
376
377
|
assert item.cost <= self.mempool_info.max_block_clvm_cost
|
|
377
378
|
|
|
378
|
-
removals:
|
|
379
|
+
removals: list[MempoolRemoveInfo] = []
|
|
379
380
|
|
|
380
381
|
# we have certain limits on transactions that will expire soon
|
|
381
382
|
# (in the next 15 minutes)
|
|
@@ -399,7 +400,7 @@ class Mempool:
|
|
|
399
400
|
""",
|
|
400
401
|
(time_cutoff, block_cutoff),
|
|
401
402
|
)
|
|
402
|
-
to_remove:
|
|
403
|
+
to_remove: list[bytes32] = []
|
|
403
404
|
for row in cursor:
|
|
404
405
|
name, fee_per_cost, cumulative_cost = row
|
|
405
406
|
|
|
@@ -476,11 +477,11 @@ class Mempool:
|
|
|
476
477
|
get_unspent_lineage_info_for_puzzle_hash: Callable[[bytes32], Awaitable[Optional[UnspentLineageInfo]]],
|
|
477
478
|
constants: ConsensusConstants,
|
|
478
479
|
height: uint32,
|
|
479
|
-
) -> Optional[
|
|
480
|
+
) -> Optional[tuple[SpendBundle, list[Coin]]]:
|
|
480
481
|
cost_sum = 0 # Checks that total cost does not exceed block maximum
|
|
481
482
|
fee_sum = 0 # Checks that total fees don't exceed 64 bits
|
|
482
483
|
processed_spend_bundles = 0
|
|
483
|
-
additions:
|
|
484
|
+
additions: list[Coin] = []
|
|
484
485
|
# This contains:
|
|
485
486
|
# 1. A map of coin ID to a coin spend solution and its isolated cost
|
|
486
487
|
# We reconstruct it for every bundle we create from mempool items because we
|
|
@@ -490,8 +491,8 @@ class Mempool:
|
|
|
490
491
|
# recent unspent singleton data, to allow chaining fast forward
|
|
491
492
|
# singleton spends
|
|
492
493
|
eligible_coin_spends = EligibleCoinSpends()
|
|
493
|
-
coin_spends:
|
|
494
|
-
sigs:
|
|
494
|
+
coin_spends: list[CoinSpend] = []
|
|
495
|
+
sigs: list[G2Element] = []
|
|
495
496
|
log.info(f"Starting to make block, max cost: {self.mempool_info.max_block_clvm_cost}")
|
|
496
497
|
bundle_creation_start = monotonic()
|
|
497
498
|
cursor = self._db_conn.execute("SELECT name, fee FROM tx ORDER BY fee_per_cost DESC, seq ASC")
|
|
@@ -500,6 +501,11 @@ class Mempool:
|
|
|
500
501
|
name = bytes32(row[0])
|
|
501
502
|
fee = int(row[1])
|
|
502
503
|
item = self._items[name]
|
|
504
|
+
|
|
505
|
+
current_time = monotonic()
|
|
506
|
+
if current_time - bundle_creation_start > 1:
|
|
507
|
+
log.info(f"exiting early, already spent {current_time - bundle_creation_start:0.2f} s")
|
|
508
|
+
break
|
|
503
509
|
if not item_inclusion_filter(name):
|
|
504
510
|
continue
|
|
505
511
|
try:
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Optional
|
|
5
5
|
|
|
6
|
-
from chia_rs import
|
|
6
|
+
from chia_rs import (
|
|
7
|
+
get_flags_for_height_and_constants,
|
|
8
|
+
run_chia_program,
|
|
9
|
+
)
|
|
7
10
|
from chia_rs import get_puzzle_and_solution_for_coin2 as get_puzzle_and_solution_for_coin_rust
|
|
8
|
-
from chia_rs import run_block_generator, run_block_generator2, run_chia_program
|
|
9
11
|
|
|
10
12
|
from chia.consensus.constants import ConsensusConstants
|
|
11
|
-
from chia.consensus.cost_calculator import NPCResult
|
|
12
13
|
from chia.types.blockchain_format.coin import Coin
|
|
13
14
|
from chia.types.blockchain_format.program import Program
|
|
14
15
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
@@ -18,7 +19,7 @@ from chia.types.generator_types import BlockGenerator
|
|
|
18
19
|
from chia.types.spend_bundle_conditions import SpendBundleConditions
|
|
19
20
|
from chia.util.condition_tools import conditions_for_solution
|
|
20
21
|
from chia.util.errors import Err
|
|
21
|
-
from chia.util.ints import
|
|
22
|
+
from chia.util.ints import uint32, uint64
|
|
22
23
|
from chia.wallet.puzzles.load_clvm import load_serialized_clvm_maybe_recompile
|
|
23
24
|
|
|
24
25
|
DESERIALIZE_MOD = load_serialized_clvm_maybe_recompile(
|
|
@@ -28,38 +29,6 @@ DESERIALIZE_MOD = load_serialized_clvm_maybe_recompile(
|
|
|
28
29
|
log = logging.getLogger(__name__)
|
|
29
30
|
|
|
30
31
|
|
|
31
|
-
def get_name_puzzle_conditions(
|
|
32
|
-
generator: BlockGenerator,
|
|
33
|
-
max_cost: int,
|
|
34
|
-
*,
|
|
35
|
-
mempool_mode: bool,
|
|
36
|
-
height: uint32,
|
|
37
|
-
constants: ConsensusConstants,
|
|
38
|
-
) -> NPCResult:
|
|
39
|
-
flags = get_flags_for_height_and_constants(height, constants) | DONT_VALIDATE_SIGNATURE
|
|
40
|
-
|
|
41
|
-
if mempool_mode:
|
|
42
|
-
flags = flags | MEMPOOL_MODE
|
|
43
|
-
|
|
44
|
-
if height >= constants.HARD_FORK_HEIGHT:
|
|
45
|
-
run_block = run_block_generator2
|
|
46
|
-
else:
|
|
47
|
-
run_block = run_block_generator
|
|
48
|
-
|
|
49
|
-
try:
|
|
50
|
-
block_args = generator.generator_refs
|
|
51
|
-
err, result = run_block(bytes(generator.program), block_args, max_cost, flags, G2Element(), None, constants)
|
|
52
|
-
assert (err is None) != (result is None)
|
|
53
|
-
if err is not None:
|
|
54
|
-
return NPCResult(uint16(err), None)
|
|
55
|
-
else:
|
|
56
|
-
assert result is not None
|
|
57
|
-
return NPCResult(None, result)
|
|
58
|
-
except BaseException:
|
|
59
|
-
log.exception("get_name_puzzle_condition failed")
|
|
60
|
-
return NPCResult(uint16(Err.GENERATOR_RUNTIME_ERROR.value), None)
|
|
61
|
-
|
|
62
|
-
|
|
63
32
|
def get_puzzle_and_solution_for_coin(
|
|
64
33
|
generator: BlockGenerator, coin: Coin, height: int, constants: ConsensusConstants
|
|
65
34
|
) -> SpendInfo:
|
|
@@ -76,7 +45,7 @@ def get_puzzle_and_solution_for_coin(
|
|
|
76
45
|
raise ValueError(f"Failed to get puzzle and solution for coin {coin}, error: {e}") from e
|
|
77
46
|
|
|
78
47
|
|
|
79
|
-
def get_spends_for_block(generator: BlockGenerator, height: int, constants: ConsensusConstants) ->
|
|
48
|
+
def get_spends_for_block(generator: BlockGenerator, height: int, constants: ConsensusConstants) -> list[CoinSpend]:
|
|
80
49
|
args = bytearray(b"\xff")
|
|
81
50
|
args += bytes(DESERIALIZE_MOD)
|
|
82
51
|
args += b"\xff"
|
|
@@ -90,7 +59,7 @@ def get_spends_for_block(generator: BlockGenerator, height: int, constants: Cons
|
|
|
90
59
|
get_flags_for_height_and_constants(height, constants),
|
|
91
60
|
)
|
|
92
61
|
|
|
93
|
-
spends:
|
|
62
|
+
spends: list[CoinSpend] = []
|
|
94
63
|
|
|
95
64
|
for spend in Program.to(ret).first().as_iter():
|
|
96
65
|
parent, puzzle, amount, solution = spend.as_iter()
|
|
@@ -103,7 +72,7 @@ def get_spends_for_block(generator: BlockGenerator, height: int, constants: Cons
|
|
|
103
72
|
|
|
104
73
|
def get_spends_for_block_with_conditions(
|
|
105
74
|
generator: BlockGenerator, height: int, constants: ConsensusConstants
|
|
106
|
-
) ->
|
|
75
|
+
) -> list[CoinSpendWithConditions]:
|
|
107
76
|
args = bytearray(b"\xff")
|
|
108
77
|
args += bytes(DESERIALIZE_MOD)
|
|
109
78
|
args += b"\xff"
|
|
@@ -119,7 +88,7 @@ def get_spends_for_block_with_conditions(
|
|
|
119
88
|
flags,
|
|
120
89
|
)
|
|
121
90
|
|
|
122
|
-
spends:
|
|
91
|
+
spends: list[CoinSpendWithConditions] = []
|
|
123
92
|
|
|
124
93
|
for spend in Program.to(ret).first().as_iter():
|
|
125
94
|
parent, puzzle, amount, solution = spend.as_iter()
|
|
@@ -133,7 +102,7 @@ def get_spends_for_block_with_conditions(
|
|
|
133
102
|
|
|
134
103
|
|
|
135
104
|
def mempool_check_time_locks(
|
|
136
|
-
removal_coin_records:
|
|
105
|
+
removal_coin_records: dict[bytes32, CoinRecord],
|
|
137
106
|
bundle_conds: SpendBundleConditions,
|
|
138
107
|
prev_transaction_block_height: uint32,
|
|
139
108
|
timestamp: uint64,
|