chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.6.0rc2__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/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_blockchain_transactions.py +5 -2
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +66 -31
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +273 -70
- chia/_tests/core/full_node/test_hard_fork_utils.py +92 -0
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +198 -30
- chia/_tests/core/mempool/test_mempool.py +54 -50
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +988 -854
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +9 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +63 -60
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +17 -17
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +16 -15
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +374 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- 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/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +19 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +50 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +239 -223
- chia/full_node/full_node_api.py +197 -152
- chia/full_node/full_node_rpc_api.py +34 -32
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hard_fork_utils.py +44 -0
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +120 -36
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +4 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +24 -10
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +142 -106
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/RECORD +510 -517
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.6.0rc2.dist-info}/licenses/LICENSE +0 -0
chia/full_node/weight_proof.py
CHANGED
|
@@ -8,7 +8,7 @@ import random
|
|
|
8
8
|
import tempfile
|
|
9
9
|
from concurrent.futures.process import ProcessPoolExecutor
|
|
10
10
|
from multiprocessing.context import BaseContext
|
|
11
|
-
from typing import IO
|
|
11
|
+
from typing import IO
|
|
12
12
|
|
|
13
13
|
from chia_rs import (
|
|
14
14
|
BlockRecord,
|
|
@@ -30,7 +30,7 @@ from chia.consensus.block_header_validation import validate_finished_header_bloc
|
|
|
30
30
|
from chia.consensus.blockchain_interface import BlockchainInterface
|
|
31
31
|
from chia.consensus.deficit import calculate_deficit
|
|
32
32
|
from chia.consensus.full_block_to_block_record import header_block_to_sub_block_record
|
|
33
|
-
from chia.consensus.get_block_challenge import
|
|
33
|
+
from chia.consensus.get_block_challenge import pre_sp_tx_block_height
|
|
34
34
|
from chia.consensus.pot_iterations import (
|
|
35
35
|
calculate_ip_iters,
|
|
36
36
|
calculate_sp_iters,
|
|
@@ -67,24 +67,24 @@ class WeightProofHandler:
|
|
|
67
67
|
self,
|
|
68
68
|
constants: ConsensusConstants,
|
|
69
69
|
blockchain: BlockchainInterface,
|
|
70
|
-
multiprocessing_context:
|
|
70
|
+
multiprocessing_context: BaseContext | None = None,
|
|
71
71
|
):
|
|
72
|
-
self.tip:
|
|
73
|
-
self.proof:
|
|
72
|
+
self.tip: bytes32 | None = None
|
|
73
|
+
self.proof: WeightProof | None = None
|
|
74
74
|
self.constants = constants
|
|
75
75
|
self.blockchain = blockchain
|
|
76
76
|
self.lock = asyncio.Lock()
|
|
77
77
|
self._num_processes = 4
|
|
78
78
|
self.multiprocessing_context = multiprocessing_context
|
|
79
79
|
|
|
80
|
-
async def get_proof_of_weight(self, tip: bytes32) ->
|
|
80
|
+
async def get_proof_of_weight(self, tip: bytes32) -> WeightProof | None:
|
|
81
81
|
tip_rec = self.blockchain.try_block_record(tip)
|
|
82
82
|
if tip_rec is None:
|
|
83
83
|
log.error("unknown tip")
|
|
84
84
|
return None
|
|
85
85
|
|
|
86
86
|
if tip_rec.height < self.constants.WEIGHT_PROOF_RECENT_BLOCKS:
|
|
87
|
-
log.
|
|
87
|
+
log.info(f"chain to short for weight proof. tip: {tip_rec.height}")
|
|
88
88
|
return None
|
|
89
89
|
|
|
90
90
|
async with self.lock:
|
|
@@ -108,7 +108,7 @@ class WeightProofHandler:
|
|
|
108
108
|
sub_epoch_data.append(_create_sub_epoch_data(ses))
|
|
109
109
|
return sub_epoch_data
|
|
110
110
|
|
|
111
|
-
async def _create_proof_of_weight(self, tip: bytes32) ->
|
|
111
|
+
async def _create_proof_of_weight(self, tip: bytes32) -> WeightProof | None:
|
|
112
112
|
"""
|
|
113
113
|
Creates a weight proof object
|
|
114
114
|
"""
|
|
@@ -124,6 +124,10 @@ class WeightProofHandler:
|
|
|
124
124
|
return None
|
|
125
125
|
|
|
126
126
|
summary_heights = self.blockchain.get_ses_heights()
|
|
127
|
+
if len(summary_heights) <= 1:
|
|
128
|
+
log.error("not enough sub epochs. perhaps WEIGHT_PROOF_RECENT_BLOCKS is too small")
|
|
129
|
+
return None
|
|
130
|
+
|
|
127
131
|
zero_hash = self.blockchain.height_to_hash(uint32(0))
|
|
128
132
|
assert zero_hash is not None
|
|
129
133
|
prev_ses_block = await self.blockchain.get_block_record_from_db(zero_hash)
|
|
@@ -183,7 +187,7 @@ class WeightProofHandler:
|
|
|
183
187
|
seed = ses.get_hash()
|
|
184
188
|
return seed
|
|
185
189
|
|
|
186
|
-
async def _get_recent_chain(self, tip_height: uint32) ->
|
|
190
|
+
async def _get_recent_chain(self, tip_height: uint32) -> list[HeaderBlock] | None:
|
|
187
191
|
recent_chain: list[HeaderBlock] = []
|
|
188
192
|
ses_heights = self.blockchain.get_ses_heights()
|
|
189
193
|
min_height = 0
|
|
@@ -256,10 +260,10 @@ class WeightProofHandler:
|
|
|
256
260
|
return None
|
|
257
261
|
|
|
258
262
|
summary_heights = self.blockchain.get_ses_heights()
|
|
259
|
-
h_hash:
|
|
263
|
+
h_hash: bytes32 | None = self.blockchain.height_to_hash(uint32(0))
|
|
260
264
|
if h_hash is None:
|
|
261
265
|
return None
|
|
262
|
-
prev_ses_block:
|
|
266
|
+
prev_ses_block: BlockRecord | None = await self.blockchain.get_block_record_from_db(h_hash)
|
|
263
267
|
if prev_ses_block is None:
|
|
264
268
|
return None
|
|
265
269
|
|
|
@@ -294,7 +298,7 @@ class WeightProofHandler:
|
|
|
294
298
|
|
|
295
299
|
async def __create_sub_epoch_segments(
|
|
296
300
|
self, ses_block: BlockRecord, se_start: BlockRecord, sub_epoch_n: uint32
|
|
297
|
-
) ->
|
|
301
|
+
) -> list[SubEpochChallengeSegment] | None:
|
|
298
302
|
segments: list[SubEpochChallengeSegment] = []
|
|
299
303
|
start_height = await self.get_prev_two_slots_height(se_start)
|
|
300
304
|
|
|
@@ -304,7 +308,7 @@ class WeightProofHandler:
|
|
|
304
308
|
header_blocks = await self.blockchain.get_header_blocks_in_range(
|
|
305
309
|
start_height, ses_block.height + self.constants.MAX_SUB_SLOT_BLOCKS, tx_filter=False
|
|
306
310
|
)
|
|
307
|
-
curr:
|
|
311
|
+
curr: HeaderBlock | None = header_blocks[se_start.header_hash]
|
|
308
312
|
height = se_start.height
|
|
309
313
|
assert curr is not None
|
|
310
314
|
first = True
|
|
@@ -354,7 +358,7 @@ class WeightProofHandler:
|
|
|
354
358
|
header_blocks: dict[bytes32, HeaderBlock],
|
|
355
359
|
blocks: dict[bytes32, BlockRecord],
|
|
356
360
|
first_segment_in_sub_epoch: bool,
|
|
357
|
-
) -> tuple[
|
|
361
|
+
) -> tuple[SubEpochChallengeSegment | None, uint32]:
|
|
358
362
|
assert self.blockchain is not None
|
|
359
363
|
sub_slots: list[SubSlotData] = []
|
|
360
364
|
log.debug(f"create challenge segment block {header_block.header_hash} block height {header_block.height} ")
|
|
@@ -401,7 +405,7 @@ class WeightProofHandler:
|
|
|
401
405
|
header_blocks: dict[bytes32, HeaderBlock],
|
|
402
406
|
blocks: dict[bytes32, BlockRecord],
|
|
403
407
|
first_in_sub_epoch: bool,
|
|
404
|
-
) -> tuple[
|
|
408
|
+
) -> tuple[list[SubSlotData] | None, VDFInfo | None]:
|
|
405
409
|
# combine cc vdfs of all reward blocks from the start of the sub slot to end
|
|
406
410
|
header_block_sub_rec = blocks[header_block.header_hash]
|
|
407
411
|
# find slot start
|
|
@@ -476,7 +480,7 @@ class WeightProofHandler:
|
|
|
476
480
|
header_block: HeaderBlock,
|
|
477
481
|
blocks: dict[bytes32, BlockRecord],
|
|
478
482
|
header_blocks: dict[bytes32, HeaderBlock],
|
|
479
|
-
) ->
|
|
483
|
+
) -> VDFInfo | None:
|
|
480
484
|
curr = blocks[header_block.header_hash]
|
|
481
485
|
while curr.height > 0 and not curr.sub_epoch_summary_included:
|
|
482
486
|
curr = blocks[curr.prev_hash]
|
|
@@ -484,7 +488,7 @@ class WeightProofHandler:
|
|
|
484
488
|
|
|
485
489
|
async def __slot_end_vdf(
|
|
486
490
|
self, start_height: uint32, header_blocks: dict[bytes32, HeaderBlock], blocks: dict[bytes32, BlockRecord]
|
|
487
|
-
) -> tuple[
|
|
491
|
+
) -> tuple[list[SubSlotData] | None, uint32]:
|
|
488
492
|
# gets all vdfs first sub slot after challenge block to last sub slot
|
|
489
493
|
log.debug(f"slot end vdf start height {start_height}")
|
|
490
494
|
header_hash = self.blockchain.height_to_hash(start_height)
|
|
@@ -659,7 +663,7 @@ class WeightProofHandler:
|
|
|
659
663
|
|
|
660
664
|
def _get_weights_for_sampling(
|
|
661
665
|
rng: random.Random, total_weight: uint128, recent_chain: list[HeaderBlock]
|
|
662
|
-
) ->
|
|
666
|
+
) -> list[uint128] | None:
|
|
663
667
|
weight_to_check = []
|
|
664
668
|
last_l_weight = recent_chain[-1].reward_chain_block.weight - recent_chain[0].reward_chain_block.weight
|
|
665
669
|
delta = last_l_weight / total_weight
|
|
@@ -680,7 +684,7 @@ def _get_weights_for_sampling(
|
|
|
680
684
|
def _sample_sub_epoch(
|
|
681
685
|
start_of_epoch_weight: uint128,
|
|
682
686
|
end_of_epoch_weight: uint128,
|
|
683
|
-
weight_to_check:
|
|
687
|
+
weight_to_check: list[uint128] | None,
|
|
684
688
|
) -> bool:
|
|
685
689
|
"""
|
|
686
690
|
weight_to_check: list[uint128] is expected to be sorted
|
|
@@ -715,7 +719,7 @@ def _create_sub_epoch_data(
|
|
|
715
719
|
# New work difficulty and iterations per sub-slot
|
|
716
720
|
sub_slot_iters = sub_epoch_summary.new_sub_slot_iters
|
|
717
721
|
new_difficulty = sub_epoch_summary.new_difficulty
|
|
718
|
-
return SubEpochData(reward_chain_hash, previous_sub_epoch_overflows, sub_slot_iters, new_difficulty)
|
|
722
|
+
return SubEpochData(reward_chain_hash, previous_sub_epoch_overflows, sub_slot_iters, new_difficulty, None)
|
|
719
723
|
|
|
720
724
|
|
|
721
725
|
async def _challenge_block_vdfs(
|
|
@@ -762,7 +766,7 @@ async def _challenge_block_vdfs(
|
|
|
762
766
|
return ssd
|
|
763
767
|
|
|
764
768
|
|
|
765
|
-
def handle_finished_slots(end_of_slot: EndOfSubSlotBundle, icc_end_of_slot_info:
|
|
769
|
+
def handle_finished_slots(end_of_slot: EndOfSubSlotBundle, icc_end_of_slot_info: VDFInfo | None) -> SubSlotData:
|
|
766
770
|
return SubSlotData(
|
|
767
771
|
None,
|
|
768
772
|
None,
|
|
@@ -833,7 +837,7 @@ def handle_end_of_slot(
|
|
|
833
837
|
def _validate_sub_epoch_summaries(
|
|
834
838
|
constants: ConsensusConstants,
|
|
835
839
|
weight_proof: WeightProof,
|
|
836
|
-
) -> tuple[
|
|
840
|
+
) -> tuple[list[SubEpochSummary] | None, list[uint128] | None]:
|
|
837
841
|
last_ses_hash, last_ses_sub_height = _get_last_ses_hash(constants, weight_proof.recent_chain_data)
|
|
838
842
|
if last_ses_hash is None:
|
|
839
843
|
log.warning("could not find last ses block")
|
|
@@ -879,6 +883,7 @@ def _map_sub_epoch_summaries(
|
|
|
879
883
|
data.num_blocks_overflow,
|
|
880
884
|
data.new_difficulty,
|
|
881
885
|
data.new_sub_slot_iters,
|
|
886
|
+
None,
|
|
882
887
|
)
|
|
883
888
|
|
|
884
889
|
if idx < len(sub_epoch_data) - 1:
|
|
@@ -929,14 +934,14 @@ def _validate_sub_epoch_segments(
|
|
|
929
934
|
summaries_bytes: list[bytes],
|
|
930
935
|
height: uint32,
|
|
931
936
|
validate_from: int = 0,
|
|
932
|
-
) ->
|
|
937
|
+
) -> list[tuple[VDFProof, ClassgroupElement, VDFInfo]] | None:
|
|
933
938
|
summaries = summaries_from_bytes(summaries_bytes)
|
|
934
939
|
sub_epoch_segments: SubEpochSegments = SubEpochSegments.from_bytes(weight_proof_bytes)
|
|
935
940
|
rc_sub_slot_hash = constants.GENESIS_CHALLENGE
|
|
936
941
|
total_blocks, total_ip_iters = 0, 0
|
|
937
942
|
total_slot_iters, total_slots = 0, 0
|
|
938
943
|
total_ip_iters = 0
|
|
939
|
-
prev_ses:
|
|
944
|
+
prev_ses: SubEpochSummary | None = None
|
|
940
945
|
segments_by_sub_epoch = map_segments_by_sub_epoch(sub_epoch_segments.challenge_segments)
|
|
941
946
|
curr_ssi = constants.SUB_SLOT_ITERS_STARTING
|
|
942
947
|
vdfs_to_validate = []
|
|
@@ -988,7 +993,7 @@ def _validate_segment(
|
|
|
988
993
|
curr_ssi: uint64,
|
|
989
994
|
prev_ssi: uint64,
|
|
990
995
|
curr_difficulty: uint64,
|
|
991
|
-
ses:
|
|
996
|
+
ses: SubEpochSummary | None,
|
|
992
997
|
first_segment_in_se: bool,
|
|
993
998
|
sampled: bool,
|
|
994
999
|
height: uint32,
|
|
@@ -1000,7 +1005,7 @@ def _validate_segment(
|
|
|
1000
1005
|
if sampled and sub_slot_data.is_challenge():
|
|
1001
1006
|
after_challenge = True
|
|
1002
1007
|
required_iters = __validate_pospace(
|
|
1003
|
-
constants, segment, idx, curr_difficulty,
|
|
1008
|
+
constants, segment, idx, curr_difficulty, ses, first_segment_in_se, height
|
|
1004
1009
|
)
|
|
1005
1010
|
if required_iters is None:
|
|
1006
1011
|
return False, uint64(0), uint64(0), uint64(0), []
|
|
@@ -1144,7 +1149,7 @@ def sub_slot_data_vdf_input(
|
|
|
1144
1149
|
) -> ClassgroupElement:
|
|
1145
1150
|
cc_input = ClassgroupElement.get_default_element()
|
|
1146
1151
|
sp_total_iters = get_sp_total_iters(constants, is_overflow, ssi, sub_slot_data)
|
|
1147
|
-
ssd:
|
|
1152
|
+
ssd: SubSlotData | None = None
|
|
1148
1153
|
if is_overflow and new_sub_slot:
|
|
1149
1154
|
if sub_slot_idx >= 2:
|
|
1150
1155
|
if sub_slots[sub_slot_idx - 2].cc_slot_end_info is None:
|
|
@@ -1202,7 +1207,7 @@ def validate_recent_blocks(
|
|
|
1202
1207
|
constants: ConsensusConstants,
|
|
1203
1208
|
recent_chain_bytes: bytes,
|
|
1204
1209
|
summaries_bytes: list[bytes],
|
|
1205
|
-
shutdown_file_path:
|
|
1210
|
+
shutdown_file_path: pathlib.Path | None = None,
|
|
1206
1211
|
) -> tuple[bool, list[bytes]]:
|
|
1207
1212
|
recent_chain: RecentChainData = RecentChainData.from_bytes(recent_chain_bytes)
|
|
1208
1213
|
summaries = summaries_from_bytes(summaries_bytes)
|
|
@@ -1221,7 +1226,7 @@ def validate_recent_blocks(
|
|
|
1221
1226
|
ses_blocks, sub_slots, transaction_blocks = 0, 0, 0
|
|
1222
1227
|
challenge, prev_challenge = recent_chain.recent_chain_data[0].reward_chain_block.pos_ss_cc_challenge_hash, None
|
|
1223
1228
|
tip_height = recent_chain.recent_chain_data[-1].height
|
|
1224
|
-
prev_block_record:
|
|
1229
|
+
prev_block_record: BlockRecord | None = None
|
|
1225
1230
|
deficit = uint8(0)
|
|
1226
1231
|
adjusted = False
|
|
1227
1232
|
validated_block_count = 0
|
|
@@ -1245,7 +1250,9 @@ def validate_recent_blocks(
|
|
|
1245
1250
|
if sub_slot.challenge_chain.new_difficulty is not None:
|
|
1246
1251
|
diff = sub_slot.challenge_chain.new_difficulty
|
|
1247
1252
|
|
|
1248
|
-
|
|
1253
|
+
# we need at least two challenges and more than 2 transaction blocks in the cache to validate pospace
|
|
1254
|
+
# otherwise we might fail to validate due to lack of information
|
|
1255
|
+
if (challenge is not None) and (prev_challenge is not None) and transaction_blocks > 2:
|
|
1249
1256
|
overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
|
|
1250
1257
|
if not adjusted:
|
|
1251
1258
|
assert prev_block_record is not None
|
|
@@ -1267,7 +1274,7 @@ def validate_recent_blocks(
|
|
|
1267
1274
|
required_iters = caluclated_required_iters
|
|
1268
1275
|
else:
|
|
1269
1276
|
ret = _validate_pospace_recent_chain(
|
|
1270
|
-
constants, sub_blocks, block, challenge, diff,
|
|
1277
|
+
constants, sub_blocks, block, challenge, diff, overflow, prev_challenge
|
|
1271
1278
|
)
|
|
1272
1279
|
if ret is None:
|
|
1273
1280
|
return False, []
|
|
@@ -1310,10 +1317,9 @@ def _validate_pospace_recent_chain(
|
|
|
1310
1317
|
block: HeaderBlock,
|
|
1311
1318
|
challenge: bytes32,
|
|
1312
1319
|
diff: uint64,
|
|
1313
|
-
ssi: uint64,
|
|
1314
1320
|
overflow: bool,
|
|
1315
1321
|
prev_challenge: bytes32,
|
|
1316
|
-
) ->
|
|
1322
|
+
) -> uint64 | None:
|
|
1317
1323
|
if block.reward_chain_block.challenge_chain_sp_vdf is None:
|
|
1318
1324
|
# Edge case of first sp (start of slot), where sp_iters == 0
|
|
1319
1325
|
cc_sp_hash: bytes32 = challenge
|
|
@@ -1328,8 +1334,13 @@ def _validate_pospace_recent_chain(
|
|
|
1328
1334
|
cc_sp_hash,
|
|
1329
1335
|
block.height,
|
|
1330
1336
|
diff,
|
|
1331
|
-
|
|
1332
|
-
|
|
1337
|
+
pre_sp_tx_block_height(
|
|
1338
|
+
constants=constants,
|
|
1339
|
+
blocks=blocks,
|
|
1340
|
+
prev_b_hash=block.prev_header_hash,
|
|
1341
|
+
sp_index=block.reward_chain_block.signage_point_index,
|
|
1342
|
+
finished_sub_slots=len(block.finished_sub_slots),
|
|
1343
|
+
),
|
|
1333
1344
|
)
|
|
1334
1345
|
if required_iters is None:
|
|
1335
1346
|
log.error(f"could not verify proof of space block {block.height} {overflow}")
|
|
@@ -1343,11 +1354,10 @@ def __validate_pospace(
|
|
|
1343
1354
|
segment: SubEpochChallengeSegment,
|
|
1344
1355
|
idx: int,
|
|
1345
1356
|
curr_diff: uint64,
|
|
1346
|
-
|
|
1347
|
-
ses: Optional[SubEpochSummary],
|
|
1357
|
+
ses: SubEpochSummary | None,
|
|
1348
1358
|
first_in_sub_epoch: bool,
|
|
1349
1359
|
height: uint32,
|
|
1350
|
-
) ->
|
|
1360
|
+
) -> uint64 | None:
|
|
1351
1361
|
if first_in_sub_epoch and segment.sub_epoch_n == 0 and idx == 0:
|
|
1352
1362
|
cc_sub_slot_hash = constants.GENESIS_CHALLENGE
|
|
1353
1363
|
else:
|
|
@@ -1370,6 +1380,9 @@ def __validate_pospace(
|
|
|
1370
1380
|
# validate proof of space
|
|
1371
1381
|
assert sub_slot_data.proof_of_space is not None
|
|
1372
1382
|
|
|
1383
|
+
# when sampling blocks as part of weight proof validation, the previous
|
|
1384
|
+
# transaction height is a conservative estimate, since we don't have direct
|
|
1385
|
+
# access to it.
|
|
1373
1386
|
required_iters = validate_pospace_and_get_required_iters(
|
|
1374
1387
|
constants,
|
|
1375
1388
|
sub_slot_data.proof_of_space,
|
|
@@ -1377,8 +1390,8 @@ def __validate_pospace(
|
|
|
1377
1390
|
cc_sp_hash,
|
|
1378
1391
|
height,
|
|
1379
1392
|
curr_diff,
|
|
1380
|
-
|
|
1381
|
-
|
|
1393
|
+
uint32(0), # not used, since height_agnostic=True
|
|
1394
|
+
height_agnostic=True,
|
|
1382
1395
|
)
|
|
1383
1396
|
if required_iters is None:
|
|
1384
1397
|
log.error("could not verify proof of space")
|
|
@@ -1417,7 +1430,7 @@ def __get_rc_sub_slot(
|
|
|
1417
1430
|
|
|
1418
1431
|
new_diff = None if ses is None else ses.new_difficulty
|
|
1419
1432
|
new_ssi = None if ses is None else ses.new_sub_slot_iters
|
|
1420
|
-
ses_hash:
|
|
1433
|
+
ses_hash: bytes32 | None = None if ses is None else ses.get_hash()
|
|
1421
1434
|
overflow = is_overflow_block(constants, first.signage_point_index)
|
|
1422
1435
|
if overflow:
|
|
1423
1436
|
if idx >= 2 and slots[idx - 2].cc_slot_end is not None and slots[idx - 1].cc_slot_end is not None:
|
|
@@ -1434,7 +1447,7 @@ def __get_rc_sub_slot(
|
|
|
1434
1447
|
idx -= 1
|
|
1435
1448
|
sub_slot = slots[idx]
|
|
1436
1449
|
|
|
1437
|
-
icc_sub_slot_hash:
|
|
1450
|
+
icc_sub_slot_hash: bytes32 | None = None
|
|
1438
1451
|
assert sub_slot is not None
|
|
1439
1452
|
assert sub_slot.cc_slot_end_info is not None
|
|
1440
1453
|
|
|
@@ -1471,8 +1484,8 @@ def __get_rc_sub_slot(
|
|
|
1471
1484
|
return rc_sub_slot
|
|
1472
1485
|
|
|
1473
1486
|
|
|
1474
|
-
def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses:
|
|
1475
|
-
sub_slot:
|
|
1487
|
+
def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: SubEpochSummary | None) -> ChallengeChainSubSlot:
|
|
1488
|
+
sub_slot: SubSlotData | None = None
|
|
1476
1489
|
for i in reversed(range(idx)):
|
|
1477
1490
|
sub_slot = sub_slots[i]
|
|
1478
1491
|
if sub_slot.cc_slot_end_info is not None:
|
|
@@ -1482,7 +1495,7 @@ def __get_cc_sub_slot(sub_slots: list[SubSlotData], idx: int, ses: Optional[SubE
|
|
|
1482
1495
|
assert sub_slot.cc_slot_end_info is not None
|
|
1483
1496
|
|
|
1484
1497
|
icc_vdf = sub_slot.icc_slot_end_info
|
|
1485
|
-
icc_vdf_hash:
|
|
1498
|
+
icc_vdf_hash: bytes32 | None = None
|
|
1486
1499
|
if icc_vdf is not None:
|
|
1487
1500
|
icc_vdf_hash = icc_vdf.get_hash()
|
|
1488
1501
|
cc_sub_slot = ChallengeChainSubSlot(
|
|
@@ -1529,7 +1542,7 @@ def summaries_from_bytes(summaries_bytes: list[bytes]) -> list[SubEpochSummary]:
|
|
|
1529
1542
|
|
|
1530
1543
|
def _get_last_ses_hash(
|
|
1531
1544
|
constants: ConsensusConstants, recent_reward_chain: list[HeaderBlock]
|
|
1532
|
-
) -> tuple[
|
|
1545
|
+
) -> tuple[bytes32 | None, uint32]:
|
|
1533
1546
|
for idx, block in enumerate(reversed(recent_reward_chain)):
|
|
1534
1547
|
if (block.reward_chain_block.height % constants.SUB_EPOCH_BLOCKS) == 0:
|
|
1535
1548
|
original_idx = len(recent_reward_chain) - 1 - idx # reverse
|
|
@@ -1560,7 +1573,7 @@ def _get_ses_idx(recent_reward_chain: list[HeaderBlock]) -> list[int]:
|
|
|
1560
1573
|
def get_deficit(
|
|
1561
1574
|
constants: ConsensusConstants,
|
|
1562
1575
|
curr_deficit: uint8,
|
|
1563
|
-
prev_block:
|
|
1576
|
+
prev_block: BlockRecord | None,
|
|
1564
1577
|
overflow: bool,
|
|
1565
1578
|
num_finished_sub_slots: int,
|
|
1566
1579
|
) -> uint8:
|
|
@@ -1634,7 +1647,7 @@ def map_segments_by_sub_epoch(
|
|
|
1634
1647
|
def _validate_vdf_batch(
|
|
1635
1648
|
constants: ConsensusConstants,
|
|
1636
1649
|
vdf_list: list[tuple[bytes, bytes, bytes]],
|
|
1637
|
-
shutdown_file_path:
|
|
1650
|
+
shutdown_file_path: pathlib.Path | None = None,
|
|
1638
1651
|
) -> bool:
|
|
1639
1652
|
for vdf_proof_bytes, class_group_bytes, info in vdf_list:
|
|
1640
1653
|
vdf = VDFProof.from_bytes(vdf_proof_bytes)
|
chia/harvester/harvester.py
CHANGED
|
@@ -8,11 +8,10 @@ import logging
|
|
|
8
8
|
from collections.abc import AsyncIterator
|
|
9
9
|
from concurrent.futures.thread import ThreadPoolExecutor
|
|
10
10
|
from pathlib import Path
|
|
11
|
-
from typing import TYPE_CHECKING, Any, ClassVar,
|
|
11
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Literal, cast
|
|
12
12
|
|
|
13
13
|
from chia_rs import ConsensusConstants
|
|
14
|
-
from chia_rs.sized_ints import uint32
|
|
15
|
-
from typing_extensions import Literal
|
|
14
|
+
from chia_rs.sized_ints import uint8, uint32
|
|
16
15
|
|
|
17
16
|
from chia.plot_sync.sender import Sender
|
|
18
17
|
from chia.plotting.manager import PlotManager
|
|
@@ -56,11 +55,11 @@ class Harvester:
|
|
|
56
55
|
root_path: Path
|
|
57
56
|
_shut_down: bool
|
|
58
57
|
executor: ThreadPoolExecutor
|
|
59
|
-
state_changed_callback:
|
|
58
|
+
state_changed_callback: StateChangedProtocol | None = None
|
|
60
59
|
constants: ConsensusConstants
|
|
61
60
|
_refresh_lock: asyncio.Lock
|
|
62
61
|
event_loop: asyncio.events.AbstractEventLoop
|
|
63
|
-
_server:
|
|
62
|
+
_server: ChiaServer | None
|
|
64
63
|
_mode: HarvestingMode
|
|
65
64
|
|
|
66
65
|
@property
|
|
@@ -91,7 +90,10 @@ class Harvester:
|
|
|
91
90
|
self.log.info(f"Using plots_refresh_parameter: {refresh_parameter}")
|
|
92
91
|
|
|
93
92
|
self.plot_manager = PlotManager(
|
|
94
|
-
root_path,
|
|
93
|
+
root_path,
|
|
94
|
+
refresh_parameter=refresh_parameter,
|
|
95
|
+
refresh_callback=self._plot_refresh_callback,
|
|
96
|
+
constants=constants,
|
|
95
97
|
)
|
|
96
98
|
self._shut_down = False
|
|
97
99
|
self.executor = concurrent.futures.ThreadPoolExecutor(
|
|
@@ -99,7 +101,7 @@ class Harvester:
|
|
|
99
101
|
)
|
|
100
102
|
self._server = None
|
|
101
103
|
self.constants = constants
|
|
102
|
-
self.state_changed_callback:
|
|
104
|
+
self.state_changed_callback: StateChangedProtocol | None = None
|
|
103
105
|
self.parallel_read: bool = config.get("parallel_read", True)
|
|
104
106
|
|
|
105
107
|
context_count = config.get("parallel_decompressor_count", DEFAULT_PARALLEL_DECOMPRESSOR_COUNT)
|
|
@@ -148,7 +150,7 @@ class Harvester:
|
|
|
148
150
|
|
|
149
151
|
await self.plot_sync_sender.await_closed()
|
|
150
152
|
|
|
151
|
-
def get_connections(self, request_node_type:
|
|
153
|
+
def get_connections(self, request_node_type: NodeType | None) -> list[dict[str, Any]]:
|
|
152
154
|
return default_get_connections(server=self.server, request_node_type=request_node_type)
|
|
153
155
|
|
|
154
156
|
async def on_connect(self, connection: WSChiaConnection) -> None:
|
|
@@ -157,7 +159,7 @@ class Harvester:
|
|
|
157
159
|
def _set_state_changed_callback(self, callback: StateChangedProtocol) -> None:
|
|
158
160
|
self.state_changed_callback = callback
|
|
159
161
|
|
|
160
|
-
def state_changed(self, change: str, change_data:
|
|
162
|
+
def state_changed(self, change: str, change_data: dict[str, Any] | None = None) -> None:
|
|
161
163
|
if self.state_changed_callback is not None:
|
|
162
164
|
self.state_changed_callback(change, change_data)
|
|
163
165
|
|
|
@@ -190,13 +192,12 @@ class Harvester:
|
|
|
190
192
|
with self.plot_manager:
|
|
191
193
|
for path, plot_info in self.plot_manager.plots.items():
|
|
192
194
|
prover = plot_info.prover
|
|
193
|
-
|
|
194
|
-
if
|
|
195
|
-
k =
|
|
195
|
+
param = prover.get_param()
|
|
196
|
+
if param.size_v1 is not None:
|
|
197
|
+
k = uint8(param.size_v1)
|
|
196
198
|
else:
|
|
197
|
-
assert
|
|
198
|
-
k =
|
|
199
|
-
# TODO: todo_v2_plots support v2 plots in RPC response
|
|
199
|
+
assert param.strength_v2 is not None
|
|
200
|
+
k = uint8(0x80 | param.strength_v2)
|
|
200
201
|
response_plots.append(
|
|
201
202
|
{
|
|
202
203
|
"filename": str(path),
|
|
@@ -246,16 +247,16 @@ class Harvester:
|
|
|
246
247
|
async def update_harvester_config(
|
|
247
248
|
self,
|
|
248
249
|
*,
|
|
249
|
-
use_gpu_harvesting:
|
|
250
|
-
gpu_index:
|
|
251
|
-
enforce_gpu_index:
|
|
252
|
-
disable_cpu_affinity:
|
|
253
|
-
parallel_decompressor_count:
|
|
254
|
-
decompressor_thread_count:
|
|
255
|
-
recursive_plot_scan:
|
|
256
|
-
refresh_parameter_interval_seconds:
|
|
250
|
+
use_gpu_harvesting: bool | None = None,
|
|
251
|
+
gpu_index: int | None = None,
|
|
252
|
+
enforce_gpu_index: bool | None = None,
|
|
253
|
+
disable_cpu_affinity: bool | None = None,
|
|
254
|
+
parallel_decompressor_count: int | None = None,
|
|
255
|
+
decompressor_thread_count: int | None = None,
|
|
256
|
+
recursive_plot_scan: bool | None = None,
|
|
257
|
+
refresh_parameter_interval_seconds: uint32 | None = None,
|
|
257
258
|
) -> bool:
|
|
258
|
-
refresh_parameter:
|
|
259
|
+
refresh_parameter: PlotsRefreshParameter | None = None
|
|
259
260
|
if refresh_parameter_interval_seconds is not None:
|
|
260
261
|
refresh_parameter = PlotsRefreshParameter(
|
|
261
262
|
interval_seconds=refresh_parameter_interval_seconds,
|