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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import zipfile
|
|
4
|
+
from collections.abc import Callable
|
|
4
5
|
from pathlib import Path
|
|
5
|
-
from typing import Callable, Optional
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
8
|
from click.testing import CliRunner, Result
|
|
@@ -26,7 +26,7 @@ def configure(root_path: Path, *args: str) -> Result:
|
|
|
26
26
|
)
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
def configure_interactive(root_path: Path, user_input:
|
|
29
|
+
def configure_interactive(root_path: Path, user_input: str | None = None) -> Result:
|
|
30
30
|
return CliRunner().invoke(
|
|
31
31
|
cli,
|
|
32
32
|
[
|
|
@@ -53,7 +53,7 @@ def enable(root_path: Path, *args: str) -> Result:
|
|
|
53
53
|
)
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
def enable_interactive(root_path: Path, user_input:
|
|
56
|
+
def enable_interactive(root_path: Path, user_input: str | None = None) -> Result:
|
|
57
57
|
return CliRunner().invoke(
|
|
58
58
|
cli,
|
|
59
59
|
[
|
|
@@ -66,7 +66,7 @@ def enable_interactive(root_path: Path, user_input: Optional[str] = None) -> Res
|
|
|
66
66
|
)
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
def prepare_submission(root_path: Path, user_input:
|
|
69
|
+
def prepare_submission(root_path: Path, user_input: str | None = None) -> Result:
|
|
70
70
|
return CliRunner().invoke(
|
|
71
71
|
cli,
|
|
72
72
|
[
|
|
@@ -4,7 +4,6 @@ import json
|
|
|
4
4
|
import os
|
|
5
5
|
import re
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import Optional
|
|
8
7
|
|
|
9
8
|
import pytest
|
|
10
9
|
from click.testing import CliRunner, Result
|
|
@@ -54,7 +53,7 @@ def setup_keyringwrapper(tmp_path):
|
|
|
54
53
|
KeyringWrapper.set_keys_root_path(DEFAULT_KEYS_ROOT_PATH)
|
|
55
54
|
|
|
56
55
|
|
|
57
|
-
def assert_label(keychain: Keychain, label:
|
|
56
|
+
def assert_label(keychain: Keychain, label: str | None, index: int) -> None:
|
|
58
57
|
all_keys = keychain.get_keys()
|
|
59
58
|
assert len(all_keys) > index
|
|
60
59
|
assert all_keys[index].label == label
|
|
@@ -200,7 +199,7 @@ class TestKeysCommands:
|
|
|
200
199
|
],
|
|
201
200
|
)
|
|
202
201
|
def test_generate_and_add_label_parameter(
|
|
203
|
-
self, cmd_params: list[str], label:
|
|
202
|
+
self, cmd_params: list[str], label: str | None, input_str: str | None, tmp_path, empty_keyring
|
|
204
203
|
):
|
|
205
204
|
keychain = empty_keyring
|
|
206
205
|
keys_root_path = keychain.keyring_wrapper.keys_root_path
|
|
@@ -26,7 +26,7 @@ async def cat_name_resolver(request: CATAssetIDToName) -> CATAssetIDToNameRespon
|
|
|
26
26
|
|
|
27
27
|
@pytest.mark.anyio
|
|
28
28
|
async def test_print_offer_summary_xch(capsys: Any) -> None:
|
|
29
|
-
summary_dict = {"xch": 1_000_000_000_000}
|
|
29
|
+
summary_dict = {"xch": str(1_000_000_000_000)}
|
|
30
30
|
|
|
31
31
|
await print_offer_summary(cat_name_resolver, summary_dict)
|
|
32
32
|
|
|
@@ -38,7 +38,7 @@ async def test_print_offer_summary_xch(capsys: Any) -> None:
|
|
|
38
38
|
@pytest.mark.anyio
|
|
39
39
|
async def test_print_offer_summary_cat(capsys: Any) -> None:
|
|
40
40
|
summary_dict = {
|
|
41
|
-
TEST_DUCKSAUCE_ASSET_ID: 1_000,
|
|
41
|
+
TEST_DUCKSAUCE_ASSET_ID: str(1_000),
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
await print_offer_summary(cat_name_resolver, summary_dict)
|
|
@@ -51,8 +51,8 @@ async def test_print_offer_summary_cat(capsys: Any) -> None:
|
|
|
51
51
|
@pytest.mark.anyio
|
|
52
52
|
async def test_print_offer_summary_multiple_cats(capsys: Any) -> None:
|
|
53
53
|
summary_dict = {
|
|
54
|
-
TEST_DUCKSAUCE_ASSET_ID: 1_000,
|
|
55
|
-
TEST_CRUNCHBERRIES_ASSET_ID: 2_000,
|
|
54
|
+
TEST_DUCKSAUCE_ASSET_ID: str(1_000),
|
|
55
|
+
TEST_CRUNCHBERRIES_ASSET_ID: str(2_000),
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
await print_offer_summary(cat_name_resolver, summary_dict)
|
|
@@ -66,10 +66,10 @@ async def test_print_offer_summary_multiple_cats(capsys: Any) -> None:
|
|
|
66
66
|
@pytest.mark.anyio
|
|
67
67
|
async def test_print_offer_summary_xch_and_cats(capsys: Any) -> None:
|
|
68
68
|
summary_dict = {
|
|
69
|
-
"xch": 2_500_000_000_000,
|
|
70
|
-
TEST_DUCKSAUCE_ASSET_ID: 1_111,
|
|
71
|
-
TEST_CRUNCHBERRIES_ASSET_ID: 2_222,
|
|
72
|
-
TEST_UNICORNTEARS_ASSET_ID: 3_333,
|
|
69
|
+
"xch": str(2_500_000_000_000),
|
|
70
|
+
TEST_DUCKSAUCE_ASSET_ID: str(1_111),
|
|
71
|
+
TEST_CRUNCHBERRIES_ASSET_ID: str(2_222),
|
|
72
|
+
TEST_UNICORNTEARS_ASSET_ID: str(3_333),
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
await print_offer_summary(cat_name_resolver, summary_dict)
|
|
@@ -85,10 +85,10 @@ async def test_print_offer_summary_xch_and_cats(capsys: Any) -> None:
|
|
|
85
85
|
@pytest.mark.anyio
|
|
86
86
|
async def test_print_offer_summary_xch_and_cats_with_zero_values(capsys: Any) -> None:
|
|
87
87
|
summary_dict = {
|
|
88
|
-
"xch": 0,
|
|
89
|
-
TEST_DUCKSAUCE_ASSET_ID: 0,
|
|
90
|
-
TEST_CRUNCHBERRIES_ASSET_ID: 0,
|
|
91
|
-
TEST_UNICORNTEARS_ASSET_ID: 0,
|
|
88
|
+
"xch": str(0),
|
|
89
|
+
TEST_DUCKSAUCE_ASSET_ID: str(0),
|
|
90
|
+
TEST_CRUNCHBERRIES_ASSET_ID: str(0),
|
|
91
|
+
TEST_UNICORNTEARS_ASSET_ID: str(0),
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
await print_offer_summary(cat_name_resolver, summary_dict)
|
|
@@ -104,8 +104,8 @@ async def test_print_offer_summary_xch_and_cats_with_zero_values(capsys: Any) ->
|
|
|
104
104
|
@pytest.mark.anyio
|
|
105
105
|
async def test_print_offer_summary_cat_with_fee_and_change(capsys: Any) -> None:
|
|
106
106
|
summary_dict = {
|
|
107
|
-
TEST_DUCKSAUCE_ASSET_ID: 1_000,
|
|
108
|
-
"unknown": 3_456,
|
|
107
|
+
TEST_DUCKSAUCE_ASSET_ID: str(1_000),
|
|
108
|
+
"unknown": str(3_456),
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
await print_offer_summary(cat_name_resolver, summary_dict, has_fee=True)
|
|
@@ -118,7 +118,7 @@ async def test_print_offer_summary_cat_with_fee_and_change(capsys: Any) -> None:
|
|
|
118
118
|
|
|
119
119
|
@pytest.mark.anyio
|
|
120
120
|
async def test_print_offer_summary_xch_with_one_mojo(capsys: Any) -> None:
|
|
121
|
-
summary_dict = {"xch": 1}
|
|
121
|
+
summary_dict = {"xch": str(1)}
|
|
122
122
|
|
|
123
123
|
await print_offer_summary(cat_name_resolver, summary_dict)
|
|
124
124
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
from chia_rs import PlotSize
|
|
3
|
+
from chia_rs import PlotParam
|
|
5
4
|
from chia_rs.sized_ints import uint8, uint16, uint32, uint64, uint128
|
|
6
5
|
from pytest import raises
|
|
7
6
|
|
|
@@ -10,7 +9,6 @@ from chia.consensus.pos_quality import _expected_plot_size
|
|
|
10
9
|
from chia.consensus.pot_iterations import (
|
|
11
10
|
calculate_ip_iters,
|
|
12
11
|
calculate_iterations_quality,
|
|
13
|
-
calculate_phase_out,
|
|
14
12
|
calculate_sp_interval_iters,
|
|
15
13
|
calculate_sp_iters,
|
|
16
14
|
is_overflow_block,
|
|
@@ -84,32 +82,22 @@ class TestPotIterations:
|
|
|
84
82
|
assert ip_iters == (sp_iters + test_constants.NUM_SP_INTERVALS_EXTRA * sp_interval_iters + required_iters) % ssi
|
|
85
83
|
assert sp_iters > ip_iters
|
|
86
84
|
|
|
87
|
-
|
|
88
|
-
"height",
|
|
89
|
-
[
|
|
90
|
-
uint32(0),
|
|
91
|
-
test_constants.HARD_FORK2_HEIGHT - 1,
|
|
92
|
-
test_constants.HARD_FORK2_HEIGHT,
|
|
93
|
-
test_constants.HARD_FORK2_HEIGHT + test_constants.PLOT_V1_PHASE_OUT,
|
|
94
|
-
test_constants.HARD_FORK2_HEIGHT + test_constants.PLOT_V1_PHASE_OUT + 1,
|
|
95
|
-
],
|
|
96
|
-
)
|
|
97
|
-
def test_win_percentage(self, height: uint32):
|
|
85
|
+
def test_win_percentage(self):
|
|
98
86
|
"""
|
|
99
87
|
Tests that the percentage of blocks won is proportional to the space of each farmer,
|
|
100
88
|
with the assumption that all farmers have access to the same VDF speed.
|
|
101
89
|
"""
|
|
102
90
|
farmer_ks = {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
91
|
+
PlotParam.make_v1(32): 100,
|
|
92
|
+
PlotParam.make_v1(33): 100,
|
|
93
|
+
PlotParam.make_v1(34): 100,
|
|
94
|
+
PlotParam.make_v1(35): 100,
|
|
95
|
+
PlotParam.make_v1(36): 100,
|
|
96
|
+
PlotParam.make_v2(2): 200,
|
|
97
|
+
PlotParam.make_v2(3): 200,
|
|
98
|
+
PlotParam.make_v2(4): 200,
|
|
111
99
|
}
|
|
112
|
-
farmer_space = {k: _expected_plot_size(k) * count for k, count in farmer_ks.items()}
|
|
100
|
+
farmer_space = {k: _expected_plot_size(k, test_constants) * count for k, count in farmer_ks.items()}
|
|
113
101
|
wins = {k: 0 for k in farmer_ks.keys()}
|
|
114
102
|
|
|
115
103
|
constants = test_constants.replace(DIFFICULTY_CONSTANT_FACTOR=uint128(2**25))
|
|
@@ -124,76 +112,34 @@ class TestPotIterations:
|
|
|
124
112
|
sp_hash = std_hash(slot_index.to_bytes(4, "big") + sp_index.to_bytes(4, "big"))
|
|
125
113
|
for k, count in farmer_ks.items():
|
|
126
114
|
for farmer_index in range(count):
|
|
127
|
-
plot_k_val = k.size_v1 if k.
|
|
115
|
+
plot_k_val = k.size_v1 if k.size_v1 is not None else constants.PLOT_SIZE_V2
|
|
128
116
|
assert plot_k_val is not None
|
|
129
117
|
quality = std_hash(
|
|
130
118
|
slot_index.to_bytes(4, "big") + plot_k_val.to_bytes(1, "big") + bytes(farmer_index)
|
|
131
119
|
)
|
|
132
|
-
required_iters = calculate_iterations_quality(
|
|
133
|
-
constants, quality, k, difficulty, sp_hash, sub_slot_iters, height
|
|
134
|
-
)
|
|
120
|
+
required_iters = calculate_iterations_quality(constants, quality, k, difficulty, sp_hash)
|
|
135
121
|
if required_iters < sp_interval_iters:
|
|
136
122
|
wins[k] += 1
|
|
137
123
|
total_wins_in_slot += 1
|
|
138
124
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
percentage_space = {k: float(sp / total_space) for k, sp in farmer_space.items()}
|
|
142
|
-
else:
|
|
143
|
-
# after the phase-out, v1 plots don't count
|
|
144
|
-
# all wins are by v2 plots
|
|
145
|
-
total_space = sum(0 if k.size_v2 is None else sp for k, sp in farmer_space.items())
|
|
146
|
-
percentage_space = {
|
|
147
|
-
k: 0.0 if k.size_v2 is None else float(sp / total_space) for k, sp in farmer_space.items()
|
|
148
|
-
}
|
|
125
|
+
total_space = sum(farmer_space.values())
|
|
126
|
+
percentage_space = {k: float(sp / total_space) for k, sp in farmer_space.items()}
|
|
149
127
|
|
|
150
128
|
win_percentage = {k: wins[k] / sum(wins.values()) for k in farmer_ks.keys()}
|
|
151
129
|
for k in farmer_ks.keys():
|
|
152
130
|
# Win rate is proportional to percentage of space
|
|
153
131
|
assert abs(win_percentage[k] - percentage_space[k]) < 0.01
|
|
154
132
|
|
|
155
|
-
@pytest.mark.parametrize("sp_interval", [uint64(6250000000), uint64(1), uint64(2), uint64(10), uint64(10000000000)])
|
|
156
|
-
def test_calculate_phase_out(self, sp_interval: uint64):
|
|
157
|
-
constants = test_constants
|
|
158
|
-
sub_slot_iters = uint64(sp_interval * constants.NUM_SPS_SUB_SLOT)
|
|
159
|
-
# Before or at HARD_FORK2_HEIGHT, should return 0
|
|
160
|
-
assert calculate_phase_out(constants, sub_slot_iters, uint32(constants.HARD_FORK2_HEIGHT - 1)) == 0
|
|
161
|
-
assert calculate_phase_out(constants, sub_slot_iters, constants.HARD_FORK2_HEIGHT) == 0
|
|
162
|
-
# after HARD_FORK2_HEIGHT, should return value = delta/phase_out_period * sp_interval
|
|
163
|
-
assert (
|
|
164
|
-
calculate_phase_out(constants, sub_slot_iters, uint32(constants.HARD_FORK2_HEIGHT + 1))
|
|
165
|
-
== sp_interval // constants.PLOT_V1_PHASE_OUT
|
|
166
|
-
)
|
|
167
|
-
assert (
|
|
168
|
-
calculate_phase_out(
|
|
169
|
-
constants, sub_slot_iters, uint32(constants.HARD_FORK2_HEIGHT + constants.PLOT_V1_PHASE_OUT // 2)
|
|
170
|
-
)
|
|
171
|
-
== sp_interval // 2
|
|
172
|
-
)
|
|
173
|
-
assert (
|
|
174
|
-
calculate_phase_out(
|
|
175
|
-
constants, sub_slot_iters, uint32(constants.HARD_FORK2_HEIGHT + constants.PLOT_V1_PHASE_OUT)
|
|
176
|
-
)
|
|
177
|
-
== sp_interval
|
|
178
|
-
)
|
|
179
|
-
|
|
180
|
-
# Test with maximum uint32 height to ensure no overflow
|
|
181
|
-
max_uint32_height = uint32(0xFFFFFFFF)
|
|
182
|
-
result_max_height = calculate_phase_out(constants, sub_slot_iters, max_uint32_height)
|
|
183
|
-
assert result_max_height == sp_interval # Should cap at sp_interval
|
|
184
|
-
|
|
185
133
|
|
|
186
134
|
def test_expected_plot_size_v1() -> None:
|
|
187
135
|
last_size = 2_400_000
|
|
188
136
|
for k in range(18, 50):
|
|
189
|
-
plot_size = _expected_plot_size(
|
|
137
|
+
plot_size = _expected_plot_size(PlotParam.make_v1(k), test_constants)
|
|
190
138
|
assert plot_size > last_size * 2
|
|
191
139
|
last_size = plot_size
|
|
192
140
|
|
|
193
141
|
|
|
194
142
|
def test_expected_plot_size_v2() -> None:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
plot_size
|
|
198
|
-
assert plot_size > last_size * 2
|
|
199
|
-
last_size = plot_size
|
|
143
|
+
for strength in [2, 3, 4, 5, 6, 7]:
|
|
144
|
+
plot_size = _expected_plot_size(PlotParam.make_v2(strength), test_constants)
|
|
145
|
+
assert plot_size == 988_513_566
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import logging
|
|
3
4
|
import random
|
|
4
5
|
from dataclasses import dataclass
|
|
5
|
-
from typing import Optional
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
|
-
from chia_rs import G1Element,
|
|
8
|
+
from chia_rs import G1Element, PlotParam
|
|
9
9
|
from chia_rs.sized_bytes import bytes32, bytes48
|
|
10
10
|
from chia_rs.sized_ints import uint8, uint32
|
|
11
11
|
|
|
@@ -13,9 +13,10 @@ from chia._tests.util.misc import Marks, datacases
|
|
|
13
13
|
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
14
14
|
from chia.types.blockchain_format.proof_of_space import (
|
|
15
15
|
calculate_prefix_bits,
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
check_plot_param,
|
|
17
|
+
is_v1_phased_out,
|
|
18
18
|
make_pos,
|
|
19
|
+
num_phase_out_epochs,
|
|
19
20
|
passes_plot_filter,
|
|
20
21
|
verify_and_get_quality_string,
|
|
21
22
|
)
|
|
@@ -25,12 +26,12 @@ from chia.types.blockchain_format.proof_of_space import (
|
|
|
25
26
|
class ProofOfSpaceCase:
|
|
26
27
|
id: str
|
|
27
28
|
pos_challenge: bytes32
|
|
28
|
-
plot_size:
|
|
29
|
+
plot_size: PlotParam
|
|
29
30
|
plot_public_key: G1Element
|
|
30
|
-
pool_public_key:
|
|
31
|
-
pool_contract_puzzle_hash:
|
|
32
|
-
height: uint32 =
|
|
33
|
-
expected_error:
|
|
31
|
+
pool_public_key: G1Element | None = None
|
|
32
|
+
pool_contract_puzzle_hash: bytes32 | None = None
|
|
33
|
+
height: uint32 = DEFAULT_CONSTANTS.HARD_FORK2_HEIGHT
|
|
34
|
+
expected_error: str | None = None
|
|
34
35
|
marks: Marks = ()
|
|
35
36
|
|
|
36
37
|
|
|
@@ -47,14 +48,14 @@ def b32(key: str) -> bytes32:
|
|
|
47
48
|
ProofOfSpaceCase(
|
|
48
49
|
id="Neither pool public key nor pool contract puzzle hash",
|
|
49
50
|
pos_challenge=bytes32(b"1" * 32),
|
|
50
|
-
plot_size=
|
|
51
|
+
plot_size=PlotParam.make_v1(0),
|
|
51
52
|
plot_public_key=G1Element(),
|
|
52
53
|
expected_error="Expected pool public key or pool contract puzzle hash but got neither",
|
|
53
54
|
),
|
|
54
55
|
ProofOfSpaceCase(
|
|
55
56
|
id="Both pool public key and pool contract puzzle hash",
|
|
56
57
|
pos_challenge=bytes32(b"1" * 32),
|
|
57
|
-
plot_size=
|
|
58
|
+
plot_size=PlotParam.make_v1(0),
|
|
58
59
|
plot_public_key=G1Element(),
|
|
59
60
|
pool_public_key=G1Element(),
|
|
60
61
|
pool_contract_puzzle_hash=bytes32(b"1" * 32),
|
|
@@ -63,23 +64,23 @@ def b32(key: str) -> bytes32:
|
|
|
63
64
|
ProofOfSpaceCase(
|
|
64
65
|
id="Lower than minimum plot size",
|
|
65
66
|
pos_challenge=bytes32(b"1" * 32),
|
|
66
|
-
plot_size=
|
|
67
|
+
plot_size=PlotParam.make_v1(31),
|
|
67
68
|
plot_public_key=G1Element(),
|
|
68
69
|
pool_public_key=G1Element(),
|
|
69
|
-
expected_error="Plot size is lower than the minimum",
|
|
70
|
+
expected_error="Plot size (31) is lower than the minimum (32)",
|
|
70
71
|
),
|
|
71
72
|
ProofOfSpaceCase(
|
|
72
73
|
id="Higher than maximum plot size",
|
|
73
74
|
pos_challenge=bytes32(b"1" * 32),
|
|
74
|
-
plot_size=
|
|
75
|
+
plot_size=PlotParam.make_v1(51),
|
|
75
76
|
plot_public_key=G1Element(),
|
|
76
77
|
pool_public_key=G1Element(),
|
|
77
|
-
expected_error="Plot size is higher than the maximum",
|
|
78
|
+
expected_error="Plot size (51) is higher than the maximum (50)",
|
|
78
79
|
),
|
|
79
80
|
ProofOfSpaceCase(
|
|
80
81
|
id="Different challenge",
|
|
81
82
|
pos_challenge=bytes32(b"1" * 32),
|
|
82
|
-
plot_size=
|
|
83
|
+
plot_size=PlotParam.make_v1(42),
|
|
83
84
|
pool_public_key=G1Element(),
|
|
84
85
|
plot_public_key=G1Element(),
|
|
85
86
|
expected_error="Calculated pos challenge doesn't match the provided one",
|
|
@@ -87,7 +88,7 @@ def b32(key: str) -> bytes32:
|
|
|
87
88
|
ProofOfSpaceCase(
|
|
88
89
|
id="Not passing the plot filter with size 9",
|
|
89
90
|
pos_challenge=b32("08b23cc2844dfb92d2eedaa705a1ce665d571ee753bd81cbb67b92caa6d34722"),
|
|
90
|
-
plot_size=
|
|
91
|
+
plot_size=PlotParam.make_v1(42),
|
|
91
92
|
pool_public_key=g1(
|
|
92
93
|
"b6449c2c68df97c19e884427e42ee7350982d4020571ead08732615ff39bd216bfd630b6460784982bec98b49fea79d0"
|
|
93
94
|
),
|
|
@@ -100,7 +101,7 @@ def b32(key: str) -> bytes32:
|
|
|
100
101
|
ProofOfSpaceCase(
|
|
101
102
|
id="Passing the plot filter with size 8",
|
|
102
103
|
pos_challenge=b32("08b23cc2844dfb92d2eedaa705a1ce665d571ee753bd81cbb67b92caa6d34722"),
|
|
103
|
-
plot_size=
|
|
104
|
+
plot_size=PlotParam.make_v1(42),
|
|
104
105
|
pool_public_key=g1(
|
|
105
106
|
"b6449c2c68df97c19e884427e42ee7350982d4020571ead08732615ff39bd216bfd630b6460784982bec98b49fea79d0"
|
|
106
107
|
),
|
|
@@ -110,35 +111,51 @@ def b32(key: str) -> bytes32:
|
|
|
110
111
|
height=uint32(5496000),
|
|
111
112
|
),
|
|
112
113
|
ProofOfSpaceCase(
|
|
113
|
-
id="v2 plot
|
|
114
|
+
id="v2 plot strength 0",
|
|
114
115
|
pos_challenge=bytes32(b"1" * 32),
|
|
115
|
-
plot_size=
|
|
116
|
+
plot_size=PlotParam.make_v2(0),
|
|
117
|
+
pool_contract_puzzle_hash=bytes32(b"1" * 32),
|
|
116
118
|
plot_public_key=G1Element(),
|
|
117
|
-
|
|
118
|
-
expected_error="Plot size is lower than the minimum",
|
|
119
|
+
expected_error="Plot strength (0) is lower than the minimum (2)",
|
|
119
120
|
),
|
|
120
121
|
ProofOfSpaceCase(
|
|
121
|
-
id="v2 plot
|
|
122
|
+
id="v2 plot strength 33",
|
|
122
123
|
pos_challenge=bytes32(b"1" * 32),
|
|
123
|
-
plot_size=
|
|
124
|
+
plot_size=PlotParam.make_v2(33),
|
|
125
|
+
pool_contract_puzzle_hash=bytes32(b"1" * 32),
|
|
124
126
|
plot_public_key=G1Element(),
|
|
125
|
-
|
|
126
|
-
expected_error="Plot size is higher than the maximum",
|
|
127
|
+
expected_error="Plot strength (33) is too high (max is 32)",
|
|
127
128
|
),
|
|
128
129
|
ProofOfSpaceCase(
|
|
129
130
|
id="Not passing the plot filter v2",
|
|
130
|
-
pos_challenge=b32("
|
|
131
|
-
plot_size=
|
|
132
|
-
|
|
133
|
-
"b6449c2c68df97c19e884427e42ee7350982d4020571ead08732615ff39bd216bfd630b6460784982bec98b49fea79d0"
|
|
134
|
-
),
|
|
131
|
+
pos_challenge=b32("4cfaacbd2782db64d07cf490ca938534adb07dfbd2f92b0e479e2e5b196178db"),
|
|
132
|
+
plot_size=PlotParam.make_v2(32),
|
|
133
|
+
pool_contract_puzzle_hash=bytes32(b"1" * 32),
|
|
135
134
|
plot_public_key=g1(
|
|
136
135
|
"879526b4e7b616cfd64984d8ad140d0798b048392a6f11e2faf09054ef467ea44dc0dab5e5edb2afdfa850c5c8b629cc"
|
|
137
136
|
),
|
|
138
137
|
expected_error="Did not pass the plot filter",
|
|
139
138
|
),
|
|
139
|
+
ProofOfSpaceCase(
|
|
140
|
+
id="v2 not activated",
|
|
141
|
+
pos_challenge=bytes32(b"1" * 32),
|
|
142
|
+
plot_size=PlotParam.make_v2(2),
|
|
143
|
+
pool_contract_puzzle_hash=bytes32(b"1" * 32),
|
|
144
|
+
plot_public_key=G1Element(),
|
|
145
|
+
height=uint32(DEFAULT_CONSTANTS.HARD_FORK2_HEIGHT - 1),
|
|
146
|
+
expected_error="v2 proof support has not yet activated",
|
|
147
|
+
),
|
|
148
|
+
ProofOfSpaceCase(
|
|
149
|
+
id="v2 plot with pool pk",
|
|
150
|
+
pos_challenge=bytes32(b"1" * 32),
|
|
151
|
+
plot_size=PlotParam.make_v2(2),
|
|
152
|
+
plot_public_key=G1Element(),
|
|
153
|
+
pool_public_key=G1Element(),
|
|
154
|
+
expected_error="v2 plots require pool_contract_puzzle_hash, pool public key is not supported",
|
|
155
|
+
),
|
|
140
156
|
)
|
|
141
157
|
def test_verify_and_get_quality_string(caplog: pytest.LogCaptureFixture, case: ProofOfSpaceCase) -> None:
|
|
158
|
+
caplog.set_level(logging.INFO)
|
|
142
159
|
pos = make_pos(
|
|
143
160
|
challenge=case.pos_challenge,
|
|
144
161
|
pool_public_key=case.pool_public_key,
|
|
@@ -153,6 +170,7 @@ def test_verify_and_get_quality_string(caplog: pytest.LogCaptureFixture, case: P
|
|
|
153
170
|
original_challenge_hash=b32("0x73490e166d0b88347c37d921660b216c27316aae9a3450933d3ff3b854e5831a"),
|
|
154
171
|
signage_point=b32("0x7b3e23dbd438f9aceefa9827e2c5538898189987f49b06eceb7a43067e77b531"),
|
|
155
172
|
height=case.height,
|
|
173
|
+
prev_transaction_block_height=case.height,
|
|
156
174
|
)
|
|
157
175
|
assert quality_string is None
|
|
158
176
|
assert len(caplog.text) == 0 if case.expected_error is None else case.expected_error in caplog.text
|
|
@@ -160,17 +178,16 @@ def test_verify_and_get_quality_string(caplog: pytest.LogCaptureFixture, case: P
|
|
|
160
178
|
|
|
161
179
|
@datacases(
|
|
162
180
|
ProofOfSpaceCase(
|
|
163
|
-
id="
|
|
164
|
-
plot_size=
|
|
165
|
-
pos_challenge=b32("
|
|
181
|
+
id="not passing the plot filter v2",
|
|
182
|
+
plot_size=PlotParam.make_v2(2),
|
|
183
|
+
pos_challenge=b32("aefba5c94bc9bbfe2c538b7faaaf03384ac5a6170e40b024657df6b0a27c34a7"),
|
|
166
184
|
plot_public_key=g1(
|
|
167
185
|
"afa3aaf09c03885154be49216ee7fb2e4581b9c4a4d7e9cc402e27280bf0cfdbdf1b9ba674e301fd1d1450234b3b1868"
|
|
168
186
|
),
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
),
|
|
172
|
-
expected_error="NotImplementedError",
|
|
187
|
+
pool_contract_puzzle_hash=bytes32(b"1" * 32),
|
|
188
|
+
expected_error="Did not pass the plot filter",
|
|
173
189
|
),
|
|
190
|
+
# TODO: todo_v2_plots add test case that passes the plot filter
|
|
174
191
|
)
|
|
175
192
|
def test_verify_and_get_quality_string_v2(caplog: pytest.LogCaptureFixture, case: ProofOfSpaceCase) -> None:
|
|
176
193
|
pos = make_pos(
|
|
@@ -181,16 +198,17 @@ def test_verify_and_get_quality_string_v2(caplog: pytest.LogCaptureFixture, case
|
|
|
181
198
|
version_and_size=case.plot_size,
|
|
182
199
|
proof=b"1",
|
|
183
200
|
)
|
|
184
|
-
|
|
185
|
-
assert
|
|
186
|
-
assert
|
|
201
|
+
plot_param = pos.param()
|
|
202
|
+
assert plot_param.strength_v2 is not None
|
|
203
|
+
assert plot_param.size_v1 is None
|
|
187
204
|
try:
|
|
188
205
|
quality_string = verify_and_get_quality_string(
|
|
189
206
|
pos=pos,
|
|
190
207
|
constants=DEFAULT_CONSTANTS,
|
|
191
208
|
original_challenge_hash=b32("0x73490e166d0b88347c37d921660b216c27316aae9a3450933d3ff3b854e5831a"),
|
|
192
|
-
signage_point=b32("
|
|
209
|
+
signage_point=b32("0xf7c1bd874da5e709d4713d60c8a70639eb1167b367a9c3787c65c1e582e2e662"),
|
|
193
210
|
height=case.height,
|
|
211
|
+
prev_transaction_block_height=case.height,
|
|
194
212
|
)
|
|
195
213
|
except NotImplementedError as e:
|
|
196
214
|
assert case.expected_error is not None
|
|
@@ -201,54 +219,27 @@ def test_verify_and_get_quality_string_v2(caplog: pytest.LogCaptureFixture, case
|
|
|
201
219
|
|
|
202
220
|
|
|
203
221
|
@pytest.mark.parametrize(
|
|
204
|
-
"
|
|
222
|
+
"plot_param, valid",
|
|
205
223
|
[
|
|
206
|
-
(
|
|
207
|
-
(
|
|
208
|
-
(
|
|
209
|
-
(
|
|
210
|
-
(
|
|
211
|
-
(
|
|
212
|
-
(
|
|
213
|
-
(
|
|
214
|
-
(
|
|
215
|
-
(
|
|
216
|
-
(
|
|
217
|
-
(
|
|
218
|
-
(
|
|
219
|
-
(
|
|
224
|
+
(PlotParam.make_v1(31), False), # too small
|
|
225
|
+
(PlotParam.make_v1(32), True),
|
|
226
|
+
(PlotParam.make_v1(33), True),
|
|
227
|
+
(PlotParam.make_v1(34), True),
|
|
228
|
+
(PlotParam.make_v1(35), True),
|
|
229
|
+
(PlotParam.make_v1(36), True),
|
|
230
|
+
(PlotParam.make_v1(37), True),
|
|
231
|
+
(PlotParam.make_v1(49), True),
|
|
232
|
+
(PlotParam.make_v1(50), True),
|
|
233
|
+
(PlotParam.make_v1(51), False), # too large
|
|
234
|
+
(PlotParam.make_v2(1), False), # too small
|
|
235
|
+
(PlotParam.make_v2(2), True),
|
|
236
|
+
(PlotParam.make_v2(3), True),
|
|
237
|
+
(PlotParam.make_v2(32), True),
|
|
238
|
+
(PlotParam.make_v2(33), False), # strength too high
|
|
220
239
|
],
|
|
221
240
|
)
|
|
222
|
-
def
|
|
223
|
-
assert
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
@pytest.mark.parametrize(
|
|
227
|
-
"size, valid",
|
|
228
|
-
[
|
|
229
|
-
(PlotSize.make_v1(31), False), # too small
|
|
230
|
-
(PlotSize.make_v1(32), True),
|
|
231
|
-
(PlotSize.make_v1(33), True),
|
|
232
|
-
(PlotSize.make_v1(34), True),
|
|
233
|
-
(PlotSize.make_v1(35), True),
|
|
234
|
-
(PlotSize.make_v1(36), True),
|
|
235
|
-
(PlotSize.make_v1(37), True),
|
|
236
|
-
(PlotSize.make_v1(49), True),
|
|
237
|
-
(PlotSize.make_v1(50), True),
|
|
238
|
-
(PlotSize.make_v1(51), False), # too large
|
|
239
|
-
(PlotSize.make_v2(26), False), # too small
|
|
240
|
-
(PlotSize.make_v2(27), False), # too small (and odd)
|
|
241
|
-
(PlotSize.make_v2(28), True),
|
|
242
|
-
(PlotSize.make_v2(29), False), # odd
|
|
243
|
-
(PlotSize.make_v2(30), True),
|
|
244
|
-
(PlotSize.make_v2(31), False), # odd
|
|
245
|
-
(PlotSize.make_v2(32), True),
|
|
246
|
-
(PlotSize.make_v2(33), False), # too large (and odd)
|
|
247
|
-
(PlotSize.make_v2(34), False), # too large
|
|
248
|
-
],
|
|
249
|
-
)
|
|
250
|
-
def test_check_plot_size(size: PlotSize, valid: bool) -> None:
|
|
251
|
-
assert check_plot_size(DEFAULT_CONSTANTS, size) == valid
|
|
241
|
+
def test_check_plot_param(plot_param: PlotParam, valid: bool) -> None:
|
|
242
|
+
assert check_plot_param(DEFAULT_CONSTANTS, plot_param) == valid
|
|
252
243
|
|
|
253
244
|
|
|
254
245
|
class TestProofOfSpace:
|
|
@@ -272,12 +263,9 @@ class TestProofOfSpace:
|
|
|
272
263
|
|
|
273
264
|
|
|
274
265
|
@pytest.mark.parametrize("height,expected", [(0, 3), (5496000, 2), (10542000, 1), (15592000, 0), (20643000, 0)])
|
|
275
|
-
|
|
276
|
-
def test_calculate_prefix_bits_clamp_zero(height: uint32, expected: int, plot_size: PlotSize) -> None:
|
|
266
|
+
def test_calculate_prefix_bits_clamp_zero_v1(height: uint32, expected: int) -> None:
|
|
277
267
|
constants = DEFAULT_CONSTANTS.replace(NUMBER_ZERO_BITS_PLOT_FILTER_V1=uint8(3))
|
|
278
|
-
|
|
279
|
-
expected = constants.NUMBER_ZERO_BITS_PLOT_FILTER_V2
|
|
280
|
-
assert calculate_prefix_bits(constants, height, plot_size) == expected
|
|
268
|
+
assert calculate_prefix_bits(constants, height, PlotParam.make_v1(32)) == expected
|
|
281
269
|
|
|
282
270
|
|
|
283
271
|
@pytest.mark.parametrize(
|
|
@@ -294,9 +282,47 @@ def test_calculate_prefix_bits_clamp_zero(height: uint32, expected: int, plot_si
|
|
|
294
282
|
(20643000, 5),
|
|
295
283
|
],
|
|
296
284
|
)
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
285
|
+
def test_calculate_prefix_bits_v1(height: uint32, expected: int) -> None:
|
|
286
|
+
assert calculate_prefix_bits(DEFAULT_CONSTANTS, height, PlotParam.make_v1(32)) == expected
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
@pytest.mark.parametrize(
|
|
290
|
+
argnames=["height", "expected"],
|
|
291
|
+
argvalues=[
|
|
292
|
+
(0, 5),
|
|
293
|
+
(0xFFFFFFFA, 5),
|
|
294
|
+
(0xFFFFFFFB, 4),
|
|
295
|
+
(0xFFFFFFFC, 3),
|
|
296
|
+
(0xFFFFFFFD, 2),
|
|
297
|
+
(0xFFFFFFFF, 2),
|
|
298
|
+
],
|
|
299
|
+
)
|
|
300
|
+
def test_calculate_prefix_bits_v2(height: uint32, expected: int) -> None:
|
|
301
|
+
assert calculate_prefix_bits(DEFAULT_CONSTANTS, height, PlotParam.make_v2(28)) == expected
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def test_v1_phase_out() -> None:
|
|
305
|
+
constants = DEFAULT_CONSTANTS.replace(HARD_FORK2_HEIGHT=uint32(500000))
|
|
306
|
+
rng = random.Random()
|
|
307
|
+
|
|
308
|
+
phase_out_epochs = num_phase_out_epochs(constants)
|
|
309
|
+
print(f"phase-out epochs: {phase_out_epochs}")
|
|
310
|
+
|
|
311
|
+
for epoch in range(-5, phase_out_epochs + 5):
|
|
312
|
+
prev_tx_height = uint32(constants.HARD_FORK2_HEIGHT + epoch * constants.EPOCH_BLOCKS)
|
|
313
|
+
num_phased_out = 0
|
|
314
|
+
rng.seed(1337)
|
|
315
|
+
for i in range(1000):
|
|
316
|
+
proof = rng.randbytes(32)
|
|
317
|
+
if is_v1_phased_out(proof, prev_tx_height, constants):
|
|
318
|
+
num_phased_out += 1
|
|
319
|
+
|
|
320
|
+
expect = min(1.0, max(0.0, epoch / phase_out_epochs))
|
|
321
|
+
|
|
322
|
+
print(
|
|
323
|
+
f"height: {prev_tx_height} "
|
|
324
|
+
f"epoch: {epoch} "
|
|
325
|
+
f"phased-out: {num_phased_out / 10:0.2f}% "
|
|
326
|
+
f"expect: {expect * 100.0:0.2f}%"
|
|
327
|
+
)
|
|
328
|
+
assert abs((num_phased_out / 1000) - expect) < 0.05
|