chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.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.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
chia/consensus/blockchain.py
CHANGED
|
@@ -4,16 +4,13 @@ import asyncio
|
|
|
4
4
|
import dataclasses
|
|
5
5
|
import enum
|
|
6
6
|
import logging
|
|
7
|
-
import time
|
|
8
7
|
import traceback
|
|
9
|
-
from concurrent.futures import Executor
|
|
10
|
-
from concurrent.futures.process import ProcessPoolExecutor
|
|
8
|
+
from concurrent.futures import Executor, ThreadPoolExecutor
|
|
11
9
|
from enum import Enum
|
|
12
|
-
from multiprocessing.context import BaseContext
|
|
13
10
|
from pathlib import Path
|
|
14
|
-
from typing import TYPE_CHECKING, ClassVar,
|
|
11
|
+
from typing import TYPE_CHECKING, ClassVar, Optional, cast
|
|
15
12
|
|
|
16
|
-
from chia_rs import
|
|
13
|
+
from chia_rs import additions_and_removals, get_flags_for_height_and_constants
|
|
17
14
|
|
|
18
15
|
from chia.consensus.block_body_validation import ForkInfo, validate_block_body
|
|
19
16
|
from chia.consensus.block_header_validation import validate_unfinished_header_block
|
|
@@ -24,11 +21,10 @@ from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_dif
|
|
|
24
21
|
from chia.consensus.find_fork_point import lookup_fork_chain
|
|
25
22
|
from chia.consensus.full_block_to_block_record import block_to_block_record
|
|
26
23
|
from chia.consensus.get_block_generator import get_block_generator
|
|
27
|
-
from chia.consensus.multiprocess_validation import PreValidationResult
|
|
24
|
+
from chia.consensus.multiprocess_validation import PreValidationResult
|
|
28
25
|
from chia.full_node.block_height_map import BlockHeightMap
|
|
29
26
|
from chia.full_node.block_store import BlockStore
|
|
30
27
|
from chia.full_node.coin_store import CoinStore
|
|
31
|
-
from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions
|
|
32
28
|
from chia.types.blockchain_format.coin import Coin
|
|
33
29
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
34
30
|
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
@@ -40,15 +36,15 @@ from chia.types.generator_types import BlockGenerator
|
|
|
40
36
|
from chia.types.header_block import HeaderBlock
|
|
41
37
|
from chia.types.unfinished_block import UnfinishedBlock
|
|
42
38
|
from chia.types.unfinished_header_block import UnfinishedHeaderBlock
|
|
39
|
+
from chia.types.validation_state import ValidationState
|
|
43
40
|
from chia.types.weight_proof import SubEpochChallengeSegment
|
|
44
41
|
from chia.util.cpu import available_logical_cores
|
|
45
|
-
from chia.util.errors import
|
|
42
|
+
from chia.util.errors import Err
|
|
46
43
|
from chia.util.generator_tools import get_block_header
|
|
47
44
|
from chia.util.hash import std_hash
|
|
48
45
|
from chia.util.inline_executor import InlineExecutor
|
|
49
46
|
from chia.util.ints import uint16, uint32, uint64, uint128
|
|
50
47
|
from chia.util.priority_mutex import PriorityMutex
|
|
51
|
-
from chia.util.setproctitle import getproctitle, setproctitle
|
|
52
48
|
|
|
53
49
|
log = logging.getLogger(__name__)
|
|
54
50
|
|
|
@@ -71,12 +67,12 @@ class AddBlockResult(Enum):
|
|
|
71
67
|
class StateChangeSummary:
|
|
72
68
|
peak: BlockRecord
|
|
73
69
|
fork_height: uint32
|
|
74
|
-
rolled_back_records:
|
|
70
|
+
rolled_back_records: list[CoinRecord]
|
|
75
71
|
# list of coin-id, puzzle-hash pairs
|
|
76
|
-
removals:
|
|
72
|
+
removals: list[tuple[bytes32, bytes32]]
|
|
77
73
|
# new coin and hint
|
|
78
|
-
additions:
|
|
79
|
-
new_rewards:
|
|
74
|
+
additions: list[tuple[Coin, Optional[bytes]]]
|
|
75
|
+
new_rewards: list[Coin]
|
|
80
76
|
|
|
81
77
|
|
|
82
78
|
class BlockchainMutexPriority(enum.IntEnum):
|
|
@@ -97,9 +93,9 @@ class Blockchain:
|
|
|
97
93
|
# peak of the blockchain
|
|
98
94
|
_peak_height: Optional[uint32]
|
|
99
95
|
# All blocks in peak path are guaranteed to be included, can include orphan blocks
|
|
100
|
-
__block_records:
|
|
96
|
+
__block_records: dict[bytes32, BlockRecord]
|
|
101
97
|
# all hashes of blocks in block_record by height, used for garbage collection
|
|
102
|
-
__heights_in_cache:
|
|
98
|
+
__heights_in_cache: dict[uint32, set[bytes32]]
|
|
103
99
|
# maps block height (of the current heaviest chain) to block hash and sub
|
|
104
100
|
# epoch summaries
|
|
105
101
|
__height_map: BlockHeightMap
|
|
@@ -110,7 +106,7 @@ class Blockchain:
|
|
|
110
106
|
# Used to verify blocks in parallel
|
|
111
107
|
pool: Executor
|
|
112
108
|
# Set holding seen compact proofs, in order to avoid duplicates.
|
|
113
|
-
_seen_compact_proofs:
|
|
109
|
+
_seen_compact_proofs: set[tuple[VDFInfo, uint32]]
|
|
114
110
|
|
|
115
111
|
# Whether blockchain is shut down or not
|
|
116
112
|
_shut_down: bool
|
|
@@ -119,6 +115,8 @@ class Blockchain:
|
|
|
119
115
|
priority_mutex: PriorityMutex[BlockchainMutexPriority]
|
|
120
116
|
compact_proof_lock: asyncio.Lock
|
|
121
117
|
|
|
118
|
+
_log_coins: bool
|
|
119
|
+
|
|
122
120
|
@staticmethod
|
|
123
121
|
async def create(
|
|
124
122
|
coin_store: CoinStore,
|
|
@@ -126,9 +124,9 @@ class Blockchain:
|
|
|
126
124
|
consensus_constants: ConsensusConstants,
|
|
127
125
|
blockchain_dir: Path,
|
|
128
126
|
reserved_cores: int,
|
|
129
|
-
multiprocessing_context: Optional[BaseContext] = None,
|
|
130
127
|
*,
|
|
131
128
|
single_threaded: bool = False,
|
|
129
|
+
log_coins: bool = False,
|
|
132
130
|
) -> Blockchain:
|
|
133
131
|
"""
|
|
134
132
|
Initializes a blockchain with the BlockRecords from disk, assuming they have all been
|
|
@@ -136,6 +134,7 @@ class Blockchain:
|
|
|
136
134
|
in the consensus constants config.
|
|
137
135
|
"""
|
|
138
136
|
self = Blockchain()
|
|
137
|
+
self._log_coins = log_coins
|
|
139
138
|
# Blocks are validated under high priority, and transactions under low priority. This guarantees blocks will
|
|
140
139
|
# be validated first.
|
|
141
140
|
self.priority_mutex = PriorityMutex.create(priority_type=BlockchainMutexPriority)
|
|
@@ -145,11 +144,8 @@ class Blockchain:
|
|
|
145
144
|
else:
|
|
146
145
|
cpu_count = available_logical_cores()
|
|
147
146
|
num_workers = max(cpu_count - reserved_cores, 1)
|
|
148
|
-
self.pool =
|
|
147
|
+
self.pool = ThreadPoolExecutor(
|
|
149
148
|
max_workers=num_workers,
|
|
150
|
-
mp_context=multiprocessing_context,
|
|
151
|
-
initializer=setproctitle,
|
|
152
|
-
initargs=(f"{getproctitle()}_block_validation_worker",),
|
|
153
149
|
)
|
|
154
150
|
log.info(f"Started {num_workers} processes for block validation")
|
|
155
151
|
|
|
@@ -267,32 +263,32 @@ class Blockchain:
|
|
|
267
263
|
assert fork_info.peak_height == block.height - 1
|
|
268
264
|
assert block.height == 0 or fork_info.peak_hash == block.prev_header_hash
|
|
269
265
|
|
|
270
|
-
|
|
266
|
+
additions: list[tuple[Coin, Optional[bytes]]] = []
|
|
267
|
+
removals: list[Coin] = []
|
|
271
268
|
if block.transactions_generator is not None:
|
|
272
269
|
block_generator: Optional[BlockGenerator] = await get_block_generator(self.lookup_block_generators, block)
|
|
273
270
|
assert block_generator is not None
|
|
274
271
|
assert block.transactions_info is not None
|
|
275
272
|
assert block.foliage_transaction_block is not None
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
block.
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
273
|
+
flags = get_flags_for_height_and_constants(block.height, self.constants)
|
|
274
|
+
additions, removals = additions_and_removals(
|
|
275
|
+
bytes(block.transactions_generator),
|
|
276
|
+
block_generator.generator_refs,
|
|
277
|
+
flags,
|
|
278
|
+
self.constants,
|
|
282
279
|
)
|
|
283
|
-
assert npc.error is None
|
|
284
280
|
|
|
285
|
-
fork_info.
|
|
281
|
+
fork_info.include_block(additions, removals, block, block.header_hash)
|
|
286
282
|
|
|
287
283
|
async def add_block(
|
|
288
284
|
self,
|
|
289
285
|
block: FullBlock,
|
|
290
286
|
pre_validation_result: PreValidationResult,
|
|
291
|
-
bls_cache: Optional[BLSCache],
|
|
292
287
|
sub_slot_iters: uint64,
|
|
293
|
-
fork_info:
|
|
288
|
+
fork_info: ForkInfo,
|
|
294
289
|
prev_ses_block: Optional[BlockRecord] = None,
|
|
295
|
-
|
|
290
|
+
block_record: Optional[BlockRecord] = None,
|
|
291
|
+
) -> tuple[AddBlockResult, Optional[Err], Optional[StateChangeSummary]]:
|
|
296
292
|
"""
|
|
297
293
|
This method must be called under the blockchain lock
|
|
298
294
|
Adds a new block into the blockchain, if it's valid and connected to the current
|
|
@@ -303,9 +299,6 @@ class Blockchain:
|
|
|
303
299
|
Args:
|
|
304
300
|
block: The FullBlock to be validated.
|
|
305
301
|
pre_validation_result: A result of successful pre validation
|
|
306
|
-
bls_cache: An optional cache of pairings that are likely to be part
|
|
307
|
-
of the aggregate signature. If this is set, the cache will always
|
|
308
|
-
be used (which may be slower if there are no cache hits).
|
|
309
302
|
fork_info: Information about the fork chain this block is part of,
|
|
310
303
|
to make validation more efficient. This is an in-out parameter.
|
|
311
304
|
|
|
@@ -345,78 +338,38 @@ class Blockchain:
|
|
|
345
338
|
|
|
346
339
|
header_hash: bytes32 = block.header_hash
|
|
347
340
|
|
|
348
|
-
#
|
|
349
|
-
#
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
if
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
# this is the common and efficient case where we extend the main
|
|
359
|
-
# chain. The fork_info can be empty
|
|
360
|
-
prev_height = block.height - 1
|
|
361
|
-
fork_info = ForkInfo(prev_height, prev_height, block.prev_header_hash)
|
|
341
|
+
# passing in correct fork_info is critical for performing reorgs
|
|
342
|
+
# correctly, so we perform some validation of it here
|
|
343
|
+
assert block.height - 1 == fork_info.peak_height
|
|
344
|
+
assert len(fork_info.block_hashes) == fork_info.peak_height - fork_info.fork_height
|
|
345
|
+
if fork_info.peak_height == fork_info.fork_height:
|
|
346
|
+
# if fork_info is saying we're not on a fork, the previous block better
|
|
347
|
+
# be part of the main chain
|
|
348
|
+
assert block.prev_header_hash == fork_info.peak_hash
|
|
349
|
+
if fork_info.fork_height == -1:
|
|
350
|
+
assert fork_info.peak_hash == self.constants.GENESIS_CHALLENGE
|
|
362
351
|
else:
|
|
363
|
-
assert
|
|
364
|
-
# the block is extending a fork, and we don't have any fork_info
|
|
365
|
-
# for it. This can potentially be quite expensive and we should
|
|
366
|
-
# try to avoid getting here
|
|
367
|
-
|
|
368
|
-
# first, collect all the block hashes of the forked chain
|
|
369
|
-
# the block we're trying to add doesn't exist in the chain yet,
|
|
370
|
-
# so we need to start traversing from its prev_header_hash
|
|
371
|
-
fork_chain, fork_hash = await lookup_fork_chain(
|
|
372
|
-
self,
|
|
373
|
-
(peak.height, peak.header_hash),
|
|
374
|
-
(block.height - 1, block.prev_header_hash),
|
|
375
|
-
self.constants,
|
|
376
|
-
)
|
|
377
|
-
# now we know how long the fork is, and can compute the fork
|
|
378
|
-
# height.
|
|
379
|
-
fork_height = block.height - len(fork_chain) - 1
|
|
380
|
-
fork_info = ForkInfo(fork_height, fork_height, fork_hash)
|
|
381
|
-
|
|
382
|
-
log.warning(
|
|
383
|
-
f"slow path in block validation. Building coin set for fork ({fork_height}, {block.height})"
|
|
384
|
-
)
|
|
385
|
-
|
|
386
|
-
# now run all the blocks of the fork to compute the additions
|
|
387
|
-
# and removals. They are recorded in the fork_info object
|
|
388
|
-
counter = 0
|
|
389
|
-
start = time.monotonic()
|
|
390
|
-
for height in range(fork_info.fork_height + 1, block.height):
|
|
391
|
-
fork_block: Optional[FullBlock] = await self.block_store.get_full_block(fork_chain[uint32(height)])
|
|
392
|
-
assert fork_block is not None
|
|
393
|
-
assert fork_block.height - 1 == fork_info.peak_height
|
|
394
|
-
assert fork_block.height == 0 or fork_block.prev_header_hash == fork_info.peak_hash
|
|
395
|
-
await self.run_single_block(fork_block, fork_info)
|
|
396
|
-
counter += 1
|
|
397
|
-
end = time.monotonic()
|
|
398
|
-
log.info(
|
|
399
|
-
f"executed {counter} block generators in {end - start:2f} s. "
|
|
400
|
-
f"{len(fork_info.additions_since_fork)} additions, "
|
|
401
|
-
f"{len(fork_info.removals_since_fork)} removals"
|
|
402
|
-
)
|
|
403
|
-
|
|
352
|
+
assert self.height_to_hash(uint32(fork_info.fork_height)) == block.prev_header_hash
|
|
404
353
|
else:
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
354
|
+
assert fork_info.peak_hash == block.prev_header_hash
|
|
355
|
+
|
|
356
|
+
if extending_main_chain:
|
|
357
|
+
fork_info.reset(block.height - 1, block.prev_header_hash)
|
|
358
|
+
|
|
359
|
+
# we dont consider block_record passed in here since it might be from
|
|
360
|
+
# a current sync process and not yet fully validated and commited to the DB
|
|
361
|
+
block_rec_from_db = await self.get_block_record_from_db(header_hash)
|
|
362
|
+
if block_rec_from_db is not None:
|
|
363
|
+
# We have already validated the block, but if it's not part of the
|
|
364
|
+
# main chain, we still need to re-run it to update the additions and
|
|
365
|
+
# removals in fork_info.
|
|
366
|
+
await self.advance_fork_info(block, fork_info)
|
|
367
|
+
fork_info.include_spends(pre_validation_result.conds, block, header_hash)
|
|
368
|
+
self.add_block_record(block_rec_from_db)
|
|
369
|
+
return AddBlockResult.ALREADY_HAVE_BLOCK, None, None
|
|
370
|
+
|
|
371
|
+
if fork_info.peak_hash != block.prev_header_hash:
|
|
372
|
+
await self.advance_fork_info(block, fork_info)
|
|
420
373
|
|
|
421
374
|
# if these prerequisites of the fork_info aren't met, the fork_info
|
|
422
375
|
# object is invalid for this block. If the caller would have passed in
|
|
@@ -424,7 +377,8 @@ class Blockchain:
|
|
|
424
377
|
assert fork_info.peak_height == block.height - 1
|
|
425
378
|
assert block.height == 0 or fork_info.peak_hash == block.prev_header_hash
|
|
426
379
|
|
|
427
|
-
|
|
380
|
+
assert block.transactions_generator is None or pre_validation_result.validated_signature
|
|
381
|
+
error_code = await validate_block_body(
|
|
428
382
|
self.constants,
|
|
429
383
|
self,
|
|
430
384
|
self.coin_store.get_coin_records,
|
|
@@ -432,9 +386,7 @@ class Blockchain:
|
|
|
432
386
|
block.height,
|
|
433
387
|
pre_validation_result.conds,
|
|
434
388
|
fork_info,
|
|
435
|
-
|
|
436
|
-
# If we did not already validate the signature, validate it now
|
|
437
|
-
validate_signature=not pre_validation_result.validated_signature,
|
|
389
|
+
log_coins=self._log_coins,
|
|
438
390
|
)
|
|
439
391
|
if error_code is not None:
|
|
440
392
|
return AddBlockResult.INVALID_BLOCK, error_code, None
|
|
@@ -449,18 +401,20 @@ class Blockchain:
|
|
|
449
401
|
if not genesis and prev_block is not None:
|
|
450
402
|
self.add_block_record(prev_block)
|
|
451
403
|
|
|
452
|
-
block_record
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
404
|
+
if block_record is None:
|
|
405
|
+
block_record = block_to_block_record(
|
|
406
|
+
self.constants,
|
|
407
|
+
self,
|
|
408
|
+
required_iters,
|
|
409
|
+
block,
|
|
410
|
+
sub_slot_iters=sub_slot_iters,
|
|
411
|
+
prev_ses_block=prev_ses_block,
|
|
412
|
+
)
|
|
460
413
|
|
|
461
414
|
# in case we fail and need to restore the blockchain state, remember the
|
|
462
415
|
# peak height
|
|
463
416
|
previous_peak_height = self._peak_height
|
|
417
|
+
prev_fork_peak = (fork_info.peak_height, fork_info.peak_hash)
|
|
464
418
|
|
|
465
419
|
try:
|
|
466
420
|
# Always add the block to the database
|
|
@@ -497,7 +451,8 @@ class Blockchain:
|
|
|
497
451
|
self.remove_block_record(header_hash)
|
|
498
452
|
except KeyError:
|
|
499
453
|
pass
|
|
500
|
-
fork_info
|
|
454
|
+
# restore fork_info to the state before adding the block
|
|
455
|
+
fork_info.rollback(prev_fork_peak[1], prev_fork_peak[0])
|
|
501
456
|
self.block_store.rollback_cache_block(header_hash)
|
|
502
457
|
self._peak_height = previous_peak_height
|
|
503
458
|
log.error(
|
|
@@ -522,7 +477,7 @@ class Blockchain:
|
|
|
522
477
|
block_record: BlockRecord,
|
|
523
478
|
genesis: bool,
|
|
524
479
|
fork_info: ForkInfo,
|
|
525
|
-
) ->
|
|
480
|
+
) -> tuple[list[BlockRecord], Optional[StateChangeSummary]]:
|
|
526
481
|
"""
|
|
527
482
|
When a new block is added, this is called, to check if the new block is the new peak of the chain.
|
|
528
483
|
This also handles reorgs by reverting blocks which are not in the heaviest chain.
|
|
@@ -531,7 +486,7 @@ class Blockchain:
|
|
|
531
486
|
"""
|
|
532
487
|
|
|
533
488
|
peak = self.get_peak()
|
|
534
|
-
rolled_back_state:
|
|
489
|
+
rolled_back_state: dict[bytes32, CoinRecord] = {}
|
|
535
490
|
|
|
536
491
|
if genesis and peak is not None:
|
|
537
492
|
return [], None
|
|
@@ -543,16 +498,49 @@ class Blockchain:
|
|
|
543
498
|
if block_record.weight == peak.weight and peak.total_iters <= block_record.total_iters:
|
|
544
499
|
# this is an equal weight block but our peak has lower iterations, so we dont change the coin set
|
|
545
500
|
return [], None
|
|
501
|
+
if block_record.weight == peak.weight:
|
|
502
|
+
log.info(
|
|
503
|
+
f"block has equal weight as our peak ({peak.weight}), but fewer "
|
|
504
|
+
f"total iterations {block_record.total_iters} "
|
|
505
|
+
f"peak: {peak.total_iters} "
|
|
506
|
+
f"peak-hash: {peak.header_hash}"
|
|
507
|
+
)
|
|
546
508
|
|
|
547
509
|
if block_record.prev_hash != peak.header_hash:
|
|
548
510
|
for coin_record in await self.coin_store.rollback_to_block(fork_info.fork_height):
|
|
549
511
|
rolled_back_state[coin_record.name] = coin_record
|
|
512
|
+
if self._log_coins and len(rolled_back_state) > 0:
|
|
513
|
+
log.info(f"rolled back {len(rolled_back_state)} coins, to fork height {fork_info.fork_height}")
|
|
514
|
+
log.info(
|
|
515
|
+
"removed: %s",
|
|
516
|
+
",".join(
|
|
517
|
+
[
|
|
518
|
+
name.hex()[0:6]
|
|
519
|
+
for name, state in rolled_back_state.items()
|
|
520
|
+
if state.confirmed_block_index == 0
|
|
521
|
+
]
|
|
522
|
+
),
|
|
523
|
+
)
|
|
524
|
+
log.info(
|
|
525
|
+
"unspent: %s",
|
|
526
|
+
",".join(
|
|
527
|
+
[
|
|
528
|
+
name.hex()[0:6]
|
|
529
|
+
for name, state in rolled_back_state.items()
|
|
530
|
+
if state.confirmed_block_index != 0
|
|
531
|
+
]
|
|
532
|
+
),
|
|
533
|
+
)
|
|
550
534
|
|
|
551
535
|
# Collects all blocks from fork point to new peak
|
|
552
|
-
records_to_add:
|
|
536
|
+
records_to_add: list[BlockRecord] = []
|
|
553
537
|
|
|
554
538
|
if genesis:
|
|
555
539
|
records_to_add = [block_record]
|
|
540
|
+
elif fork_info.block_hashes == [block_record.header_hash]:
|
|
541
|
+
# in the common case, we just add a block on top of the chain. Check
|
|
542
|
+
# for that here to avoid an unnecessary database lookup.
|
|
543
|
+
records_to_add = [block_record]
|
|
556
544
|
else:
|
|
557
545
|
records_to_add = await self.block_store.get_block_records_by_hash(fork_info.block_hashes)
|
|
558
546
|
|
|
@@ -589,6 +577,15 @@ class Blockchain:
|
|
|
589
577
|
tx_additions,
|
|
590
578
|
tx_removals,
|
|
591
579
|
)
|
|
580
|
+
if self._log_coins and (len(tx_removals) > 0 or len(tx_additions) > 0):
|
|
581
|
+
log.info(
|
|
582
|
+
f"adding new block to coin_store "
|
|
583
|
+
f"(hh: {fetched_block_record.header_hash} "
|
|
584
|
+
f"height: {fetched_block_record.height}), {len(tx_removals)} spends"
|
|
585
|
+
)
|
|
586
|
+
log.info("rewards: %s", ",".join([add.name().hex()[0:6] for add in included_reward_coins]))
|
|
587
|
+
log.info("additions: %s", ",".join([add.name().hex()[0:6] for add in tx_additions]))
|
|
588
|
+
log.info("removals: %s", ",".join([f"{rem}"[0:6] for rem in tx_removals]))
|
|
592
589
|
|
|
593
590
|
# we made it to the end successfully
|
|
594
591
|
# Rollback sub_epoch_summaries
|
|
@@ -628,7 +625,7 @@ class Blockchain:
|
|
|
628
625
|
|
|
629
626
|
async def get_sp_and_ip_sub_slots(
|
|
630
627
|
self, header_hash: bytes32
|
|
631
|
-
) -> Optional[
|
|
628
|
+
) -> Optional[tuple[Optional[EndOfSubSlotBundle], Optional[EndOfSubSlotBundle]]]:
|
|
632
629
|
block: Optional[FullBlock] = await self.block_store.get_full_block(header_hash)
|
|
633
630
|
if block is None:
|
|
634
631
|
return None
|
|
@@ -679,11 +676,11 @@ class Blockchain:
|
|
|
679
676
|
return None, ip_sub_slot
|
|
680
677
|
return prev_curr.finished_sub_slots[-1], ip_sub_slot
|
|
681
678
|
|
|
682
|
-
def get_recent_reward_challenges(self) ->
|
|
679
|
+
def get_recent_reward_challenges(self) -> list[tuple[bytes32, uint128]]:
|
|
683
680
|
peak = self.get_peak()
|
|
684
681
|
if peak is None:
|
|
685
682
|
return []
|
|
686
|
-
recent_rc:
|
|
683
|
+
recent_rc: list[tuple[bytes32, uint128]] = []
|
|
687
684
|
curr: Optional[BlockRecord] = peak
|
|
688
685
|
while curr is not None and len(recent_rc) < 2 * self.constants.MAX_SUB_SLOT_BLOCKS:
|
|
689
686
|
if curr != peak:
|
|
@@ -702,7 +699,7 @@ class Blockchain:
|
|
|
702
699
|
|
|
703
700
|
async def validate_unfinished_block_header(
|
|
704
701
|
self, block: UnfinishedBlock, skip_overflow_ss_validation: bool = True
|
|
705
|
-
) ->
|
|
702
|
+
) -> tuple[Optional[uint64], Optional[Err]]:
|
|
706
703
|
if len(block.transactions_generator_ref_list) > self.constants.MAX_GENERATOR_REF_LIST_SIZE:
|
|
707
704
|
return None, Err.TOO_MANY_GENERATOR_REFS
|
|
708
705
|
|
|
@@ -745,13 +742,13 @@ class Blockchain:
|
|
|
745
742
|
sub_slot_iters, difficulty = get_next_sub_slot_iters_and_difficulty(
|
|
746
743
|
self.constants, len(unfinished_header_block.finished_sub_slots) > 0, prev_b, self
|
|
747
744
|
)
|
|
745
|
+
expected_vs = ValidationState(sub_slot_iters, difficulty, None)
|
|
748
746
|
required_iters, error = validate_unfinished_header_block(
|
|
749
747
|
self.constants,
|
|
750
748
|
self,
|
|
751
749
|
unfinished_header_block,
|
|
752
750
|
False,
|
|
753
|
-
|
|
754
|
-
sub_slot_iters,
|
|
751
|
+
expected_vs,
|
|
755
752
|
skip_overflow_ss_validation,
|
|
756
753
|
)
|
|
757
754
|
if error is not None:
|
|
@@ -764,7 +761,7 @@ class Blockchain:
|
|
|
764
761
|
required_iters, error = await self.validate_unfinished_block_header(block, skip_overflow_ss_validation)
|
|
765
762
|
|
|
766
763
|
if error is not None:
|
|
767
|
-
return PreValidationResult(uint16(error.value), None, None,
|
|
764
|
+
return PreValidationResult(uint16(error.value), None, None, uint32(0))
|
|
768
765
|
|
|
769
766
|
prev_height = (
|
|
770
767
|
-1
|
|
@@ -774,39 +771,22 @@ class Blockchain:
|
|
|
774
771
|
|
|
775
772
|
fork_info = ForkInfo(prev_height, prev_height, block.prev_header_hash)
|
|
776
773
|
|
|
777
|
-
|
|
774
|
+
conds = None if npc_result is None else npc_result.conds
|
|
775
|
+
error_code = await validate_block_body(
|
|
778
776
|
self.constants,
|
|
779
777
|
self,
|
|
780
778
|
self.coin_store.get_coin_records,
|
|
781
779
|
block,
|
|
782
780
|
uint32(prev_height + 1),
|
|
783
|
-
|
|
781
|
+
conds,
|
|
784
782
|
fork_info,
|
|
785
|
-
|
|
786
|
-
validate_signature=False, # Signature was already validated before calling this method, no need to validate
|
|
783
|
+
log_coins=self._log_coins,
|
|
787
784
|
)
|
|
788
785
|
|
|
789
786
|
if error_code is not None:
|
|
790
|
-
return PreValidationResult(uint16(error_code.value), None, None,
|
|
787
|
+
return PreValidationResult(uint16(error_code.value), None, None, uint32(0))
|
|
791
788
|
|
|
792
|
-
return PreValidationResult(None, required_iters,
|
|
793
|
-
|
|
794
|
-
async def run_generator(self, unfinished_block: bytes, generator: BlockGenerator, height: uint32) -> NPCResult:
|
|
795
|
-
task = asyncio.get_running_loop().run_in_executor(
|
|
796
|
-
self.pool,
|
|
797
|
-
_run_generator,
|
|
798
|
-
self.constants,
|
|
799
|
-
unfinished_block,
|
|
800
|
-
bytes(generator),
|
|
801
|
-
height,
|
|
802
|
-
)
|
|
803
|
-
npc_result_bytes = await task
|
|
804
|
-
if npc_result_bytes is None:
|
|
805
|
-
raise ConsensusError(Err.UNKNOWN)
|
|
806
|
-
ret: NPCResult = NPCResult.from_bytes(npc_result_bytes)
|
|
807
|
-
if ret.error is not None:
|
|
808
|
-
raise ConsensusError(Err(ret.error))
|
|
809
|
-
return ret
|
|
789
|
+
return PreValidationResult(None, required_iters, conds, uint32(0))
|
|
810
790
|
|
|
811
791
|
def contains_block(self, header_hash: bytes32) -> bool:
|
|
812
792
|
"""
|
|
@@ -825,7 +805,7 @@ class Blockchain:
|
|
|
825
805
|
raise ValueError(f"Height is not in blockchain: {height}")
|
|
826
806
|
return self.block_record(header_hash)
|
|
827
807
|
|
|
828
|
-
def get_ses_heights(self) ->
|
|
808
|
+
def get_ses_heights(self) -> list[uint32]:
|
|
829
809
|
return self.__height_map.get_ses_heights()
|
|
830
810
|
|
|
831
811
|
def get_ses(self, height: uint32) -> SubEpochSummary:
|
|
@@ -877,7 +857,7 @@ class Blockchain:
|
|
|
877
857
|
|
|
878
858
|
if height == 0:
|
|
879
859
|
break
|
|
880
|
-
height
|
|
860
|
+
height -= 1
|
|
881
861
|
blocks_to_remove = self.__heights_in_cache.get(uint32(height), None)
|
|
882
862
|
|
|
883
863
|
def clean_block_records(self) -> None:
|
|
@@ -895,41 +875,49 @@ class Blockchain:
|
|
|
895
875
|
return None
|
|
896
876
|
self.clean_block_record(self._peak_height - self.constants.BLOCKS_CACHE_SIZE)
|
|
897
877
|
|
|
898
|
-
async def get_block_records_in_range(self, start: int, stop: int) ->
|
|
878
|
+
async def get_block_records_in_range(self, start: int, stop: int) -> dict[bytes32, BlockRecord]:
|
|
899
879
|
return await self.block_store.get_block_records_in_range(start, stop)
|
|
900
880
|
|
|
901
881
|
async def get_header_blocks_in_range(
|
|
902
882
|
self, start: int, stop: int, tx_filter: bool = True
|
|
903
|
-
) ->
|
|
883
|
+
) -> dict[bytes32, HeaderBlock]:
|
|
904
884
|
hashes = []
|
|
905
885
|
for height in range(start, stop + 1):
|
|
906
886
|
header_hash: Optional[bytes32] = self.height_to_hash(uint32(height))
|
|
907
887
|
if header_hash is not None:
|
|
908
888
|
hashes.append(header_hash)
|
|
909
889
|
|
|
910
|
-
blocks:
|
|
890
|
+
blocks: list[FullBlock] = []
|
|
911
891
|
for hash in hashes.copy():
|
|
912
892
|
block = self.block_store.block_cache.get(hash)
|
|
913
893
|
if block is not None:
|
|
914
894
|
blocks.append(block)
|
|
915
895
|
hashes.remove(hash)
|
|
916
|
-
blocks_on_disk:
|
|
896
|
+
blocks_on_disk: list[FullBlock] = await self.block_store.get_blocks_by_hash(hashes)
|
|
917
897
|
blocks.extend(blocks_on_disk)
|
|
918
|
-
header_blocks:
|
|
898
|
+
header_blocks: dict[bytes32, HeaderBlock] = {}
|
|
919
899
|
|
|
920
900
|
for block in blocks:
|
|
921
901
|
if self.height_to_hash(block.height) != block.header_hash:
|
|
922
902
|
raise ValueError(f"Block at {block.header_hash} is no longer in the blockchain (it's in a fork)")
|
|
923
903
|
if tx_filter is False:
|
|
924
|
-
header = get_block_header(block
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
removed: List[CoinRecord] = await self.coin_store.get_coins_removed_at_height(block.height)
|
|
930
|
-
header = get_block_header(
|
|
931
|
-
block, [record.coin for record in tx_additions], [record.coin.name() for record in removed]
|
|
904
|
+
header = get_block_header(block)
|
|
905
|
+
elif block.transactions_generator is not None:
|
|
906
|
+
added_coins_records, removed_coins_records = await asyncio.gather(
|
|
907
|
+
self.coin_store.get_coins_added_at_height(block.height),
|
|
908
|
+
self.coin_store.get_coins_removed_at_height(block.height),
|
|
932
909
|
)
|
|
910
|
+
tx_additions = [cr.coin for cr in added_coins_records if not cr.coinbase]
|
|
911
|
+
removed = [cr.coin.name() for cr in removed_coins_records]
|
|
912
|
+
header = get_block_header(block, (removed, tx_additions))
|
|
913
|
+
elif block.is_transaction_block():
|
|
914
|
+
# This is a transaction block with just reward coins.
|
|
915
|
+
# We're sending empty additions and removals to signal that we
|
|
916
|
+
# want the transactions filter to be computed.
|
|
917
|
+
header = get_block_header(block, ([], []))
|
|
918
|
+
else:
|
|
919
|
+
# Non transaction block.
|
|
920
|
+
header = get_block_header(block)
|
|
933
921
|
header_blocks[header.header_hash] = header
|
|
934
922
|
|
|
935
923
|
return header_blocks
|
|
@@ -937,19 +925,19 @@ class Blockchain:
|
|
|
937
925
|
async def get_header_block_by_height(
|
|
938
926
|
self, height: int, header_hash: bytes32, tx_filter: bool = True
|
|
939
927
|
) -> Optional[HeaderBlock]:
|
|
940
|
-
header_dict:
|
|
928
|
+
header_dict: dict[bytes32, HeaderBlock] = await self.get_header_blocks_in_range(height, height, tx_filter)
|
|
941
929
|
if len(header_dict) == 0:
|
|
942
930
|
return None
|
|
943
931
|
if header_hash not in header_dict:
|
|
944
932
|
return None
|
|
945
933
|
return header_dict[header_hash]
|
|
946
934
|
|
|
947
|
-
async def get_block_records_at(self, heights:
|
|
935
|
+
async def get_block_records_at(self, heights: list[uint32], batch_size: int = 900) -> list[BlockRecord]:
|
|
948
936
|
"""
|
|
949
937
|
gets block records by height (only blocks that are part of the chain)
|
|
950
938
|
"""
|
|
951
|
-
records:
|
|
952
|
-
hashes:
|
|
939
|
+
records: list[BlockRecord] = []
|
|
940
|
+
hashes: list[bytes32] = []
|
|
953
941
|
assert batch_size < self.block_store.db_wrapper.host_parameter_limit
|
|
954
942
|
for height in heights:
|
|
955
943
|
header_hash: Optional[bytes32] = self.height_to_hash(height)
|
|
@@ -977,7 +965,7 @@ class Blockchain:
|
|
|
977
965
|
return ret
|
|
978
966
|
return await self.block_store.get_block_record(header_hash)
|
|
979
967
|
|
|
980
|
-
async def prev_block_hash(self, header_hashes:
|
|
968
|
+
async def prev_block_hash(self, header_hashes: list[bytes32]) -> list[bytes32]:
|
|
981
969
|
"""
|
|
982
970
|
Given a list of block header hashes, returns the previous header hashes
|
|
983
971
|
for each block, in the order they were passed in.
|
|
@@ -1014,15 +1002,15 @@ class Blockchain:
|
|
|
1014
1002
|
self.__heights_in_cache[block_record.height].add(block_record.header_hash)
|
|
1015
1003
|
|
|
1016
1004
|
async def persist_sub_epoch_challenge_segments(
|
|
1017
|
-
self, ses_block_hash: bytes32, segments:
|
|
1005
|
+
self, ses_block_hash: bytes32, segments: list[SubEpochChallengeSegment]
|
|
1018
1006
|
) -> None:
|
|
1019
1007
|
await self.block_store.persist_sub_epoch_challenge_segments(ses_block_hash, segments)
|
|
1020
1008
|
|
|
1021
1009
|
async def get_sub_epoch_challenge_segments(
|
|
1022
1010
|
self,
|
|
1023
1011
|
ses_block_hash: bytes32,
|
|
1024
|
-
) -> Optional[
|
|
1025
|
-
segments: Optional[
|
|
1012
|
+
) -> Optional[list[SubEpochChallengeSegment]]:
|
|
1013
|
+
segments: Optional[list[SubEpochChallengeSegment]] = await self.block_store.get_sub_epoch_challenge_segments(
|
|
1026
1014
|
ses_block_hash
|
|
1027
1015
|
)
|
|
1028
1016
|
if segments is None:
|
|
@@ -1040,9 +1028,8 @@ class Blockchain:
|
|
|
1040
1028
|
self._seen_compact_proofs.add(pot_tuple)
|
|
1041
1029
|
return False
|
|
1042
1030
|
|
|
1043
|
-
async def lookup_block_generators(self, header_hash: bytes32, generator_refs:
|
|
1044
|
-
|
|
1045
|
-
generators: Dict[uint32, bytes] = {}
|
|
1031
|
+
async def lookup_block_generators(self, header_hash: bytes32, generator_refs: set[uint32]) -> dict[uint32, bytes]:
|
|
1032
|
+
generators: dict[uint32, bytes] = {}
|
|
1046
1033
|
|
|
1047
1034
|
# if this is empty, we shouldn't have called this function to begin with
|
|
1048
1035
|
assert len(generator_refs)
|
|
@@ -1071,7 +1058,7 @@ class Blockchain:
|
|
|
1071
1058
|
if self.height_to_hash(peak_block.height) != header_hash:
|
|
1072
1059
|
peak: Optional[BlockRecord] = self.get_peak()
|
|
1073
1060
|
assert peak is not None
|
|
1074
|
-
reorg_chain:
|
|
1061
|
+
reorg_chain: dict[uint32, bytes32]
|
|
1075
1062
|
# Then we look up blocks up to fork point one at a time, backtracking
|
|
1076
1063
|
reorg_chain, _ = await lookup_fork_chain(
|
|
1077
1064
|
self,
|