chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__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_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 +59 -30
- 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 +225 -62
- 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 +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- 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 +963 -839
- 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 +8 -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 +43 -47
- 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 +4 -6
- 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 +14 -14
- 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 +372 -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 +16 -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 +42 -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 +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- 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 +34 -13
- 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 +3 -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 +22 -8
- 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 +120 -105
- 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.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- 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.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/consensus/blockchain.py
CHANGED
|
@@ -7,10 +7,11 @@ import logging
|
|
|
7
7
|
import traceback
|
|
8
8
|
from concurrent.futures import Executor, ThreadPoolExecutor
|
|
9
9
|
from enum import Enum
|
|
10
|
-
from typing import TYPE_CHECKING, ClassVar,
|
|
10
|
+
from typing import TYPE_CHECKING, ClassVar, cast
|
|
11
11
|
|
|
12
12
|
from chia_rs import (
|
|
13
13
|
BlockRecord,
|
|
14
|
+
CoinRecord,
|
|
14
15
|
ConsensusConstants,
|
|
15
16
|
EndOfSubSlotBundle,
|
|
16
17
|
FullBlock,
|
|
@@ -33,12 +34,12 @@ from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_dif
|
|
|
33
34
|
from chia.consensus.find_fork_point import lookup_fork_chain
|
|
34
35
|
from chia.consensus.full_block_to_block_record import block_to_block_record
|
|
35
36
|
from chia.consensus.generator_tools import get_block_header
|
|
37
|
+
from chia.consensus.get_block_challenge import pre_sp_tx_block_height
|
|
36
38
|
from chia.consensus.get_block_generator import get_block_generator
|
|
37
39
|
from chia.consensus.multiprocess_validation import PreValidationResult
|
|
38
40
|
from chia.full_node.block_store import BlockStore
|
|
39
41
|
from chia.types.blockchain_format.coin import Coin
|
|
40
42
|
from chia.types.blockchain_format.vdf import VDFInfo
|
|
41
|
-
from chia.types.coin_record import CoinRecord
|
|
42
43
|
from chia.types.generator_types import BlockGenerator
|
|
43
44
|
from chia.types.unfinished_header_block import UnfinishedHeaderBlock
|
|
44
45
|
from chia.types.validation_state import ValidationState
|
|
@@ -73,7 +74,7 @@ class StateChangeSummary:
|
|
|
73
74
|
# list of coin-id, puzzle-hash pairs
|
|
74
75
|
removals: list[tuple[bytes32, bytes32]]
|
|
75
76
|
# new coin and hint
|
|
76
|
-
additions: list[tuple[Coin,
|
|
77
|
+
additions: list[tuple[Coin, bytes | None]]
|
|
77
78
|
new_rewards: list[Coin]
|
|
78
79
|
|
|
79
80
|
|
|
@@ -93,7 +94,7 @@ class Blockchain:
|
|
|
93
94
|
constants: ConsensusConstants
|
|
94
95
|
|
|
95
96
|
# peak of the blockchain
|
|
96
|
-
_peak_height:
|
|
97
|
+
_peak_height: uint32 | None
|
|
97
98
|
# All blocks in peak path are guaranteed to be included, can include orphan blocks
|
|
98
99
|
__block_records: dict[bytes32, BlockRecord]
|
|
99
100
|
# all hashes of blocks in block_record by height, used for garbage collection
|
|
@@ -185,7 +186,7 @@ class Blockchain:
|
|
|
185
186
|
assert self.__height_map.contains_height(self._peak_height)
|
|
186
187
|
assert not self.__height_map.contains_height(uint32(self._peak_height + 1))
|
|
187
188
|
|
|
188
|
-
def get_peak(self) ->
|
|
189
|
+
def get_peak(self) -> BlockRecord | None:
|
|
189
190
|
"""
|
|
190
191
|
Return the peak of the blockchain
|
|
191
192
|
"""
|
|
@@ -193,7 +194,7 @@ class Blockchain:
|
|
|
193
194
|
return None
|
|
194
195
|
return self.height_to_block_record(self._peak_height)
|
|
195
196
|
|
|
196
|
-
def get_tx_peak(self) ->
|
|
197
|
+
def get_tx_peak(self) -> BlockRecord | None:
|
|
197
198
|
"""
|
|
198
199
|
Return the most recent transaction block. i.e. closest to the peak of the blockchain
|
|
199
200
|
Requires the blockchain to be initialized and there to be a peak set
|
|
@@ -213,17 +214,17 @@ class Blockchain:
|
|
|
213
214
|
|
|
214
215
|
return tx_peak
|
|
215
216
|
|
|
216
|
-
async def get_full_peak(self) ->
|
|
217
|
+
async def get_full_peak(self) -> FullBlock | None:
|
|
217
218
|
if self._peak_height is None:
|
|
218
219
|
return None
|
|
219
220
|
""" Return list of FullBlocks that are peaks"""
|
|
220
|
-
peak_hash:
|
|
221
|
+
peak_hash: bytes32 | None = self.height_to_hash(self._peak_height)
|
|
221
222
|
assert peak_hash is not None # Since we must have the peak block
|
|
222
223
|
block = await self.block_store.get_full_block(peak_hash)
|
|
223
224
|
assert block is not None
|
|
224
225
|
return block
|
|
225
226
|
|
|
226
|
-
async def get_full_block(self, header_hash: bytes32) ->
|
|
227
|
+
async def get_full_block(self, header_hash: bytes32) -> FullBlock | None:
|
|
227
228
|
return await self.block_store.get_full_block(header_hash)
|
|
228
229
|
|
|
229
230
|
async def advance_fork_info(self, block: FullBlock, fork_info: ForkInfo) -> None:
|
|
@@ -258,7 +259,7 @@ class Blockchain:
|
|
|
258
259
|
assert len(chain) == block.height - fork_info.peak_height - 1
|
|
259
260
|
|
|
260
261
|
for height in range(fork_info.peak_height + 1, block.height):
|
|
261
|
-
fork_block:
|
|
262
|
+
fork_block: FullBlock | None = await self.block_store.get_full_block(chain[uint32(height)])
|
|
262
263
|
assert fork_block is not None
|
|
263
264
|
await self.run_single_block(fork_block, fork_info)
|
|
264
265
|
|
|
@@ -266,14 +267,21 @@ class Blockchain:
|
|
|
266
267
|
assert fork_info.peak_height == block.height - 1
|
|
267
268
|
assert block.height == 0 or fork_info.peak_hash == block.prev_header_hash
|
|
268
269
|
|
|
269
|
-
additions: list[tuple[Coin,
|
|
270
|
+
additions: list[tuple[Coin, bytes | None]] = []
|
|
270
271
|
removals: list[tuple[bytes32, Coin]] = []
|
|
271
272
|
if block.transactions_generator is not None:
|
|
272
|
-
block_generator:
|
|
273
|
+
block_generator: BlockGenerator | None = await get_block_generator(self.lookup_block_generators, block)
|
|
273
274
|
assert block_generator is not None
|
|
274
275
|
assert block.transactions_info is not None
|
|
275
276
|
assert block.foliage_transaction_block is not None
|
|
276
|
-
|
|
277
|
+
prev_tx_height = pre_sp_tx_block_height(
|
|
278
|
+
constants=self.constants,
|
|
279
|
+
blocks=self,
|
|
280
|
+
prev_b_hash=block.prev_header_hash,
|
|
281
|
+
sp_index=block.reward_chain_block.signage_point_index,
|
|
282
|
+
first_in_sub_slot=len(block.finished_sub_slots) > 0,
|
|
283
|
+
)
|
|
284
|
+
flags = get_flags_for_height_and_constants(prev_tx_height, self.constants)
|
|
277
285
|
additions, removals = additions_and_removals(
|
|
278
286
|
bytes(block.transactions_generator),
|
|
279
287
|
block_generator.generator_refs,
|
|
@@ -289,9 +297,9 @@ class Blockchain:
|
|
|
289
297
|
pre_validation_result: PreValidationResult,
|
|
290
298
|
sub_slot_iters: uint64,
|
|
291
299
|
fork_info: ForkInfo,
|
|
292
|
-
prev_ses_block:
|
|
293
|
-
block_record:
|
|
294
|
-
) -> tuple[AddBlockResult,
|
|
300
|
+
prev_ses_block: BlockRecord | None = None,
|
|
301
|
+
block_record: BlockRecord | None = None,
|
|
302
|
+
) -> tuple[AddBlockResult, Err | None, StateChangeSummary | None]:
|
|
295
303
|
"""
|
|
296
304
|
This method must be called under the blockchain lock
|
|
297
305
|
Adds a new block into the blockchain, if it's valid and connected to the current
|
|
@@ -325,7 +333,7 @@ class Blockchain:
|
|
|
325
333
|
# first check if this block is disconnected from the currently known
|
|
326
334
|
# blocks. We can only accept blocks that are connected to another block
|
|
327
335
|
# we know of.
|
|
328
|
-
prev_block:
|
|
336
|
+
prev_block: BlockRecord | None = None
|
|
329
337
|
if not extending_main_chain and not genesis:
|
|
330
338
|
prev_block = self.try_block_record(block.prev_header_hash)
|
|
331
339
|
if prev_block is None:
|
|
@@ -480,7 +488,7 @@ class Blockchain:
|
|
|
480
488
|
block_record: BlockRecord,
|
|
481
489
|
genesis: bool,
|
|
482
490
|
fork_info: ForkInfo,
|
|
483
|
-
) -> tuple[list[BlockRecord],
|
|
491
|
+
) -> tuple[list[BlockRecord], StateChangeSummary | None]:
|
|
484
492
|
"""
|
|
485
493
|
When a new block is added, this is called, to check if the new block is the new peak of the chain.
|
|
486
494
|
This also handles reorgs by reverting blocks which are not in the heaviest chain.
|
|
@@ -620,14 +628,14 @@ class Blockchain:
|
|
|
620
628
|
|
|
621
629
|
async def get_sp_and_ip_sub_slots(
|
|
622
630
|
self, header_hash: bytes32
|
|
623
|
-
) ->
|
|
624
|
-
block:
|
|
631
|
+
) -> tuple[EndOfSubSlotBundle | None, EndOfSubSlotBundle | None] | None:
|
|
632
|
+
block: FullBlock | None = await self.block_store.get_full_block(header_hash)
|
|
625
633
|
if block is None:
|
|
626
634
|
return None
|
|
627
635
|
curr_br: BlockRecord = self.block_record(block.header_hash)
|
|
628
636
|
is_overflow = curr_br.overflow
|
|
629
637
|
|
|
630
|
-
curr:
|
|
638
|
+
curr: FullBlock | None = block
|
|
631
639
|
assert curr is not None
|
|
632
640
|
while True:
|
|
633
641
|
if curr_br.first_in_sub_slot:
|
|
@@ -652,7 +660,7 @@ class Blockchain:
|
|
|
652
660
|
# Have both sub-slots
|
|
653
661
|
return curr.finished_sub_slots[-2], ip_sub_slot
|
|
654
662
|
|
|
655
|
-
prev_curr:
|
|
663
|
+
prev_curr: FullBlock | None = await self.block_store.get_full_block(curr.prev_header_hash)
|
|
656
664
|
if prev_curr is None:
|
|
657
665
|
assert curr.height == 0
|
|
658
666
|
prev_curr = curr
|
|
@@ -676,7 +684,7 @@ class Blockchain:
|
|
|
676
684
|
if peak is None:
|
|
677
685
|
return []
|
|
678
686
|
recent_rc: list[tuple[bytes32, uint128]] = []
|
|
679
|
-
curr:
|
|
687
|
+
curr: BlockRecord | None = peak
|
|
680
688
|
while curr is not None and len(recent_rc) < 2 * self.constants.MAX_SUB_SLOT_BLOCKS:
|
|
681
689
|
if curr != peak:
|
|
682
690
|
recent_rc.append((curr.reward_infusion_new_challenge, curr.total_iters))
|
|
@@ -694,16 +702,26 @@ class Blockchain:
|
|
|
694
702
|
|
|
695
703
|
async def validate_unfinished_block_header(
|
|
696
704
|
self, block: UnfinishedBlock, skip_overflow_ss_validation: bool = True
|
|
697
|
-
) -> tuple[
|
|
705
|
+
) -> tuple[uint64 | None, Err | None]:
|
|
698
706
|
if len(block.transactions_generator_ref_list) > self.constants.MAX_GENERATOR_REF_LIST_SIZE:
|
|
699
707
|
return None, Err.TOO_MANY_GENERATOR_REFS
|
|
700
708
|
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
and block.prev_header_hash != self.constants.GENESIS_CHALLENGE
|
|
704
|
-
):
|
|
709
|
+
prev_b = self.try_block_record(block.prev_header_hash)
|
|
710
|
+
if prev_b is None and block.prev_header_hash != self.constants.GENESIS_CHALLENGE:
|
|
705
711
|
return None, Err.INVALID_PREV_BLOCK_HASH
|
|
706
712
|
|
|
713
|
+
prev_tx_height = pre_sp_tx_block_height(
|
|
714
|
+
constants=self.constants,
|
|
715
|
+
blocks=self,
|
|
716
|
+
prev_b_hash=block.prev_header_hash,
|
|
717
|
+
sp_index=block.reward_chain_block.signage_point_index,
|
|
718
|
+
first_in_sub_slot=len(block.finished_sub_slots) > 0,
|
|
719
|
+
)
|
|
720
|
+
|
|
721
|
+
# With hard fork 2 we ban transactions_generator_ref_list.
|
|
722
|
+
if prev_tx_height >= self.constants.HARD_FORK2_HEIGHT and block.transactions_generator_ref_list != []:
|
|
723
|
+
return None, Err.TOO_MANY_GENERATOR_REFS
|
|
724
|
+
|
|
707
725
|
if block.transactions_info is not None:
|
|
708
726
|
if block.transactions_generator is not None:
|
|
709
727
|
if std_hash(bytes(block.transactions_generator)) != block.transactions_info.generator_root:
|
|
@@ -750,7 +768,7 @@ class Blockchain:
|
|
|
750
768
|
return required_iters, None
|
|
751
769
|
|
|
752
770
|
async def validate_unfinished_block(
|
|
753
|
-
self, block: UnfinishedBlock, npc_result:
|
|
771
|
+
self, block: UnfinishedBlock, npc_result: NPCResult | None, skip_overflow_ss_validation: bool = True
|
|
754
772
|
) -> PreValidationResult:
|
|
755
773
|
required_iters, error = await self.validate_unfinished_block_header(block, skip_overflow_ss_validation)
|
|
756
774
|
|
|
@@ -793,7 +811,7 @@ class Blockchain:
|
|
|
793
811
|
|
|
794
812
|
def height_to_block_record(self, height: uint32) -> BlockRecord:
|
|
795
813
|
# Precondition: height is in the blockchain
|
|
796
|
-
header_hash:
|
|
814
|
+
header_hash: bytes32 | None = self.height_to_hash(height)
|
|
797
815
|
if header_hash is None:
|
|
798
816
|
raise ValueError(f"Height is not in blockchain: {height}")
|
|
799
817
|
return self.block_record(header_hash)
|
|
@@ -804,7 +822,7 @@ class Blockchain:
|
|
|
804
822
|
def get_ses(self, height: uint32) -> SubEpochSummary:
|
|
805
823
|
return self.__height_map.get_ses(height)
|
|
806
824
|
|
|
807
|
-
def height_to_hash(self, height: uint32) ->
|
|
825
|
+
def height_to_hash(self, height: uint32) -> bytes32 | None:
|
|
808
826
|
if not self.__height_map.contains_height(height):
|
|
809
827
|
return None
|
|
810
828
|
return self.__height_map.get_hash(height)
|
|
@@ -812,7 +830,7 @@ class Blockchain:
|
|
|
812
830
|
def contains_height(self, height: uint32) -> bool:
|
|
813
831
|
return self.__height_map.contains_height(height)
|
|
814
832
|
|
|
815
|
-
def get_peak_height(self) ->
|
|
833
|
+
def get_peak_height(self) -> uint32 | None:
|
|
816
834
|
return self._peak_height
|
|
817
835
|
|
|
818
836
|
async def warmup(self, fork_point: uint32) -> None:
|
|
@@ -876,7 +894,7 @@ class Blockchain:
|
|
|
876
894
|
) -> dict[bytes32, HeaderBlock]:
|
|
877
895
|
hashes = []
|
|
878
896
|
for height in range(start, stop + 1):
|
|
879
|
-
header_hash:
|
|
897
|
+
header_hash: bytes32 | None = self.height_to_hash(uint32(height))
|
|
880
898
|
if header_hash is not None:
|
|
881
899
|
hashes.append(header_hash)
|
|
882
900
|
|
|
@@ -917,7 +935,7 @@ class Blockchain:
|
|
|
917
935
|
|
|
918
936
|
async def get_header_block_by_height(
|
|
919
937
|
self, height: int, header_hash: bytes32, tx_filter: bool = True
|
|
920
|
-
) ->
|
|
938
|
+
) -> HeaderBlock | None:
|
|
921
939
|
header_dict: dict[bytes32, HeaderBlock] = await self.get_header_blocks_in_range(height, height, tx_filter)
|
|
922
940
|
if len(header_dict) == 0:
|
|
923
941
|
return None
|
|
@@ -931,19 +949,19 @@ class Blockchain:
|
|
|
931
949
|
"""
|
|
932
950
|
hashes: list[bytes32] = []
|
|
933
951
|
for height in heights:
|
|
934
|
-
header_hash:
|
|
952
|
+
header_hash: bytes32 | None = self.height_to_hash(height)
|
|
935
953
|
if header_hash is None:
|
|
936
954
|
raise ValueError(f"Do not have block at height {height}")
|
|
937
955
|
hashes.append(header_hash)
|
|
938
956
|
|
|
939
957
|
return await self.block_store.get_block_records_by_hash(hashes)
|
|
940
958
|
|
|
941
|
-
def try_block_record(self, header_hash: bytes32) ->
|
|
959
|
+
def try_block_record(self, header_hash: bytes32) -> BlockRecord | None:
|
|
942
960
|
if header_hash in self.__block_records:
|
|
943
961
|
return self.block_record(header_hash)
|
|
944
962
|
return None
|
|
945
963
|
|
|
946
|
-
async def get_block_record_from_db(self, header_hash: bytes32) ->
|
|
964
|
+
async def get_block_record_from_db(self, header_hash: bytes32) -> BlockRecord | None:
|
|
947
965
|
ret = self.__block_records.get(header_hash)
|
|
948
966
|
if ret is not None:
|
|
949
967
|
return ret
|
|
@@ -993,8 +1011,8 @@ class Blockchain:
|
|
|
993
1011
|
async def get_sub_epoch_challenge_segments(
|
|
994
1012
|
self,
|
|
995
1013
|
ses_block_hash: bytes32,
|
|
996
|
-
) ->
|
|
997
|
-
segments:
|
|
1014
|
+
) -> list[SubEpochChallengeSegment] | None:
|
|
1015
|
+
segments: list[SubEpochChallengeSegment] | None = await self.block_store.get_sub_epoch_challenge_segments(
|
|
998
1016
|
ses_block_hash
|
|
999
1017
|
)
|
|
1000
1018
|
if segments is None:
|
|
@@ -1040,7 +1058,7 @@ class Blockchain:
|
|
|
1040
1058
|
peak_block = await self.get_block_record_from_db(header_hash)
|
|
1041
1059
|
assert peak_block is not None
|
|
1042
1060
|
if self.height_to_hash(peak_block.height) != header_hash:
|
|
1043
|
-
peak:
|
|
1061
|
+
peak: BlockRecord | None = self.get_peak()
|
|
1044
1062
|
assert peak is not None
|
|
1045
1063
|
reorg_chain: dict[uint32, bytes32]
|
|
1046
1064
|
# Then we look up blocks up to fork point one at a time, backtracking
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Protocol
|
|
4
4
|
|
|
5
5
|
from chia_rs import BlockRecord, HeaderBlock, SubEpochChallengeSegment, SubEpochSummary
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -8,11 +8,11 @@ from chia_rs.sized_ints import uint32
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class BlockRecordsProtocol(Protocol):
|
|
11
|
-
def try_block_record(self, header_hash: bytes32) ->
|
|
11
|
+
def try_block_record(self, header_hash: bytes32) -> BlockRecord | None: ...
|
|
12
12
|
def block_record(self, header_hash: bytes32) -> BlockRecord: ...
|
|
13
13
|
def contains_height(self, height: uint32) -> bool: ...
|
|
14
14
|
def contains_block(self, header_hash: bytes32, height: uint32) -> bool: ...
|
|
15
|
-
def height_to_hash(self, height: uint32) ->
|
|
15
|
+
def height_to_hash(self, height: uint32) -> bytes32 | None: ...
|
|
16
16
|
def height_to_block_record(self, height: uint32) -> BlockRecord: ...
|
|
17
17
|
|
|
18
18
|
# given a list of block header hashes, return the header hashes of their
|
|
@@ -25,13 +25,13 @@ class BlocksProtocol(BlockRecordsProtocol, Protocol):
|
|
|
25
25
|
async def lookup_block_generators(
|
|
26
26
|
self, header_hash: bytes32, generator_refs: set[uint32]
|
|
27
27
|
) -> dict[uint32, bytes]: ...
|
|
28
|
-
async def get_block_record_from_db(self, header_hash: bytes32) ->
|
|
28
|
+
async def get_block_record_from_db(self, header_hash: bytes32) -> BlockRecord | None: ...
|
|
29
29
|
def add_block_record(self, block_record: BlockRecord) -> None: ...
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class BlockchainInterface(BlocksProtocol, Protocol):
|
|
33
|
-
def get_peak(self) ->
|
|
34
|
-
def get_peak_height(self) ->
|
|
33
|
+
def get_peak(self) -> BlockRecord | None: ...
|
|
34
|
+
def get_peak_height(self) -> uint32 | None: ...
|
|
35
35
|
def get_ses_heights(self) -> list[uint32]: ...
|
|
36
36
|
def get_ses(self, height: uint32) -> SubEpochSummary: ...
|
|
37
37
|
async def contains_block_from_db(self, header_hash: bytes32) -> bool: ...
|
|
@@ -50,4 +50,4 @@ class BlockchainInterface(BlocksProtocol, Protocol):
|
|
|
50
50
|
async def get_sub_epoch_challenge_segments(
|
|
51
51
|
self,
|
|
52
52
|
sub_epoch_summary_hash: bytes32,
|
|
53
|
-
) ->
|
|
53
|
+
) -> list[SubEpochChallengeSegment] | None: ...
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from collections.abc import Collection
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Protocol
|
|
5
5
|
|
|
6
|
-
from chia_rs import CoinState
|
|
6
|
+
from chia_rs import CoinRecord, CoinState
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
8
8
|
from chia_rs.sized_ints import uint32, uint64
|
|
9
9
|
|
|
10
10
|
from chia.types.blockchain_format.coin import Coin
|
|
11
|
-
from chia.types.coin_record import CoinRecord
|
|
12
11
|
from chia.types.mempool_item import UnspentLineageInfo
|
|
13
12
|
|
|
14
13
|
|
|
@@ -30,7 +29,7 @@ class CoinStoreProtocol(Protocol):
|
|
|
30
29
|
Add a new block to the coin store
|
|
31
30
|
"""
|
|
32
31
|
|
|
33
|
-
async def get_coin_record(self, coin_id: bytes32) ->
|
|
32
|
+
async def get_coin_record(self, coin_id: bytes32) -> CoinRecord | None:
|
|
34
33
|
"""
|
|
35
34
|
Returns the coin record for the specified coin id
|
|
36
35
|
"""
|
|
@@ -129,12 +128,12 @@ class CoinStoreProtocol(Protocol):
|
|
|
129
128
|
include_hinted: bool = ...,
|
|
130
129
|
min_amount: uint64 = ...,
|
|
131
130
|
max_items: int = ...,
|
|
132
|
-
) -> tuple[list[CoinState],
|
|
131
|
+
) -> tuple[list[CoinState], uint32 | None]:
|
|
133
132
|
"""
|
|
134
133
|
Returns the coin states, as well as the next block height (or `None` if finished).
|
|
135
134
|
"""
|
|
136
135
|
|
|
137
|
-
async def get_unspent_lineage_info_for_puzzle_hash(self, puzzle_hash: bytes32) ->
|
|
136
|
+
async def get_unspent_lineage_info_for_puzzle_hash(self, puzzle_hash: bytes32) -> UnspentLineageInfo | None:
|
|
138
137
|
"""
|
|
139
138
|
Lookup the most recent unspent lineage that matches a puzzle hash
|
|
140
139
|
"""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from collections.abc import Callable
|
|
3
4
|
from functools import lru_cache
|
|
4
|
-
from typing import Callable, Union
|
|
5
5
|
|
|
6
6
|
from chia_rs import G1Element, SpendBundleConditions, SpendConditions
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -74,7 +74,7 @@ def agg_sig_additional_data(agg_sig_data: bytes) -> dict[ConditionOpcode, bytes]
|
|
|
74
74
|
def make_aggsig_final_message(
|
|
75
75
|
opcode: ConditionOpcode,
|
|
76
76
|
msg: bytes,
|
|
77
|
-
spend_conditions:
|
|
77
|
+
spend_conditions: Coin | SpendConditions,
|
|
78
78
|
agg_sig_additional_data: dict[ConditionOpcode, bytes],
|
|
79
79
|
) -> bytes:
|
|
80
80
|
if isinstance(spend_conditions, Coin):
|
|
@@ -181,7 +181,7 @@ def created_outputs_for_conditions_dict(
|
|
|
181
181
|
|
|
182
182
|
|
|
183
183
|
def conditions_dict_for_solution(
|
|
184
|
-
puzzle_reveal:
|
|
184
|
+
puzzle_reveal: Program | SerializedProgram, solution: Program | SerializedProgram, max_cost: int
|
|
185
185
|
) -> dict[ConditionOpcode, list[ConditionWithArgs]]:
|
|
186
186
|
conditions_dict: dict[ConditionOpcode, list[ConditionWithArgs]] = {}
|
|
187
187
|
for cvp in conditions_for_solution(puzzle_reveal, solution, max_cost):
|
|
@@ -190,7 +190,7 @@ def conditions_dict_for_solution(
|
|
|
190
190
|
|
|
191
191
|
|
|
192
192
|
def conditions_for_solution(
|
|
193
|
-
puzzle_reveal:
|
|
193
|
+
puzzle_reveal: Program | SerializedProgram, solution: Program | SerializedProgram, max_cost: int
|
|
194
194
|
) -> list[ConditionWithArgs]:
|
|
195
195
|
# get the standard script for a puzzle hash and feed in the solution
|
|
196
196
|
try:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from chia_rs import SpendBundleConditions
|
|
7
6
|
from chia_rs.sized_ints import uint16
|
|
@@ -12,5 +11,5 @@ from chia.util.streamable import Streamable, streamable
|
|
|
12
11
|
@streamable
|
|
13
12
|
@dataclass(frozen=True)
|
|
14
13
|
class NPCResult(Streamable):
|
|
15
|
-
error:
|
|
16
|
-
conds:
|
|
14
|
+
error: uint16 | None
|
|
15
|
+
conds: SpendBundleConditions | None
|
|
@@ -34,8 +34,7 @@ DEFAULT_CONSTANTS = ConsensusConstants(
|
|
|
34
34
|
), # H(plot signature of the challenge) must start with these many zeroes. for v2 plots
|
|
35
35
|
MIN_PLOT_SIZE_V1=uint8(32), # 32 for mainnet
|
|
36
36
|
MAX_PLOT_SIZE_V1=uint8(50),
|
|
37
|
-
|
|
38
|
-
MAX_PLOT_SIZE_V2=uint8(32),
|
|
37
|
+
PLOT_SIZE_V2=uint8(28),
|
|
39
38
|
SUB_SLOT_TIME_TARGET=uint16(600), # The target number of seconds per slot, mainnet 600
|
|
40
39
|
NUM_SP_INTERVALS_EXTRA=uint8(3), # The number of sp intervals to add to the signage point
|
|
41
40
|
MAX_FUTURE_TIME2=uint32(2 * 60), # The next block can have a timestamp of at most these many seconds in the future
|
|
@@ -76,27 +75,28 @@ DEFAULT_CONSTANTS = ConsensusConstants(
|
|
|
76
75
|
# inclusive, so the max allowed range of 32 is a request for 33 blocks
|
|
77
76
|
# (which is allowed)
|
|
78
77
|
MAX_BLOCK_COUNT_PER_REQUESTS=uint32(32),
|
|
79
|
-
MAX_GENERATOR_SIZE=uint32(1000000),
|
|
80
78
|
MAX_GENERATOR_REF_LIST_SIZE=uint32(512), # Number of references allowed in the block generator ref list
|
|
81
79
|
POOL_SUB_SLOT_ITERS=uint64(37600000000), # iters limit * NUM_SPS
|
|
82
80
|
# June 2024
|
|
83
81
|
HARD_FORK_HEIGHT=uint32(5496000),
|
|
82
|
+
# TODO: todo_v2_plots finalize fork height
|
|
84
83
|
HARD_FORK2_HEIGHT=uint32(0xFFFFFFFA),
|
|
85
84
|
# starting at the hard fork 2 height, v1 plots will gradually be phased out,
|
|
86
|
-
# and stop working entirely after this many
|
|
87
|
-
|
|
85
|
+
# and stop working entirely after (1 << this) many epochs
|
|
86
|
+
PLOT_V1_PHASE_OUT_EPOCH_BITS=uint8(8),
|
|
88
87
|
# June 2027
|
|
89
88
|
PLOT_FILTER_128_HEIGHT=uint32(10542000),
|
|
90
89
|
# June 2030
|
|
91
90
|
PLOT_FILTER_64_HEIGHT=uint32(15592000),
|
|
92
91
|
# June 2033
|
|
93
92
|
PLOT_FILTER_32_HEIGHT=uint32(20643000),
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
MIN_PLOT_STRENGTH=uint8(2),
|
|
94
|
+
MAX_PLOT_STRENGTH=uint8(32),
|
|
95
|
+
QUALITY_PROOF_SCAN_FILTER=uint8(5),
|
|
96
|
+
# TODO: todo_v2_plots finalize plot filter schedule
|
|
97
|
+
PLOT_FILTER_V2_FIRST_ADJUSTMENT_HEIGHT=uint32(0xFFFFFFFB),
|
|
98
|
+
PLOT_FILTER_V2_SECOND_ADJUSTMENT_HEIGHT=uint32(0xFFFFFFFC),
|
|
99
|
+
PLOT_FILTER_V2_THIRD_ADJUSTMENT_HEIGHT=uint32(0xFFFFFFFD),
|
|
100
100
|
)
|
|
101
101
|
|
|
102
102
|
|
|
@@ -109,5 +109,8 @@ def update_testnet_overrides(network_id: str, overrides: dict[str, Any]) -> None
|
|
|
109
109
|
overrides["MAX_PLOT_SIZE_V1"] = overrides["MAX_PLOT_SIZE"]
|
|
110
110
|
overrides.pop("MAX_PLOT_SIZE")
|
|
111
111
|
if network_id in {"testnet11", "testneta"}:
|
|
112
|
-
if "
|
|
113
|
-
overrides["
|
|
112
|
+
if "PLOT_SIZE_V2" not in overrides:
|
|
113
|
+
overrides["PLOT_SIZE_V2"] = 28
|
|
114
|
+
if network_id == "testneta":
|
|
115
|
+
if "HARD_FORK_HEIGHT" not in overrides:
|
|
116
|
+
overrides["HARD_FORK_HEIGHT"] = 3693395
|
chia/consensus/deficit.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
3
|
from chia_rs import BlockRecord, ConsensusConstants
|
|
6
4
|
from chia_rs.sized_ints import uint8, uint32
|
|
7
5
|
|
|
@@ -9,7 +7,7 @@ from chia_rs.sized_ints import uint8, uint32
|
|
|
9
7
|
def calculate_deficit(
|
|
10
8
|
constants: ConsensusConstants,
|
|
11
9
|
height: uint32,
|
|
12
|
-
prev_b:
|
|
10
|
+
prev_b: BlockRecord | None,
|
|
13
11
|
overflow: bool,
|
|
14
12
|
num_finished_sub_slots: int,
|
|
15
13
|
) -> uint8:
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
3
|
from chia_rs import BlockRecord, ConsensusConstants
|
|
6
4
|
from chia_rs.sized_bytes import bytes32
|
|
7
5
|
from chia_rs.sized_ints import uint8, uint32, uint64, uint128
|
|
@@ -137,10 +135,10 @@ def can_finish_sub_and_full_epoch(
|
|
|
137
135
|
constants: ConsensusConstants,
|
|
138
136
|
blocks: BlockRecordsProtocol,
|
|
139
137
|
height: uint32,
|
|
140
|
-
prev_header_hash:
|
|
138
|
+
prev_header_hash: bytes32 | None,
|
|
141
139
|
deficit: uint8,
|
|
142
140
|
block_at_height_included_ses: bool,
|
|
143
|
-
prev_ses_block:
|
|
141
|
+
prev_ses_block: BlockRecord | None = None,
|
|
144
142
|
) -> tuple[bool, bool]:
|
|
145
143
|
"""
|
|
146
144
|
Returns a bool tuple
|
|
@@ -355,7 +353,7 @@ def _get_next_difficulty(
|
|
|
355
353
|
def get_next_sub_slot_iters_and_difficulty(
|
|
356
354
|
constants: ConsensusConstants,
|
|
357
355
|
is_first_in_sub_slot: bool,
|
|
358
|
-
prev_b:
|
|
356
|
+
prev_b: BlockRecord | None,
|
|
359
357
|
blocks: BlockRecordsProtocol,
|
|
360
358
|
) -> tuple[uint64, uint64]:
|
|
361
359
|
"""
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Union
|
|
4
|
-
|
|
5
3
|
from chia_rs import BlockRecord, ConsensusConstants, HeaderBlock
|
|
6
4
|
from chia_rs.sized_bytes import bytes32
|
|
7
5
|
from chia_rs.sized_ints import uint32
|
|
@@ -11,8 +9,8 @@ from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
|
11
9
|
|
|
12
10
|
async def find_fork_point_in_chain(
|
|
13
11
|
blocks: BlockRecordsProtocol,
|
|
14
|
-
block_1:
|
|
15
|
-
block_2:
|
|
12
|
+
block_1: BlockRecord | HeaderBlock,
|
|
13
|
+
block_2: BlockRecord | HeaderBlock,
|
|
16
14
|
) -> int:
|
|
17
15
|
"""Tries to find height where new chain (block_2) diverged from block_1 (assuming prev blocks
|
|
18
16
|
are all included in chain)
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Optional, Union
|
|
4
|
-
|
|
5
3
|
from chia_rs import BlockRecord, ChallengeBlockInfo, ConsensusConstants, FullBlock, HeaderBlock, SubEpochSummary
|
|
6
4
|
from chia_rs.sized_bytes import bytes32
|
|
7
5
|
from chia_rs.sized_ints import uint8, uint32, uint64
|
|
@@ -19,9 +17,9 @@ def block_to_block_record(
|
|
|
19
17
|
constants: ConsensusConstants,
|
|
20
18
|
blocks: BlockRecordsProtocol,
|
|
21
19
|
required_iters: uint64,
|
|
22
|
-
block:
|
|
20
|
+
block: FullBlock | HeaderBlock,
|
|
23
21
|
sub_slot_iters: uint64,
|
|
24
|
-
prev_ses_block:
|
|
22
|
+
prev_ses_block: BlockRecord | None = None,
|
|
25
23
|
) -> BlockRecord:
|
|
26
24
|
prev_b = blocks.try_block_record(block.prev_header_hash)
|
|
27
25
|
if block.height > 0:
|
|
@@ -39,8 +37,8 @@ def block_to_block_record(
|
|
|
39
37
|
len(block.finished_sub_slots),
|
|
40
38
|
)
|
|
41
39
|
|
|
42
|
-
found_ses_hash:
|
|
43
|
-
ses:
|
|
40
|
+
found_ses_hash: bytes32 | None = None
|
|
41
|
+
ses: SubEpochSummary | None = None
|
|
44
42
|
if len(block.finished_sub_slots) > 0:
|
|
45
43
|
for sub_slot in block.finished_sub_slots:
|
|
46
44
|
if sub_slot.challenge_chain.subepoch_summary_hash is not None:
|
|
@@ -61,7 +59,7 @@ def block_to_block_record(
|
|
|
61
59
|
raise ValueError(Err.INVALID_SUB_EPOCH_SUMMARY)
|
|
62
60
|
|
|
63
61
|
prev_transaction_block_height = uint32(0)
|
|
64
|
-
curr:
|
|
62
|
+
curr: BlockRecord | None = blocks.try_block_record(block.prev_header_hash)
|
|
65
63
|
while curr is not None and not curr.is_transaction_block:
|
|
66
64
|
curr = blocks.try_block_record(curr.prev_hash)
|
|
67
65
|
|
|
@@ -83,12 +81,12 @@ def block_to_block_record(
|
|
|
83
81
|
def header_block_to_sub_block_record(
|
|
84
82
|
constants: ConsensusConstants,
|
|
85
83
|
required_iters: uint64,
|
|
86
|
-
block:
|
|
84
|
+
block: FullBlock | HeaderBlock,
|
|
87
85
|
sub_slot_iters: uint64,
|
|
88
86
|
overflow: bool,
|
|
89
87
|
deficit: uint8,
|
|
90
88
|
prev_transaction_block_height: uint32,
|
|
91
|
-
ses:
|
|
89
|
+
ses: SubEpochSummary | None,
|
|
92
90
|
) -> BlockRecord:
|
|
93
91
|
reward_claims_incorporated = (
|
|
94
92
|
block.transactions_info.reward_claims_incorporated if block.transactions_info is not None else None
|
|
@@ -102,18 +100,18 @@ def header_block_to_sub_block_record(
|
|
|
102
100
|
)
|
|
103
101
|
|
|
104
102
|
if block.reward_chain_block.infused_challenge_chain_ip_vdf is not None:
|
|
105
|
-
icc_output:
|
|
103
|
+
icc_output: ClassgroupElement | None = block.reward_chain_block.infused_challenge_chain_ip_vdf.output
|
|
106
104
|
else:
|
|
107
105
|
icc_output = None
|
|
108
106
|
|
|
109
107
|
if len(block.finished_sub_slots) > 0:
|
|
110
|
-
finished_challenge_slot_hashes:
|
|
108
|
+
finished_challenge_slot_hashes: list[bytes32] | None = [
|
|
111
109
|
sub_slot.challenge_chain.get_hash() for sub_slot in block.finished_sub_slots
|
|
112
110
|
]
|
|
113
|
-
finished_reward_slot_hashes:
|
|
111
|
+
finished_reward_slot_hashes: list[bytes32] | None = [
|
|
114
112
|
sub_slot.reward_chain.get_hash() for sub_slot in block.finished_sub_slots
|
|
115
113
|
]
|
|
116
|
-
finished_infused_challenge_slot_hashes:
|
|
114
|
+
finished_infused_challenge_slot_hashes: list[bytes32] | None = [
|
|
117
115
|
sub_slot.infused_challenge_chain.get_hash()
|
|
118
116
|
for sub_slot in block.finished_sub_slots
|
|
119
117
|
if sub_slot.infused_challenge_chain is not None
|