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
|
@@ -1,36 +1,34 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import copy
|
|
4
5
|
import logging
|
|
5
6
|
import time
|
|
6
7
|
import traceback
|
|
8
|
+
from collections.abc import Awaitable, Collection
|
|
7
9
|
from concurrent.futures import Executor
|
|
8
10
|
from dataclasses import dataclass
|
|
9
|
-
from typing import
|
|
11
|
+
from typing import Optional
|
|
10
12
|
|
|
11
|
-
from chia_rs import
|
|
13
|
+
from chia_rs import SpendBundleConditions, get_flags_for_height_and_constants, run_block_generator, run_block_generator2
|
|
12
14
|
|
|
13
15
|
from chia.consensus.block_header_validation import validate_finished_header_block
|
|
14
16
|
from chia.consensus.block_record import BlockRecord
|
|
15
|
-
from chia.consensus.blockchain_interface import
|
|
17
|
+
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
16
18
|
from chia.consensus.constants import ConsensusConstants
|
|
17
|
-
from chia.consensus.cost_calculator import NPCResult
|
|
18
19
|
from chia.consensus.full_block_to_block_record import block_to_block_record
|
|
19
20
|
from chia.consensus.get_block_challenge import get_block_challenge
|
|
20
21
|
from chia.consensus.get_block_generator import get_block_generator
|
|
21
22
|
from chia.consensus.pot_iterations import calculate_iterations_quality, is_overflow_block
|
|
22
|
-
from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions
|
|
23
23
|
from chia.types.blockchain_format.coin import Coin
|
|
24
24
|
from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
|
|
25
25
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
26
26
|
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
27
27
|
from chia.types.full_block import FullBlock
|
|
28
28
|
from chia.types.generator_types import BlockGenerator
|
|
29
|
-
from chia.types.
|
|
29
|
+
from chia.types.validation_state import ValidationState
|
|
30
30
|
from chia.util.augmented_chain import AugmentedBlockchain
|
|
31
|
-
from chia.util.
|
|
32
|
-
from chia.util.condition_tools import pkm_pairs
|
|
33
|
-
from chia.util.errors import Err, ValidationError
|
|
31
|
+
from chia.util.errors import Err
|
|
34
32
|
from chia.util.generator_tools import get_block_header, tx_removals_and_additions
|
|
35
33
|
from chia.util.ints import uint16, uint32, uint64
|
|
36
34
|
from chia.util.streamable import Streamable, streamable
|
|
@@ -44,322 +42,227 @@ class PreValidationResult(Streamable):
|
|
|
44
42
|
error: Optional[uint16]
|
|
45
43
|
required_iters: Optional[uint64] # Iff error is None
|
|
46
44
|
conds: Optional[SpendBundleConditions] # Iff error is None and block is a transaction block
|
|
47
|
-
validated_signature: bool
|
|
48
45
|
timing: uint32 # the time (in milliseconds) it took to pre-validate the block
|
|
49
46
|
|
|
47
|
+
@property
|
|
48
|
+
def validated_signature(self) -> bool:
|
|
49
|
+
if self.conds is None:
|
|
50
|
+
return False
|
|
51
|
+
return self.conds.validated_signature
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
|
|
54
|
+
# this layer of abstraction is here to let wallet tests monkeypatch it
|
|
55
|
+
def _run_block(
|
|
56
|
+
block: FullBlock, prev_generators: list[bytes], constants: ConsensusConstants
|
|
57
|
+
) -> tuple[Optional[int], Optional[SpendBundleConditions]]:
|
|
58
|
+
assert block.transactions_generator is not None
|
|
59
|
+
assert block.transactions_info is not None
|
|
60
|
+
flags = get_flags_for_height_and_constants(block.height, constants)
|
|
61
|
+
if block.height >= constants.HARD_FORK_HEIGHT:
|
|
62
|
+
run_block = run_block_generator2
|
|
63
|
+
else:
|
|
64
|
+
run_block = run_block_generator
|
|
65
|
+
return run_block(
|
|
66
|
+
bytes(block.transactions_generator),
|
|
67
|
+
prev_generators,
|
|
68
|
+
block.transactions_info.cost,
|
|
69
|
+
flags,
|
|
70
|
+
block.transactions_info.aggregated_signature,
|
|
71
|
+
None,
|
|
72
|
+
constants,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _pre_validate_block(
|
|
52
77
|
constants: ConsensusConstants,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
conds
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
block_generator = BlockGenerator(block.transactions_generator, prev_generators)
|
|
86
|
-
assert block_generator.program == block.transactions_generator
|
|
87
|
-
npc_result = get_name_puzzle_conditions(
|
|
88
|
-
block_generator,
|
|
89
|
-
min(constants.MAX_BLOCK_COST_CLVM, block.transactions_info.cost),
|
|
90
|
-
mempool_mode=False,
|
|
91
|
-
height=block.height,
|
|
92
|
-
constants=constants,
|
|
93
|
-
)
|
|
94
|
-
if npc_result.error is not None:
|
|
95
|
-
validation_time = time.monotonic() - validation_start
|
|
96
|
-
results.append(
|
|
97
|
-
PreValidationResult(
|
|
98
|
-
uint16(npc_result.error), None, npc_result.conds, False, uint32(validation_time * 1000)
|
|
99
|
-
)
|
|
100
|
-
)
|
|
101
|
-
continue
|
|
102
|
-
assert npc_result.conds is not None
|
|
103
|
-
conds = npc_result.conds
|
|
104
|
-
removals, tx_additions = tx_removals_and_additions(conds)
|
|
105
|
-
|
|
106
|
-
header_block = get_block_header(block, tx_additions, removals)
|
|
107
|
-
prev_ses_block = None
|
|
108
|
-
if prev_ses_block_bytes is not None and len(prev_ses_block_bytes) > 0:
|
|
109
|
-
buffer = prev_ses_block_bytes[i]
|
|
110
|
-
if buffer is not None:
|
|
111
|
-
prev_ses_block = BlockRecord.from_bytes_unchecked(buffer)
|
|
112
|
-
required_iters, error = validate_finished_header_block(
|
|
113
|
-
constants,
|
|
114
|
-
BlockCache(blocks),
|
|
115
|
-
header_block,
|
|
116
|
-
True, # check_filter
|
|
117
|
-
expected_difficulty[i],
|
|
118
|
-
expected_sub_slot_iters[i],
|
|
119
|
-
prev_ses_block=prev_ses_block,
|
|
120
|
-
)
|
|
121
|
-
error_int: Optional[uint16] = None
|
|
122
|
-
if error is not None:
|
|
123
|
-
error_int = uint16(error.code.value)
|
|
124
|
-
|
|
125
|
-
successfully_validated_signatures = False
|
|
126
|
-
# If we failed header block validation, no need to validate
|
|
127
|
-
# signature, the block is already invalid If this is False, it means
|
|
128
|
-
# either we don't have a signature (not a tx block) or we have an
|
|
129
|
-
# invalid signature (which also puts in an error) or we didn't
|
|
130
|
-
# validate the signature because we want to validate it later.
|
|
131
|
-
# add_block will attempt to validate the signature later.
|
|
132
|
-
if error_int is None and validate_signatures and conds is not None:
|
|
133
|
-
assert block.transactions_info is not None
|
|
134
|
-
pairs_pks, pairs_msgs = pkm_pairs(conds, constants.AGG_SIG_ME_ADDITIONAL_DATA)
|
|
135
|
-
if not AugSchemeMPL.aggregate_verify(
|
|
136
|
-
pairs_pks, pairs_msgs, block.transactions_info.aggregated_signature
|
|
137
|
-
):
|
|
138
|
-
error_int = uint16(Err.BAD_AGGREGATE_SIGNATURE.value)
|
|
139
|
-
else:
|
|
140
|
-
successfully_validated_signatures = True
|
|
141
|
-
|
|
142
|
-
validation_time = time.monotonic() - validation_start
|
|
143
|
-
results.append(
|
|
144
|
-
PreValidationResult(
|
|
145
|
-
error_int,
|
|
146
|
-
required_iters,
|
|
147
|
-
conds,
|
|
148
|
-
successfully_validated_signatures,
|
|
149
|
-
uint32(validation_time * 1000),
|
|
78
|
+
blockchain: BlockRecordsProtocol,
|
|
79
|
+
block: FullBlock,
|
|
80
|
+
prev_generators: Optional[list[bytes]],
|
|
81
|
+
conds: Optional[SpendBundleConditions],
|
|
82
|
+
expected_vs: ValidationState,
|
|
83
|
+
) -> PreValidationResult:
|
|
84
|
+
"""
|
|
85
|
+
Args:
|
|
86
|
+
constants:
|
|
87
|
+
blockchain:
|
|
88
|
+
block:
|
|
89
|
+
prev_generators:
|
|
90
|
+
conds:
|
|
91
|
+
expected_vs: The validation state that we calculate for the next block
|
|
92
|
+
if it's validated.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
try:
|
|
96
|
+
validation_start = time.monotonic()
|
|
97
|
+
removals_and_additions: Optional[tuple[Collection[bytes32], Collection[Coin]]] = None
|
|
98
|
+
if conds is not None:
|
|
99
|
+
assert conds.validated_signature is True
|
|
100
|
+
assert block.transactions_generator is not None
|
|
101
|
+
removals_and_additions = tx_removals_and_additions(conds)
|
|
102
|
+
elif block.transactions_generator is not None:
|
|
103
|
+
assert prev_generators is not None
|
|
104
|
+
assert block.transactions_info is not None
|
|
105
|
+
|
|
106
|
+
if block.transactions_info.cost > constants.MAX_BLOCK_COST_CLVM:
|
|
107
|
+
validation_time = time.monotonic() - validation_start
|
|
108
|
+
return PreValidationResult(
|
|
109
|
+
uint16(Err.BLOCK_COST_EXCEEDS_MAX.value), None, None, uint32(validation_time * 1000)
|
|
150
110
|
)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
PreValidationResult(uint16(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
111
|
+
|
|
112
|
+
err, conds = _run_block(block, prev_generators, constants)
|
|
113
|
+
|
|
114
|
+
assert (err is None) != (conds is None)
|
|
115
|
+
if err is not None:
|
|
116
|
+
validation_time = time.monotonic() - validation_start
|
|
117
|
+
return PreValidationResult(uint16(err), None, None, uint32(validation_time * 1000))
|
|
118
|
+
assert conds is not None
|
|
119
|
+
assert conds.validated_signature is True
|
|
120
|
+
removals_and_additions = tx_removals_and_additions(conds)
|
|
121
|
+
elif block.is_transaction_block():
|
|
122
|
+
# This is a transaction block with just reward coins.
|
|
123
|
+
removals_and_additions = ([], [])
|
|
124
|
+
|
|
125
|
+
assert conds is None or conds.validated_signature is True
|
|
126
|
+
header_block = get_block_header(block, removals_and_additions)
|
|
127
|
+
required_iters, error = validate_finished_header_block(
|
|
128
|
+
constants,
|
|
129
|
+
blockchain,
|
|
130
|
+
header_block,
|
|
131
|
+
True, # check_filter
|
|
132
|
+
expected_vs,
|
|
133
|
+
)
|
|
134
|
+
error_int: Optional[uint16] = None
|
|
135
|
+
if error is not None:
|
|
136
|
+
error_int = uint16(error.code.value)
|
|
137
|
+
|
|
138
|
+
validation_time = time.monotonic() - validation_start
|
|
139
|
+
return PreValidationResult(
|
|
140
|
+
error_int,
|
|
141
|
+
required_iters,
|
|
142
|
+
conds,
|
|
143
|
+
uint32(validation_time * 1000),
|
|
144
|
+
)
|
|
145
|
+
except Exception:
|
|
146
|
+
error_stack = traceback.format_exc()
|
|
147
|
+
log.error(f"Exception: {error_stack}")
|
|
148
|
+
validation_time = time.monotonic() - validation_start
|
|
149
|
+
return PreValidationResult(uint16(Err.UNKNOWN.value), None, None, uint32(validation_time * 1000))
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
async def pre_validate_block(
|
|
163
153
|
constants: ConsensusConstants,
|
|
164
|
-
|
|
165
|
-
|
|
154
|
+
blockchain: AugmentedBlockchain,
|
|
155
|
+
block: FullBlock,
|
|
166
156
|
pool: Executor,
|
|
167
|
-
|
|
157
|
+
conds: Optional[SpendBundleConditions],
|
|
158
|
+
vs: ValidationState,
|
|
168
159
|
*,
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
prev_ses_block: Optional[BlockRecord],
|
|
172
|
-
wp_summaries: Optional[List[SubEpochSummary]] = None,
|
|
173
|
-
validate_signatures: bool = True,
|
|
174
|
-
) -> List[PreValidationResult]:
|
|
160
|
+
wp_summaries: Optional[list[SubEpochSummary]] = None,
|
|
161
|
+
) -> Awaitable[PreValidationResult]:
|
|
175
162
|
"""
|
|
176
163
|
This method must be called under the blockchain lock
|
|
177
|
-
|
|
178
|
-
|
|
164
|
+
The block passed to this function is submitted to be validated in the
|
|
165
|
+
executor passed in as "pool". The future for the job is then returned.
|
|
166
|
+
When awaited, the return value is the PreValidationResult for the block.
|
|
167
|
+
The PreValidationResult indicates whether the block was valid or not.
|
|
179
168
|
|
|
180
169
|
Args:
|
|
181
170
|
constants:
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
171
|
+
blockchain: The blockchain object to validate these blocks with respect to.
|
|
172
|
+
It's an AugmentedBlockchain to allow for previous batches of blocks to
|
|
173
|
+
be included, even if they haven't been added to the underlying blockchain
|
|
174
|
+
database yet. The blocks passed in will be added/augmented onto this blockchain.
|
|
175
|
+
pool: The executor to submit the validation jobs to
|
|
176
|
+
block: The full block to validate (must be connected to current chain)
|
|
177
|
+
conds: The SpendBundleConditions for transaction blocks, if we have one.
|
|
178
|
+
This will be computed if None is passed.
|
|
179
|
+
vs: The ValidationState refers to the state for the block.
|
|
180
|
+
This is an in-out parameter that will be updated to the validation state
|
|
181
|
+
for the next block. It includes subslot iterators, difficulty and
|
|
182
|
+
the previous sub epoch summary (ses) block.
|
|
183
|
+
wp_summaries:
|
|
184
|
+
validate_signatures:
|
|
187
185
|
"""
|
|
188
186
|
prev_b: Optional[BlockRecord] = None
|
|
189
187
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
num_sub_slots_found = 0
|
|
193
|
-
num_blocks_seen = 0
|
|
188
|
+
async def return_error(error_code: Err) -> PreValidationResult:
|
|
189
|
+
return PreValidationResult(uint16(error_code.value), None, None, uint32(0))
|
|
194
190
|
|
|
195
|
-
if
|
|
196
|
-
curr =
|
|
191
|
+
if block.height > 0:
|
|
192
|
+
curr = blockchain.try_block_record(block.prev_header_hash)
|
|
197
193
|
if curr is None:
|
|
198
|
-
return
|
|
194
|
+
return return_error(Err.INVALID_PREV_BLOCK_HASH)
|
|
199
195
|
prev_b = curr
|
|
200
|
-
num_sub_slots_to_look_for = 3 if curr.overflow else 2
|
|
201
|
-
header_hash = curr.header_hash
|
|
202
|
-
while (
|
|
203
|
-
curr.sub_epoch_summary_included is None
|
|
204
|
-
or num_blocks_seen < constants.NUMBER_OF_TIMESTAMPS
|
|
205
|
-
or num_sub_slots_found < num_sub_slots_to_look_for
|
|
206
|
-
) and curr.height > 0:
|
|
207
|
-
if curr.first_in_sub_slot:
|
|
208
|
-
assert curr.finished_challenge_slot_hashes is not None
|
|
209
|
-
num_sub_slots_found += len(curr.finished_challenge_slot_hashes)
|
|
210
|
-
recent_blocks[header_hash] = curr
|
|
211
|
-
if curr.is_transaction_block:
|
|
212
|
-
num_blocks_seen += 1
|
|
213
|
-
header_hash = curr.prev_hash
|
|
214
|
-
curr = block_records.block_record(curr.prev_hash)
|
|
215
|
-
assert curr is not None
|
|
216
|
-
recent_blocks[header_hash] = curr
|
|
217
|
-
|
|
218
|
-
# the agumented blockchain object will let us add temporary block records
|
|
219
|
-
# they won't actually be added to the underlying blockchain object
|
|
220
|
-
blockchain = AugmentedBlockchain(block_records)
|
|
221
|
-
|
|
222
|
-
diff_ssis: List[Tuple[uint64, uint64]] = []
|
|
223
|
-
prev_ses_block_list: List[Optional[BlockRecord]] = []
|
|
224
|
-
|
|
225
|
-
for block in blocks:
|
|
226
|
-
if len(block.finished_sub_slots) > 0:
|
|
227
|
-
if block.finished_sub_slots[0].challenge_chain.new_difficulty is not None:
|
|
228
|
-
difficulty = block.finished_sub_slots[0].challenge_chain.new_difficulty
|
|
229
|
-
if block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters is not None:
|
|
230
|
-
sub_slot_iters = block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters
|
|
231
|
-
overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
|
|
232
|
-
challenge = get_block_challenge(constants, block, BlockCache(recent_blocks), prev_b is None, overflow, False)
|
|
233
|
-
if block.reward_chain_block.challenge_chain_sp_vdf is None:
|
|
234
|
-
cc_sp_hash: bytes32 = challenge
|
|
235
|
-
else:
|
|
236
|
-
cc_sp_hash = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
|
|
237
|
-
q_str: Optional[bytes32] = verify_and_get_quality_string(
|
|
238
|
-
block.reward_chain_block.proof_of_space, constants, challenge, cc_sp_hash, height=block.height
|
|
239
|
-
)
|
|
240
|
-
if q_str is None:
|
|
241
|
-
return [PreValidationResult(uint16(Err.INVALID_POSPACE.value), None, None, False, uint32(0))]
|
|
242
|
-
|
|
243
|
-
required_iters: uint64 = calculate_iterations_quality(
|
|
244
|
-
constants.DIFFICULTY_CONSTANT_FACTOR,
|
|
245
|
-
q_str,
|
|
246
|
-
block.reward_chain_block.proof_of_space.size,
|
|
247
|
-
difficulty,
|
|
248
|
-
cc_sp_hash,
|
|
249
|
-
)
|
|
250
196
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
recent_blocks[block_rec.header_hash] = block_rec
|
|
270
|
-
blockchain.add_extra_block(block, block_rec) # Temporarily add block to chain
|
|
271
|
-
prev_b = block_rec
|
|
272
|
-
diff_ssis.append((difficulty, sub_slot_iters))
|
|
273
|
-
prev_ses_block_list.append(prev_ses_block)
|
|
274
|
-
if block_rec.sub_epoch_summary_included is not None:
|
|
275
|
-
prev_ses_block = block_rec
|
|
276
|
-
|
|
277
|
-
conditions_pickled = {}
|
|
278
|
-
for k, v in block_height_conds_map.items():
|
|
279
|
-
conditions_pickled[k] = bytes(v)
|
|
280
|
-
futures = []
|
|
281
|
-
# Pool of workers to validate blocks concurrently
|
|
282
|
-
recent_blocks_bytes = {bytes(k): bytes(v) for k, v in recent_blocks.items()} # convert to bytes
|
|
283
|
-
|
|
284
|
-
batch_size = 4
|
|
285
|
-
for i in range(0, len(blocks), batch_size):
|
|
286
|
-
end_i = min(i + batch_size, len(blocks))
|
|
287
|
-
blocks_to_validate = blocks[i:end_i]
|
|
288
|
-
b_pickled: List[bytes] = []
|
|
289
|
-
previous_generators: List[Optional[List[bytes]]] = []
|
|
290
|
-
for block in blocks_to_validate:
|
|
291
|
-
assert isinstance(block, FullBlock)
|
|
292
|
-
b_pickled.append(bytes(block))
|
|
293
|
-
try:
|
|
294
|
-
block_generator: Optional[BlockGenerator] = await get_block_generator(
|
|
295
|
-
blockchain.lookup_block_generators, block
|
|
296
|
-
)
|
|
297
|
-
except ValueError:
|
|
298
|
-
return [
|
|
299
|
-
PreValidationResult(
|
|
300
|
-
uint16(Err.FAILED_GETTING_GENERATOR_MULTIPROCESSING.value), None, None, False, uint32(0)
|
|
301
|
-
)
|
|
302
|
-
]
|
|
303
|
-
if block_generator is not None:
|
|
304
|
-
previous_generators.append(block_generator.generator_refs)
|
|
305
|
-
else:
|
|
306
|
-
previous_generators.append(None)
|
|
307
|
-
|
|
308
|
-
ses_blocks_bytes_list: List[Optional[bytes]] = []
|
|
309
|
-
for j in range(i, end_i):
|
|
310
|
-
ses_block_rec = prev_ses_block_list[j]
|
|
311
|
-
if ses_block_rec is None:
|
|
312
|
-
ses_blocks_bytes_list.append(None)
|
|
313
|
-
else:
|
|
314
|
-
ses_blocks_bytes_list.append(bytes(ses_block_rec))
|
|
315
|
-
|
|
316
|
-
futures.append(
|
|
317
|
-
asyncio.get_running_loop().run_in_executor(
|
|
318
|
-
pool,
|
|
319
|
-
batch_pre_validate_blocks,
|
|
320
|
-
constants,
|
|
321
|
-
recent_blocks_bytes,
|
|
322
|
-
b_pickled,
|
|
323
|
-
previous_generators,
|
|
324
|
-
conditions_pickled,
|
|
325
|
-
[diff_ssis[j][0] for j in range(i, end_i)],
|
|
326
|
-
[diff_ssis[j][1] for j in range(i, end_i)],
|
|
327
|
-
validate_signatures,
|
|
328
|
-
ses_blocks_bytes_list,
|
|
329
|
-
)
|
|
330
|
-
)
|
|
331
|
-
# Collect all results into one flat list
|
|
332
|
-
return [
|
|
333
|
-
PreValidationResult.from_bytes(result)
|
|
334
|
-
for batch_result in (await asyncio.gather(*futures))
|
|
335
|
-
for result in batch_result
|
|
336
|
-
]
|
|
197
|
+
assert isinstance(block, FullBlock)
|
|
198
|
+
if len(block.finished_sub_slots) > 0:
|
|
199
|
+
if block.finished_sub_slots[0].challenge_chain.new_difficulty is not None:
|
|
200
|
+
vs.difficulty = block.finished_sub_slots[0].challenge_chain.new_difficulty
|
|
201
|
+
if block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters is not None:
|
|
202
|
+
vs.ssi = block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters
|
|
203
|
+
overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
|
|
204
|
+
challenge = get_block_challenge(constants, block, blockchain, prev_b is None, overflow, False)
|
|
205
|
+
if block.reward_chain_block.challenge_chain_sp_vdf is None:
|
|
206
|
+
cc_sp_hash: bytes32 = challenge
|
|
207
|
+
else:
|
|
208
|
+
cc_sp_hash = block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
|
|
209
|
+
q_str: Optional[bytes32] = verify_and_get_quality_string(
|
|
210
|
+
block.reward_chain_block.proof_of_space, constants, challenge, cc_sp_hash, height=block.height
|
|
211
|
+
)
|
|
212
|
+
if q_str is None:
|
|
213
|
+
return return_error(Err.INVALID_POSPACE)
|
|
337
214
|
|
|
215
|
+
required_iters: uint64 = calculate_iterations_quality(
|
|
216
|
+
constants.DIFFICULTY_CONSTANT_FACTOR,
|
|
217
|
+
q_str,
|
|
218
|
+
block.reward_chain_block.proof_of_space.size,
|
|
219
|
+
vs.difficulty,
|
|
220
|
+
cc_sp_hash,
|
|
221
|
+
)
|
|
338
222
|
|
|
339
|
-
def _run_generator(
|
|
340
|
-
constants: ConsensusConstants,
|
|
341
|
-
unfinished_block_bytes: bytes,
|
|
342
|
-
block_generator_bytes: bytes,
|
|
343
|
-
height: uint32,
|
|
344
|
-
) -> Optional[bytes]:
|
|
345
|
-
"""
|
|
346
|
-
Runs the CLVM generator from bytes inputs. This is meant to be called under a ProcessPoolExecutor, in order to
|
|
347
|
-
validate the heavy parts of a block (clvm program) in a different process.
|
|
348
|
-
"""
|
|
349
223
|
try:
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
mempool_mode=False,
|
|
358
|
-
height=height,
|
|
359
|
-
constants=constants,
|
|
224
|
+
block_rec = block_to_block_record(
|
|
225
|
+
constants,
|
|
226
|
+
blockchain,
|
|
227
|
+
required_iters,
|
|
228
|
+
block,
|
|
229
|
+
sub_slot_iters=vs.ssi,
|
|
230
|
+
prev_ses_block=vs.prev_ses_block,
|
|
360
231
|
)
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
return
|
|
364
|
-
|
|
365
|
-
|
|
232
|
+
except ValueError:
|
|
233
|
+
log.exception("block_to_block_record()")
|
|
234
|
+
return return_error(Err.INVALID_SUB_EPOCH_SUMMARY)
|
|
235
|
+
|
|
236
|
+
if block_rec.sub_epoch_summary_included is not None and wp_summaries is not None:
|
|
237
|
+
next_ses = wp_summaries[int(block.height / constants.SUB_EPOCH_BLOCKS) - 1]
|
|
238
|
+
if not block_rec.sub_epoch_summary_included.get_hash() == next_ses.get_hash():
|
|
239
|
+
log.error("sub_epoch_summary does not match wp sub_epoch_summary list")
|
|
240
|
+
return return_error(Err.INVALID_SUB_EPOCH_SUMMARY)
|
|
241
|
+
|
|
242
|
+
blockchain.add_extra_block(block, block_rec) # Temporarily add block to chain
|
|
243
|
+
prev_b = block_rec
|
|
244
|
+
|
|
245
|
+
previous_generators: Optional[list[bytes]] = None
|
|
246
|
+
|
|
247
|
+
try:
|
|
248
|
+
block_generator: Optional[BlockGenerator] = await get_block_generator(blockchain.lookup_block_generators, block)
|
|
249
|
+
if block_generator is not None:
|
|
250
|
+
previous_generators = block_generator.generator_refs
|
|
251
|
+
except ValueError:
|
|
252
|
+
return return_error(Err.FAILED_GETTING_GENERATOR_MULTIPROCESSING)
|
|
253
|
+
|
|
254
|
+
future = asyncio.get_running_loop().run_in_executor(
|
|
255
|
+
pool,
|
|
256
|
+
_pre_validate_block,
|
|
257
|
+
constants,
|
|
258
|
+
blockchain,
|
|
259
|
+
block,
|
|
260
|
+
previous_generators,
|
|
261
|
+
conds,
|
|
262
|
+
copy.copy(vs),
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
if block_rec.sub_epoch_summary_included is not None:
|
|
266
|
+
vs.prev_ses_block = block_rec
|
|
267
|
+
|
|
268
|
+
return future
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Optional
|
|
4
4
|
|
|
5
5
|
from chia.consensus.block_record import BlockRecord
|
|
6
6
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
@@ -13,13 +13,13 @@ from chia.util.ints import uint64, uint128
|
|
|
13
13
|
|
|
14
14
|
def get_signage_point_vdf_info(
|
|
15
15
|
constants: ConsensusConstants,
|
|
16
|
-
finished_sub_slots:
|
|
16
|
+
finished_sub_slots: list[EndOfSubSlotBundle],
|
|
17
17
|
overflow: bool,
|
|
18
18
|
prev_b: Optional[BlockRecord],
|
|
19
19
|
blocks: BlockRecordsProtocol,
|
|
20
20
|
sp_total_iters: uint128,
|
|
21
21
|
sp_iters: uint64,
|
|
22
|
-
) ->
|
|
22
|
+
) -> tuple[bytes32, bytes32, ClassgroupElement, ClassgroupElement, uint64, uint64]:
|
|
23
23
|
"""
|
|
24
24
|
Returns the following information, for the VDF of the signage point at sp_total_iters.
|
|
25
25
|
cc and rc challenge hash
|