chia-blockchain 2.5.1rc1__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 +10 -0
- chia/__main__.py +5 -0
- chia/_tests/README.md +53 -0
- chia/_tests/__init__.py +0 -0
- chia/_tests/blockchain/__init__.py +0 -0
- chia/_tests/blockchain/blockchain_test_utils.py +195 -0
- chia/_tests/blockchain/config.py +4 -0
- chia/_tests/blockchain/test_augmented_chain.py +145 -0
- chia/_tests/blockchain/test_blockchain.py +4202 -0
- chia/_tests/blockchain/test_blockchain_transactions.py +1031 -0
- chia/_tests/blockchain/test_build_chains.py +59 -0
- chia/_tests/blockchain/test_get_block_generator.py +72 -0
- chia/_tests/blockchain/test_lookup_fork_chain.py +194 -0
- chia/_tests/build-init-files.py +92 -0
- chia/_tests/build-job-matrix.py +204 -0
- chia/_tests/check_pytest_monitor_output.py +34 -0
- chia/_tests/check_sql_statements.py +72 -0
- chia/_tests/chia-start-sim +42 -0
- chia/_tests/clvm/__init__.py +0 -0
- chia/_tests/clvm/benchmark_costs.py +23 -0
- chia/_tests/clvm/coin_store.py +149 -0
- chia/_tests/clvm/test_chialisp_deserialization.py +101 -0
- chia/_tests/clvm/test_clvm_step.py +37 -0
- chia/_tests/clvm/test_condition_codes.py +13 -0
- chia/_tests/clvm/test_curry_and_treehash.py +55 -0
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_program.py +150 -0
- chia/_tests/clvm/test_puzzle_compression.py +143 -0
- chia/_tests/clvm/test_puzzle_drivers.py +45 -0
- chia/_tests/clvm/test_puzzles.py +242 -0
- chia/_tests/clvm/test_singletons.py +540 -0
- chia/_tests/clvm/test_spend_sim.py +181 -0
- chia/_tests/cmds/__init__.py +0 -0
- chia/_tests/cmds/cmd_test_utils.py +469 -0
- chia/_tests/cmds/config.py +3 -0
- chia/_tests/cmds/conftest.py +23 -0
- chia/_tests/cmds/test_click_types.py +200 -0
- chia/_tests/cmds/test_cmd_framework.py +620 -0
- chia/_tests/cmds/test_cmds_util.py +97 -0
- chia/_tests/cmds/test_daemon.py +92 -0
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +66 -0
- chia/_tests/cmds/test_show.py +116 -0
- chia/_tests/cmds/test_sim.py +207 -0
- chia/_tests/cmds/test_timelock_args.py +75 -0
- chia/_tests/cmds/test_tx_config_args.py +154 -0
- chia/_tests/cmds/testing_classes.py +59 -0
- chia/_tests/cmds/wallet/__init__.py +0 -0
- chia/_tests/cmds/wallet/test_consts.py +47 -0
- chia/_tests/cmds/wallet/test_dao.py +565 -0
- chia/_tests/cmds/wallet/test_did.py +403 -0
- chia/_tests/cmds/wallet/test_nft.py +471 -0
- chia/_tests/cmds/wallet/test_notifications.py +124 -0
- chia/_tests/cmds/wallet/test_offer.toffer +1 -0
- chia/_tests/cmds/wallet/test_tx_decorators.py +27 -0
- chia/_tests/cmds/wallet/test_vcs.py +400 -0
- chia/_tests/cmds/wallet/test_wallet.py +1125 -0
- chia/_tests/cmds/wallet/test_wallet_check.py +109 -0
- chia/_tests/conftest.py +1419 -0
- chia/_tests/connection_utils.py +125 -0
- chia/_tests/core/__init__.py +0 -0
- chia/_tests/core/cmds/__init__.py +0 -0
- chia/_tests/core/cmds/test_beta.py +382 -0
- chia/_tests/core/cmds/test_keys.py +1734 -0
- chia/_tests/core/cmds/test_wallet.py +126 -0
- chia/_tests/core/config.py +3 -0
- chia/_tests/core/consensus/__init__.py +0 -0
- chia/_tests/core/consensus/test_block_creation.py +54 -0
- chia/_tests/core/consensus/test_pot_iterations.py +117 -0
- chia/_tests/core/custom_types/__init__.py +0 -0
- chia/_tests/core/custom_types/test_coin.py +107 -0
- chia/_tests/core/custom_types/test_proof_of_space.py +144 -0
- chia/_tests/core/custom_types/test_spend_bundle.py +70 -0
- chia/_tests/core/daemon/__init__.py +0 -0
- chia/_tests/core/daemon/config.py +4 -0
- chia/_tests/core/daemon/test_daemon.py +2128 -0
- chia/_tests/core/daemon/test_daemon_register.py +109 -0
- chia/_tests/core/daemon/test_keychain_proxy.py +101 -0
- chia/_tests/core/data_layer/__init__.py +0 -0
- chia/_tests/core/data_layer/config.py +5 -0
- chia/_tests/core/data_layer/conftest.py +106 -0
- chia/_tests/core/data_layer/test_data_cli.py +56 -0
- chia/_tests/core/data_layer/test_data_layer.py +83 -0
- chia/_tests/core/data_layer/test_data_layer_util.py +218 -0
- chia/_tests/core/data_layer/test_data_rpc.py +3847 -0
- chia/_tests/core/data_layer/test_data_store.py +2424 -0
- chia/_tests/core/data_layer/test_data_store_schema.py +381 -0
- chia/_tests/core/data_layer/test_plugin.py +91 -0
- chia/_tests/core/data_layer/util.py +233 -0
- chia/_tests/core/farmer/__init__.py +0 -0
- chia/_tests/core/farmer/config.py +3 -0
- chia/_tests/core/farmer/test_farmer_api.py +103 -0
- chia/_tests/core/full_node/__init__.py +0 -0
- chia/_tests/core/full_node/config.py +4 -0
- chia/_tests/core/full_node/dos/__init__.py +0 -0
- chia/_tests/core/full_node/dos/config.py +3 -0
- chia/_tests/core/full_node/full_sync/__init__.py +0 -0
- chia/_tests/core/full_node/full_sync/config.py +4 -0
- chia/_tests/core/full_node/full_sync/test_full_sync.py +443 -0
- chia/_tests/core/full_node/ram_db.py +27 -0
- chia/_tests/core/full_node/stores/__init__.py +0 -0
- chia/_tests/core/full_node/stores/config.py +4 -0
- chia/_tests/core/full_node/stores/test_block_store.py +590 -0
- chia/_tests/core/full_node/stores/test_coin_store.py +897 -0
- chia/_tests/core/full_node/stores/test_full_node_store.py +1219 -0
- chia/_tests/core/full_node/stores/test_hint_store.py +229 -0
- chia/_tests/core/full_node/stores/test_sync_store.py +135 -0
- chia/_tests/core/full_node/test_address_manager.py +588 -0
- chia/_tests/core/full_node/test_block_height_map.py +556 -0
- chia/_tests/core/full_node/test_conditions.py +556 -0
- chia/_tests/core/full_node/test_full_node.py +2700 -0
- chia/_tests/core/full_node/test_generator_tools.py +82 -0
- chia/_tests/core/full_node/test_hint_management.py +104 -0
- chia/_tests/core/full_node/test_node_load.py +34 -0
- chia/_tests/core/full_node/test_performance.py +179 -0
- chia/_tests/core/full_node/test_subscriptions.py +492 -0
- chia/_tests/core/full_node/test_transactions.py +203 -0
- chia/_tests/core/full_node/test_tx_processing_queue.py +155 -0
- chia/_tests/core/large_block.py +2388 -0
- chia/_tests/core/make_block_generator.py +70 -0
- chia/_tests/core/mempool/__init__.py +0 -0
- chia/_tests/core/mempool/config.py +4 -0
- chia/_tests/core/mempool/test_mempool.py +3255 -0
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +104 -0
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +55 -0
- chia/_tests/core/mempool/test_mempool_item_queries.py +190 -0
- chia/_tests/core/mempool/test_mempool_manager.py +2084 -0
- chia/_tests/core/mempool/test_mempool_performance.py +64 -0
- chia/_tests/core/mempool/test_singleton_fast_forward.py +567 -0
- chia/_tests/core/node_height.py +28 -0
- chia/_tests/core/server/__init__.py +0 -0
- chia/_tests/core/server/config.py +3 -0
- chia/_tests/core/server/flood.py +84 -0
- chia/_tests/core/server/serve.py +135 -0
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +66 -0
- chia/_tests/core/server/test_dos.py +319 -0
- chia/_tests/core/server/test_event_loop.py +109 -0
- chia/_tests/core/server/test_loop.py +294 -0
- chia/_tests/core/server/test_node_discovery.py +73 -0
- chia/_tests/core/server/test_rate_limits.py +482 -0
- chia/_tests/core/server/test_server.py +226 -0
- chia/_tests/core/server/test_upnp.py +8 -0
- chia/_tests/core/services/__init__.py +0 -0
- chia/_tests/core/services/config.py +3 -0
- chia/_tests/core/services/test_services.py +188 -0
- chia/_tests/core/ssl/__init__.py +0 -0
- chia/_tests/core/ssl/config.py +3 -0
- chia/_tests/core/ssl/test_ssl.py +202 -0
- chia/_tests/core/test_coins.py +33 -0
- chia/_tests/core/test_cost_calculation.py +313 -0
- chia/_tests/core/test_crawler.py +175 -0
- chia/_tests/core/test_crawler_rpc.py +53 -0
- chia/_tests/core/test_daemon_rpc.py +24 -0
- chia/_tests/core/test_db_conversion.py +130 -0
- chia/_tests/core/test_db_validation.py +162 -0
- chia/_tests/core/test_farmer_harvester_rpc.py +505 -0
- chia/_tests/core/test_filter.py +35 -0
- chia/_tests/core/test_full_node_rpc.py +768 -0
- chia/_tests/core/test_merkle_set.py +343 -0
- chia/_tests/core/test_program.py +47 -0
- chia/_tests/core/test_rpc_util.py +86 -0
- chia/_tests/core/test_seeder.py +420 -0
- chia/_tests/core/test_setproctitle.py +13 -0
- chia/_tests/core/util/__init__.py +0 -0
- chia/_tests/core/util/config.py +4 -0
- chia/_tests/core/util/test_block_cache.py +44 -0
- chia/_tests/core/util/test_cached_bls.py +57 -0
- chia/_tests/core/util/test_config.py +337 -0
- chia/_tests/core/util/test_file_keyring_synchronization.py +105 -0
- chia/_tests/core/util/test_files.py +391 -0
- chia/_tests/core/util/test_jsonify.py +146 -0
- chia/_tests/core/util/test_keychain.py +522 -0
- chia/_tests/core/util/test_keyring_wrapper.py +491 -0
- chia/_tests/core/util/test_lockfile.py +380 -0
- chia/_tests/core/util/test_log_exceptions.py +187 -0
- chia/_tests/core/util/test_lru_cache.py +56 -0
- chia/_tests/core/util/test_significant_bits.py +40 -0
- chia/_tests/core/util/test_streamable.py +883 -0
- chia/_tests/db/__init__.py +0 -0
- chia/_tests/db/test_db_wrapper.py +566 -0
- chia/_tests/environments/__init__.py +0 -0
- chia/_tests/environments/common.py +35 -0
- chia/_tests/environments/full_node.py +47 -0
- chia/_tests/environments/wallet.py +429 -0
- chia/_tests/ether.py +19 -0
- chia/_tests/farmer_harvester/__init__.py +0 -0
- chia/_tests/farmer_harvester/config.py +3 -0
- chia/_tests/farmer_harvester/test_farmer.py +1264 -0
- chia/_tests/farmer_harvester/test_farmer_harvester.py +292 -0
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +131 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +528 -0
- chia/_tests/farmer_harvester/test_third_party_harvesters_data.json +29 -0
- chia/_tests/fee_estimation/__init__.py +0 -0
- chia/_tests/fee_estimation/config.py +3 -0
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +262 -0
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +287 -0
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +144 -0
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +146 -0
- chia/_tests/generator/__init__.py +0 -0
- chia/_tests/generator/puzzles/__init__.py +0 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp +3 -0
- chia/_tests/generator/puzzles/test_generator_deserialize.clsp.hex +1 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp +19 -0
- chia/_tests/generator/puzzles/test_multiple_generator_input_arguments.clsp.hex +1 -0
- chia/_tests/generator/test_compression.py +201 -0
- chia/_tests/generator/test_generator_types.py +44 -0
- chia/_tests/generator/test_rom.py +180 -0
- chia/_tests/plot_sync/__init__.py +0 -0
- chia/_tests/plot_sync/config.py +3 -0
- chia/_tests/plot_sync/test_delta.py +101 -0
- chia/_tests/plot_sync/test_plot_sync.py +618 -0
- chia/_tests/plot_sync/test_receiver.py +451 -0
- chia/_tests/plot_sync/test_sender.py +116 -0
- chia/_tests/plot_sync/test_sync_simulated.py +451 -0
- chia/_tests/plot_sync/util.py +68 -0
- chia/_tests/plotting/__init__.py +0 -0
- chia/_tests/plotting/config.py +3 -0
- chia/_tests/plotting/test_plot_manager.py +781 -0
- chia/_tests/plotting/util.py +12 -0
- chia/_tests/pools/__init__.py +0 -0
- chia/_tests/pools/config.py +5 -0
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +1001 -0
- chia/_tests/pools/test_pool_config.py +42 -0
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +397 -0
- chia/_tests/pools/test_pool_rpc.py +1123 -0
- chia/_tests/pools/test_pool_wallet.py +205 -0
- chia/_tests/pools/test_wallet_pool_store.py +161 -0
- chia/_tests/process_junit.py +348 -0
- chia/_tests/rpc/__init__.py +0 -0
- chia/_tests/rpc/test_rpc_client.py +138 -0
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/__init__.py +0 -0
- chia/_tests/simulation/config.py +6 -0
- chia/_tests/simulation/test_simulation.py +501 -0
- chia/_tests/simulation/test_simulator.py +232 -0
- chia/_tests/simulation/test_start_simulator.py +107 -0
- chia/_tests/testconfig.py +13 -0
- chia/_tests/timelord/__init__.py +0 -0
- chia/_tests/timelord/config.py +3 -0
- chia/_tests/timelord/test_new_peak.py +437 -0
- chia/_tests/timelord/test_timelord.py +11 -0
- chia/_tests/tools/1315537.json +170 -0
- chia/_tests/tools/1315544.json +160 -0
- chia/_tests/tools/1315630.json +150 -0
- chia/_tests/tools/300000.json +105 -0
- chia/_tests/tools/442734.json +140 -0
- chia/_tests/tools/466212.json +130 -0
- chia/_tests/tools/__init__.py +0 -0
- chia/_tests/tools/config.py +5 -0
- chia/_tests/tools/test-blockchain-db.sqlite +0 -0
- chia/_tests/tools/test_full_sync.py +30 -0
- chia/_tests/tools/test_legacy_keyring.py +82 -0
- chia/_tests/tools/test_run_block.py +128 -0
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/__init__.py +0 -0
- chia/_tests/util/benchmark_cost.py +170 -0
- chia/_tests/util/benchmarks.py +153 -0
- chia/_tests/util/bip39_test_vectors.json +148 -0
- chia/_tests/util/blockchain.py +134 -0
- chia/_tests/util/blockchain_mock.py +132 -0
- chia/_tests/util/build_network_protocol_files.py +302 -0
- chia/_tests/util/clvm_generator.bin +0 -0
- chia/_tests/util/config.py +3 -0
- chia/_tests/util/constants.py +20 -0
- chia/_tests/util/db_connection.py +37 -0
- chia/_tests/util/full_sync.py +253 -0
- chia/_tests/util/gen_ssl_certs.py +114 -0
- chia/_tests/util/generator_tools_testing.py +45 -0
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +36 -0
- chia/_tests/util/misc.py +675 -0
- chia/_tests/util/network_protocol_data.py +1072 -0
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +2701 -0
- chia/_tests/util/rpc.py +26 -0
- chia/_tests/util/run_block.py +163 -0
- chia/_tests/util/setup_nodes.py +481 -0
- chia/_tests/util/spend_sim.py +492 -0
- chia/_tests/util/split_managers.py +102 -0
- chia/_tests/util/temp_file.py +14 -0
- chia/_tests/util/test_action_scope.py +144 -0
- chia/_tests/util/test_async_pool.py +366 -0
- chia/_tests/util/test_build_job_matrix.py +42 -0
- chia/_tests/util/test_build_network_protocol_files.py +7 -0
- chia/_tests/util/test_chia_version.py +50 -0
- chia/_tests/util/test_collection.py +11 -0
- chia/_tests/util/test_condition_tools.py +229 -0
- chia/_tests/util/test_config.py +426 -0
- chia/_tests/util/test_dump_keyring.py +60 -0
- chia/_tests/util/test_errors.py +10 -0
- chia/_tests/util/test_full_block_utils.py +279 -0
- chia/_tests/util/test_installed.py +20 -0
- chia/_tests/util/test_limited_semaphore.py +53 -0
- chia/_tests/util/test_logging_filter.py +42 -0
- chia/_tests/util/test_misc.py +445 -0
- chia/_tests/util/test_network.py +73 -0
- chia/_tests/util/test_network_protocol_files.py +578 -0
- chia/_tests/util/test_network_protocol_json.py +267 -0
- chia/_tests/util/test_network_protocol_test.py +256 -0
- chia/_tests/util/test_paginator.py +71 -0
- chia/_tests/util/test_pprint.py +17 -0
- chia/_tests/util/test_priority_mutex.py +488 -0
- chia/_tests/util/test_recursive_replace.py +116 -0
- chia/_tests/util/test_replace_str_to_bytes.py +137 -0
- chia/_tests/util/test_service_groups.py +15 -0
- chia/_tests/util/test_ssl_check.py +31 -0
- chia/_tests/util/test_testnet_overrides.py +19 -0
- chia/_tests/util/test_tests_misc.py +38 -0
- chia/_tests/util/test_timing.py +37 -0
- chia/_tests/util/test_trusted_peer.py +51 -0
- chia/_tests/util/time_out_assert.py +191 -0
- chia/_tests/wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/__init__.py +0 -0
- chia/_tests/wallet/cat_wallet/config.py +4 -0
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +468 -0
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +69 -0
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +1826 -0
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +291 -0
- chia/_tests/wallet/cat_wallet/test_trades.py +2600 -0
- chia/_tests/wallet/clawback/__init__.py +0 -0
- chia/_tests/wallet/clawback/config.py +3 -0
- chia/_tests/wallet/clawback/test_clawback_decorator.py +78 -0
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +292 -0
- chia/_tests/wallet/clawback/test_clawback_metadata.py +50 -0
- chia/_tests/wallet/config.py +4 -0
- chia/_tests/wallet/conftest.py +278 -0
- chia/_tests/wallet/dao_wallet/__init__.py +0 -0
- chia/_tests/wallet/dao_wallet/config.py +3 -0
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +1330 -0
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +3488 -0
- chia/_tests/wallet/db_wallet/__init__.py +0 -0
- chia/_tests/wallet/db_wallet/config.py +3 -0
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +141 -0
- chia/_tests/wallet/db_wallet/test_dl_offers.py +491 -0
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +823 -0
- chia/_tests/wallet/did_wallet/__init__.py +0 -0
- chia/_tests/wallet/did_wallet/config.py +4 -0
- chia/_tests/wallet/did_wallet/test_did.py +2284 -0
- chia/_tests/wallet/nft_wallet/__init__.py +0 -0
- chia/_tests/wallet/nft_wallet/config.py +4 -0
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1493 -0
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +1024 -0
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +375 -0
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +1209 -0
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +172 -0
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +2584 -0
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +70 -0
- chia/_tests/wallet/rpc/__init__.py +0 -0
- chia/_tests/wallet/rpc/config.py +4 -0
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +285 -0
- chia/_tests/wallet/rpc/test_wallet_rpc.py +3153 -0
- chia/_tests/wallet/simple_sync/__init__.py +0 -0
- chia/_tests/wallet/simple_sync/config.py +3 -0
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +718 -0
- chia/_tests/wallet/sync/__init__.py +0 -0
- chia/_tests/wallet/sync/config.py +4 -0
- chia/_tests/wallet/sync/test_wallet_sync.py +1692 -0
- chia/_tests/wallet/test_address_type.py +189 -0
- chia/_tests/wallet/test_bech32m.py +45 -0
- chia/_tests/wallet/test_clvm_streamable.py +244 -0
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +588 -0
- chia/_tests/wallet/test_conditions.py +400 -0
- chia/_tests/wallet/test_debug_spend_bundle.py +218 -0
- chia/_tests/wallet/test_new_wallet_protocol.py +1174 -0
- chia/_tests/wallet/test_nft_store.py +192 -0
- chia/_tests/wallet/test_notifications.py +196 -0
- chia/_tests/wallet/test_offer_parsing_performance.py +48 -0
- chia/_tests/wallet/test_puzzle_store.py +132 -0
- chia/_tests/wallet/test_sign_coin_spends.py +159 -0
- chia/_tests/wallet/test_signer_protocol.py +947 -0
- chia/_tests/wallet/test_singleton.py +122 -0
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +772 -0
- chia/_tests/wallet/test_singleton_store.py +152 -0
- chia/_tests/wallet/test_taproot.py +19 -0
- chia/_tests/wallet/test_transaction_store.py +945 -0
- chia/_tests/wallet/test_util.py +185 -0
- chia/_tests/wallet/test_wallet.py +2139 -0
- chia/_tests/wallet/test_wallet_action_scope.py +85 -0
- chia/_tests/wallet/test_wallet_blockchain.py +111 -0
- chia/_tests/wallet/test_wallet_coin_store.py +1002 -0
- chia/_tests/wallet/test_wallet_interested_store.py +43 -0
- chia/_tests/wallet/test_wallet_key_val_store.py +40 -0
- chia/_tests/wallet/test_wallet_node.py +780 -0
- chia/_tests/wallet/test_wallet_retry.py +95 -0
- chia/_tests/wallet/test_wallet_state_manager.py +259 -0
- chia/_tests/wallet/test_wallet_test_framework.py +275 -0
- chia/_tests/wallet/test_wallet_trade_store.py +218 -0
- chia/_tests/wallet/test_wallet_user_store.py +34 -0
- chia/_tests/wallet/test_wallet_utils.py +156 -0
- chia/_tests/wallet/vc_wallet/__init__.py +0 -0
- chia/_tests/wallet/vc_wallet/config.py +3 -0
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +70 -0
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +883 -0
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +830 -0
- chia/_tests/wallet/wallet_block_tools.py +327 -0
- chia/_tests/weight_proof/__init__.py +0 -0
- chia/_tests/weight_proof/config.py +3 -0
- chia/_tests/weight_proof/test_weight_proof.py +528 -0
- chia/apis.py +19 -0
- chia/clvm/__init__.py +0 -0
- chia/cmds/__init__.py +0 -0
- chia/cmds/beta.py +184 -0
- chia/cmds/beta_funcs.py +137 -0
- chia/cmds/check_wallet_db.py +420 -0
- chia/cmds/chia.py +151 -0
- chia/cmds/cmd_classes.py +323 -0
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +488 -0
- chia/cmds/coin_funcs.py +275 -0
- chia/cmds/coins.py +182 -0
- chia/cmds/completion.py +49 -0
- chia/cmds/configure.py +332 -0
- chia/cmds/dao.py +1064 -0
- chia/cmds/dao_funcs.py +598 -0
- chia/cmds/data.py +708 -0
- chia/cmds/data_funcs.py +385 -0
- chia/cmds/db.py +87 -0
- chia/cmds/db_backup_func.py +77 -0
- chia/cmds/db_upgrade_func.py +452 -0
- chia/cmds/db_validate_func.py +184 -0
- chia/cmds/dev.py +18 -0
- chia/cmds/farm.py +100 -0
- chia/cmds/farm_funcs.py +200 -0
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +63 -0
- chia/cmds/init_funcs.py +367 -0
- chia/cmds/installers.py +131 -0
- chia/cmds/keys.py +527 -0
- chia/cmds/keys_funcs.py +863 -0
- chia/cmds/netspace.py +50 -0
- chia/cmds/netspace_funcs.py +54 -0
- chia/cmds/options.py +32 -0
- chia/cmds/param_types.py +238 -0
- chia/cmds/passphrase.py +131 -0
- chia/cmds/passphrase_funcs.py +292 -0
- chia/cmds/peer.py +51 -0
- chia/cmds/peer_funcs.py +129 -0
- chia/cmds/plotnft.py +260 -0
- chia/cmds/plotnft_funcs.py +405 -0
- chia/cmds/plots.py +230 -0
- chia/cmds/plotters.py +18 -0
- chia/cmds/rpc.py +208 -0
- chia/cmds/show.py +72 -0
- chia/cmds/show_funcs.py +215 -0
- chia/cmds/signer.py +296 -0
- chia/cmds/sim.py +225 -0
- chia/cmds/sim_funcs.py +509 -0
- chia/cmds/start.py +24 -0
- chia/cmds/start_funcs.py +109 -0
- chia/cmds/stop.py +62 -0
- chia/cmds/units.py +9 -0
- chia/cmds/wallet.py +1901 -0
- chia/cmds/wallet_funcs.py +1874 -0
- chia/consensus/__init__.py +0 -0
- chia/consensus/block_body_validation.py +562 -0
- chia/consensus/block_creation.py +546 -0
- chia/consensus/block_header_validation.py +1059 -0
- chia/consensus/block_record.py +31 -0
- chia/consensus/block_rewards.py +53 -0
- chia/consensus/blockchain.py +1087 -0
- chia/consensus/blockchain_interface.py +56 -0
- chia/consensus/coinbase.py +30 -0
- chia/consensus/condition_costs.py +9 -0
- chia/consensus/constants.py +49 -0
- chia/consensus/cost_calculator.py +15 -0
- chia/consensus/default_constants.py +89 -0
- chia/consensus/deficit.py +55 -0
- chia/consensus/difficulty_adjustment.py +412 -0
- chia/consensus/find_fork_point.py +111 -0
- chia/consensus/full_block_to_block_record.py +167 -0
- chia/consensus/get_block_challenge.py +106 -0
- chia/consensus/get_block_generator.py +27 -0
- chia/consensus/make_sub_epoch_summary.py +210 -0
- chia/consensus/multiprocess_validation.py +268 -0
- chia/consensus/pos_quality.py +19 -0
- chia/consensus/pot_iterations.py +67 -0
- chia/consensus/puzzles/__init__.py +0 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp +69 -0
- chia/consensus/puzzles/chialisp_deserialisation.clsp.hex +1 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp +37 -0
- chia/consensus/puzzles/rom_bootstrap_generator.clsp.hex +1 -0
- chia/consensus/vdf_info_computation.py +156 -0
- chia/daemon/__init__.py +0 -0
- chia/daemon/client.py +252 -0
- chia/daemon/keychain_proxy.py +502 -0
- chia/daemon/keychain_server.py +365 -0
- chia/daemon/server.py +1606 -0
- chia/daemon/windows_signal.py +56 -0
- chia/data_layer/__init__.py +0 -0
- chia/data_layer/data_layer.py +1291 -0
- chia/data_layer/data_layer_api.py +33 -0
- chia/data_layer/data_layer_errors.py +50 -0
- chia/data_layer/data_layer_server.py +170 -0
- chia/data_layer/data_layer_util.py +985 -0
- chia/data_layer/data_layer_wallet.py +1311 -0
- chia/data_layer/data_store.py +2267 -0
- chia/data_layer/dl_wallet_store.py +407 -0
- chia/data_layer/download_data.py +389 -0
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +100 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +1 -0
- chia/data_layer/s3_plugin_config.yml +33 -0
- chia/data_layer/s3_plugin_service.py +468 -0
- chia/data_layer/util/__init__.py +0 -0
- chia/data_layer/util/benchmark.py +107 -0
- chia/data_layer/util/plugin.py +40 -0
- chia/farmer/__init__.py +0 -0
- chia/farmer/farmer.py +923 -0
- chia/farmer/farmer_api.py +820 -0
- chia/full_node/__init__.py +0 -0
- chia/full_node/bitcoin_fee_estimator.py +85 -0
- chia/full_node/block_height_map.py +271 -0
- chia/full_node/block_store.py +576 -0
- chia/full_node/bundle_tools.py +19 -0
- chia/full_node/coin_store.py +647 -0
- chia/full_node/fee_estimate.py +54 -0
- chia/full_node/fee_estimate_store.py +24 -0
- chia/full_node/fee_estimation.py +92 -0
- chia/full_node/fee_estimator.py +90 -0
- chia/full_node/fee_estimator_constants.py +38 -0
- chia/full_node/fee_estimator_interface.py +42 -0
- chia/full_node/fee_history.py +25 -0
- chia/full_node/fee_tracker.py +564 -0
- chia/full_node/full_node.py +3327 -0
- chia/full_node/full_node_api.py +2025 -0
- chia/full_node/full_node_store.py +1033 -0
- chia/full_node/hint_management.py +56 -0
- chia/full_node/hint_store.py +93 -0
- chia/full_node/mempool.py +589 -0
- chia/full_node/mempool_check_conditions.py +146 -0
- chia/full_node/mempool_manager.py +853 -0
- chia/full_node/pending_tx_cache.py +112 -0
- chia/full_node/puzzles/__init__.py +0 -0
- chia/full_node/puzzles/block_program_zero.clsp +14 -0
- chia/full_node/puzzles/block_program_zero.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp +5 -0
- chia/full_node/puzzles/decompress_coin_spend_entry.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp +7 -0
- chia/full_node/puzzles/decompress_coin_spend_entry_with_prefix.clsp.hex +1 -0
- chia/full_node/puzzles/decompress_puzzle.clsp +6 -0
- chia/full_node/puzzles/decompress_puzzle.clsp.hex +1 -0
- chia/full_node/signage_point.py +16 -0
- chia/full_node/subscriptions.py +247 -0
- chia/full_node/sync_store.py +146 -0
- chia/full_node/tx_processing_queue.py +78 -0
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +1720 -0
- chia/harvester/__init__.py +0 -0
- chia/harvester/harvester.py +272 -0
- chia/harvester/harvester_api.py +380 -0
- chia/introducer/__init__.py +0 -0
- chia/introducer/introducer.py +122 -0
- chia/introducer/introducer_api.py +70 -0
- chia/legacy/__init__.py +0 -0
- chia/legacy/keyring.py +155 -0
- chia/plot_sync/__init__.py +0 -0
- chia/plot_sync/delta.py +61 -0
- chia/plot_sync/exceptions.py +56 -0
- chia/plot_sync/receiver.py +386 -0
- chia/plot_sync/sender.py +340 -0
- chia/plot_sync/util.py +43 -0
- chia/plotters/__init__.py +0 -0
- chia/plotters/bladebit.py +388 -0
- chia/plotters/chiapos.py +63 -0
- chia/plotters/madmax.py +224 -0
- chia/plotters/plotters.py +577 -0
- chia/plotters/plotters_util.py +133 -0
- chia/plotting/__init__.py +0 -0
- chia/plotting/cache.py +213 -0
- chia/plotting/check_plots.py +283 -0
- chia/plotting/create_plots.py +278 -0
- chia/plotting/manager.py +436 -0
- chia/plotting/util.py +336 -0
- chia/pools/__init__.py +0 -0
- chia/pools/pool_config.py +110 -0
- chia/pools/pool_puzzles.py +459 -0
- chia/pools/pool_wallet.py +933 -0
- chia/pools/pool_wallet_info.py +118 -0
- chia/pools/puzzles/__init__.py +0 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp +70 -0
- chia/pools/puzzles/pool_member_innerpuz.clsp.hex +1 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp +69 -0
- chia/pools/puzzles/pool_waitingroom_innerpuz.clsp.hex +1 -0
- chia/protocols/__init__.py +0 -0
- chia/protocols/farmer_protocol.py +102 -0
- chia/protocols/full_node_protocol.py +219 -0
- chia/protocols/harvester_protocol.py +216 -0
- chia/protocols/introducer_protocol.py +25 -0
- chia/protocols/pool_protocol.py +177 -0
- chia/protocols/protocol_message_types.py +139 -0
- chia/protocols/protocol_state_machine.py +87 -0
- chia/protocols/protocol_timing.py +8 -0
- chia/protocols/shared_protocol.py +86 -0
- chia/protocols/timelord_protocol.py +93 -0
- chia/protocols/wallet_protocol.py +401 -0
- chia/py.typed +0 -0
- chia/rpc/__init__.py +0 -0
- chia/rpc/crawler_rpc_api.py +80 -0
- chia/rpc/data_layer_rpc_api.py +644 -0
- chia/rpc/data_layer_rpc_client.py +188 -0
- chia/rpc/data_layer_rpc_util.py +58 -0
- chia/rpc/farmer_rpc_api.py +365 -0
- chia/rpc/farmer_rpc_client.py +86 -0
- chia/rpc/full_node_rpc_api.py +959 -0
- chia/rpc/full_node_rpc_client.py +292 -0
- chia/rpc/harvester_rpc_api.py +141 -0
- chia/rpc/harvester_rpc_client.py +54 -0
- chia/rpc/rpc_client.py +164 -0
- chia/rpc/rpc_server.py +521 -0
- chia/rpc/timelord_rpc_api.py +32 -0
- chia/rpc/util.py +93 -0
- chia/rpc/wallet_request_types.py +904 -0
- chia/rpc/wallet_rpc_api.py +4943 -0
- chia/rpc/wallet_rpc_client.py +1814 -0
- chia/seeder/__init__.py +0 -0
- chia/seeder/crawl_store.py +425 -0
- chia/seeder/crawler.py +410 -0
- chia/seeder/crawler_api.py +135 -0
- chia/seeder/dns_server.py +593 -0
- chia/seeder/peer_record.py +146 -0
- chia/seeder/start_crawler.py +92 -0
- chia/server/__init__.py +0 -0
- chia/server/address_manager.py +658 -0
- chia/server/address_manager_store.py +237 -0
- chia/server/api_protocol.py +116 -0
- chia/server/capabilities.py +24 -0
- chia/server/chia_policy.py +346 -0
- chia/server/introducer_peers.py +76 -0
- chia/server/node_discovery.py +714 -0
- chia/server/outbound_message.py +33 -0
- chia/server/rate_limit_numbers.py +214 -0
- chia/server/rate_limits.py +153 -0
- chia/server/server.py +741 -0
- chia/server/signal_handlers.py +120 -0
- chia/server/ssl_context.py +32 -0
- chia/server/start_data_layer.py +151 -0
- chia/server/start_farmer.py +98 -0
- chia/server/start_full_node.py +112 -0
- chia/server/start_harvester.py +93 -0
- chia/server/start_introducer.py +81 -0
- chia/server/start_service.py +316 -0
- chia/server/start_timelord.py +89 -0
- chia/server/start_wallet.py +113 -0
- chia/server/upnp.py +118 -0
- chia/server/ws_connection.py +766 -0
- chia/simulator/__init__.py +0 -0
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +2054 -0
- chia/simulator/full_node_simulator.py +794 -0
- chia/simulator/keyring.py +128 -0
- chia/simulator/setup_services.py +506 -0
- chia/simulator/simulator_constants.py +13 -0
- chia/simulator/simulator_full_node_rpc_api.py +99 -0
- chia/simulator/simulator_full_node_rpc_client.py +60 -0
- chia/simulator/simulator_protocol.py +29 -0
- chia/simulator/simulator_test_tools.py +164 -0
- chia/simulator/socket.py +24 -0
- chia/simulator/ssl_certs.py +114 -0
- chia/simulator/ssl_certs_1.py +697 -0
- chia/simulator/ssl_certs_10.py +697 -0
- chia/simulator/ssl_certs_2.py +697 -0
- chia/simulator/ssl_certs_3.py +697 -0
- chia/simulator/ssl_certs_4.py +697 -0
- chia/simulator/ssl_certs_5.py +697 -0
- chia/simulator/ssl_certs_6.py +697 -0
- chia/simulator/ssl_certs_7.py +697 -0
- chia/simulator/ssl_certs_8.py +697 -0
- chia/simulator/ssl_certs_9.py +697 -0
- chia/simulator/start_simulator.py +143 -0
- chia/simulator/wallet_tools.py +246 -0
- chia/ssl/__init__.py +0 -0
- chia/ssl/chia_ca.crt +19 -0
- chia/ssl/chia_ca.key +28 -0
- chia/ssl/create_ssl.py +249 -0
- chia/ssl/dst_root_ca.pem +20 -0
- chia/timelord/__init__.py +0 -0
- chia/timelord/iters_from_block.py +50 -0
- chia/timelord/timelord.py +1226 -0
- chia/timelord/timelord_api.py +138 -0
- chia/timelord/timelord_launcher.py +190 -0
- chia/timelord/timelord_state.py +244 -0
- chia/timelord/types.py +22 -0
- chia/types/__init__.py +0 -0
- chia/types/aliases.py +35 -0
- chia/types/block_protocol.py +20 -0
- chia/types/blockchain_format/__init__.py +0 -0
- chia/types/blockchain_format/classgroup.py +5 -0
- chia/types/blockchain_format/coin.py +28 -0
- chia/types/blockchain_format/foliage.py +8 -0
- chia/types/blockchain_format/pool_target.py +5 -0
- chia/types/blockchain_format/program.py +269 -0
- chia/types/blockchain_format/proof_of_space.py +135 -0
- chia/types/blockchain_format/reward_chain_block.py +6 -0
- chia/types/blockchain_format/serialized_program.py +5 -0
- chia/types/blockchain_format/sized_bytes.py +11 -0
- chia/types/blockchain_format/slots.py +9 -0
- chia/types/blockchain_format/sub_epoch_summary.py +5 -0
- chia/types/blockchain_format/tree_hash.py +72 -0
- chia/types/blockchain_format/vdf.py +86 -0
- chia/types/clvm_cost.py +13 -0
- chia/types/coin_record.py +43 -0
- chia/types/coin_spend.py +115 -0
- chia/types/condition_opcodes.py +73 -0
- chia/types/condition_with_args.py +16 -0
- chia/types/eligible_coin_spends.py +365 -0
- chia/types/end_of_slot_bundle.py +5 -0
- chia/types/fee_rate.py +38 -0
- chia/types/full_block.py +5 -0
- chia/types/generator_types.py +13 -0
- chia/types/header_block.py +5 -0
- chia/types/internal_mempool_item.py +18 -0
- chia/types/mempool_inclusion_status.py +9 -0
- chia/types/mempool_item.py +85 -0
- chia/types/mempool_submission_status.py +30 -0
- chia/types/mojos.py +7 -0
- chia/types/peer_info.py +64 -0
- chia/types/signing_mode.py +29 -0
- chia/types/spend_bundle.py +30 -0
- chia/types/spend_bundle_conditions.py +7 -0
- chia/types/transaction_queue_entry.py +55 -0
- chia/types/unfinished_block.py +5 -0
- chia/types/unfinished_header_block.py +37 -0
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +49 -0
- chia/util/__init__.py +0 -0
- chia/util/action_scope.py +168 -0
- chia/util/async_pool.py +226 -0
- chia/util/augmented_chain.py +134 -0
- chia/util/batches.py +42 -0
- chia/util/bech32m.py +126 -0
- chia/util/beta_metrics.py +119 -0
- chia/util/block_cache.py +56 -0
- chia/util/byte_types.py +12 -0
- chia/util/check_fork_next_block.py +33 -0
- chia/util/chia_logging.py +144 -0
- chia/util/chia_version.py +33 -0
- chia/util/collection.py +17 -0
- chia/util/condition_tools.py +201 -0
- chia/util/config.py +367 -0
- chia/util/cpu.py +22 -0
- chia/util/db_synchronous.py +23 -0
- chia/util/db_version.py +32 -0
- chia/util/db_wrapper.py +430 -0
- chia/util/default_root.py +27 -0
- chia/util/dump_keyring.py +93 -0
- chia/util/english.txt +2048 -0
- chia/util/errors.py +353 -0
- chia/util/file_keyring.py +469 -0
- chia/util/files.py +97 -0
- chia/util/full_block_utils.py +345 -0
- chia/util/generator_tools.py +72 -0
- chia/util/hash.py +31 -0
- chia/util/initial-config.yaml +694 -0
- chia/util/inline_executor.py +26 -0
- chia/util/ints.py +19 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +37 -0
- chia/util/keychain.py +676 -0
- chia/util/keyring_wrapper.py +327 -0
- chia/util/limited_semaphore.py +41 -0
- chia/util/lock.py +49 -0
- chia/util/log_exceptions.py +32 -0
- chia/util/logging.py +36 -0
- chia/util/lru_cache.py +31 -0
- chia/util/math.py +20 -0
- chia/util/network.py +182 -0
- chia/util/paginator.py +48 -0
- chia/util/path.py +31 -0
- chia/util/permissions.py +20 -0
- chia/util/prev_transaction_block.py +21 -0
- chia/util/priority_mutex.py +95 -0
- chia/util/profiler.py +197 -0
- chia/util/recursive_replace.py +24 -0
- chia/util/safe_cancel_task.py +16 -0
- chia/util/service_groups.py +47 -0
- chia/util/setproctitle.py +22 -0
- chia/util/significant_bits.py +32 -0
- chia/util/ssl_check.py +213 -0
- chia/util/streamable.py +642 -0
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +382 -0
- chia/util/timing.py +67 -0
- chia/util/vdf_prover.py +30 -0
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +66 -0
- chia/wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/__init__.py +0 -0
- chia/wallet/cat_wallet/cat_constants.py +75 -0
- chia/wallet/cat_wallet/cat_info.py +47 -0
- chia/wallet/cat_wallet/cat_outer_puzzle.py +120 -0
- chia/wallet/cat_wallet/cat_utils.py +164 -0
- chia/wallet/cat_wallet/cat_wallet.py +855 -0
- chia/wallet/cat_wallet/dao_cat_info.py +28 -0
- chia/wallet/cat_wallet/dao_cat_wallet.py +669 -0
- chia/wallet/cat_wallet/lineage_store.py +74 -0
- chia/wallet/cat_wallet/puzzles/__init__.py +0 -0
- chia/wallet/cat_wallet/puzzles/cat_truths.clib +31 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp +397 -0
- chia/wallet/cat_wallet/puzzles/cat_v2.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp +25 -0
- chia/wallet/cat_wallet/puzzles/delegated_tail.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp +15 -0
- chia/wallet/cat_wallet/puzzles/everything_with_signature.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp +26 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp +42 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_coin_id_or_singleton.clsp.hex +1 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp +24 -0
- chia/wallet/cat_wallet/puzzles/genesis_by_puzzle_hash.clsp.hex +1 -0
- chia/wallet/coin_selection.py +188 -0
- chia/wallet/conditions.py +1512 -0
- chia/wallet/dao_wallet/__init__.py +0 -0
- chia/wallet/dao_wallet/dao_info.py +61 -0
- chia/wallet/dao_wallet/dao_utils.py +811 -0
- chia/wallet/dao_wallet/dao_wallet.py +2119 -0
- chia/wallet/db_wallet/__init__.py +0 -0
- chia/wallet/db_wallet/db_wallet_puzzles.py +111 -0
- chia/wallet/derivation_record.py +30 -0
- chia/wallet/derive_keys.py +146 -0
- chia/wallet/did_wallet/__init__.py +0 -0
- chia/wallet/did_wallet/did_info.py +39 -0
- chia/wallet/did_wallet/did_wallet.py +1494 -0
- chia/wallet/did_wallet/did_wallet_puzzles.py +221 -0
- chia/wallet/did_wallet/puzzles/__init__.py +0 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp +135 -0
- chia/wallet/did_wallet/puzzles/did_innerpuz.clsp.hex +1 -0
- chia/wallet/driver_protocol.py +26 -0
- chia/wallet/key_val_store.py +55 -0
- chia/wallet/lineage_proof.py +58 -0
- chia/wallet/nft_wallet/__init__.py +0 -0
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +92 -0
- chia/wallet/nft_wallet/nft_info.py +120 -0
- chia/wallet/nft_wallet/nft_puzzles.py +305 -0
- chia/wallet/nft_wallet/nft_wallet.py +1687 -0
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +6 -0
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +30 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +28 -0
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +100 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +78 -0
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +1 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +74 -0
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +1 -0
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +101 -0
- chia/wallet/nft_wallet/transfer_program_puzzle.py +82 -0
- chia/wallet/nft_wallet/uncurry_nft.py +217 -0
- chia/wallet/notification_manager.py +117 -0
- chia/wallet/notification_store.py +178 -0
- chia/wallet/outer_puzzles.py +84 -0
- chia/wallet/payment.py +33 -0
- chia/wallet/puzzle_drivers.py +118 -0
- chia/wallet/puzzles/__init__.py +0 -0
- chia/wallet/puzzles/augmented_condition.clsp +13 -0
- chia/wallet/puzzles/augmented_condition.clsp.hex +1 -0
- chia/wallet/puzzles/clawback/__init__.py +0 -0
- chia/wallet/puzzles/clawback/drivers.py +188 -0
- chia/wallet/puzzles/clawback/metadata.py +38 -0
- chia/wallet/puzzles/clawback/puzzle_decorator.py +67 -0
- chia/wallet/puzzles/condition_codes.clib +77 -0
- chia/wallet/puzzles/curry-and-treehash.clib +102 -0
- chia/wallet/puzzles/curry.clib +135 -0
- chia/wallet/puzzles/curry_by_index.clib +16 -0
- chia/wallet/puzzles/dao_cat_eve.clsp +17 -0
- chia/wallet/puzzles/dao_cat_eve.clsp.hex +1 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp +36 -0
- chia/wallet/puzzles/dao_cat_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp +35 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex +1 -0
- chia/wallet/puzzles/dao_finished_state.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_lockup.clsp +288 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex +1 -0
- chia/wallet/puzzles/dao_lockup.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal.clsp +377 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp +78 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_timer.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp +87 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex +1 -0
- chia/wallet/puzzles/dao_proposal_validator.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp +240 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex +1 -0
- chia/wallet/puzzles/dao_spend_p2_singleton_v2.clsp.hex.sha256tree +1 -0
- chia/wallet/puzzles/dao_treasury.clsp +115 -0
- chia/wallet/puzzles/dao_treasury.clsp.hex +1 -0
- chia/wallet/puzzles/dao_update_proposal.clsp +44 -0
- chia/wallet/puzzles/dao_update_proposal.clsp.hex +1 -0
- chia/wallet/puzzles/deployed_puzzle_hashes.json +67 -0
- chia/wallet/puzzles/json.clib +25 -0
- chia/wallet/puzzles/load_clvm.py +161 -0
- chia/wallet/puzzles/merkle_utils.clib +18 -0
- chia/wallet/puzzles/notification.clsp +7 -0
- chia/wallet/puzzles/notification.clsp.hex +1 -0
- chia/wallet/puzzles/p2_1_of_n.clsp +22 -0
- chia/wallet/puzzles/p2_1_of_n.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.clsp +3 -0
- chia/wallet/puzzles/p2_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_conditions.py +26 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp +18 -0
- chia/wallet/puzzles/p2_delegated_conditions.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_conditions.py +21 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp +19 -0
- chia/wallet/puzzles/p2_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle.py +34 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp +91 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +160 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp +108 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.clsp.hex +1 -0
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +21 -0
- chia/wallet/puzzles/p2_parent.clsp +19 -0
- chia/wallet/puzzles/p2_parent.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp +18 -0
- chia/wallet/puzzles/p2_puzzle_hash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_puzzle_hash.py +27 -0
- chia/wallet/puzzles/p2_singleton.clsp +30 -0
- chia/wallet/puzzles/p2_singleton.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp +81 -0
- chia/wallet/puzzles/p2_singleton_aggregator.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp +50 -0
- chia/wallet/puzzles/p2_singleton_or_delayed_puzhash.clsp.hex +1 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp +47 -0
- chia/wallet/puzzles/p2_singleton_via_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/puzzles/puzzle_utils.py +34 -0
- chia/wallet/puzzles/settlement_payments.clsp +49 -0
- chia/wallet/puzzles/settlement_payments.clsp.hex +1 -0
- chia/wallet/puzzles/sha256tree.clib +11 -0
- chia/wallet/puzzles/singleton_launcher.clsp +16 -0
- chia/wallet/puzzles/singleton_launcher.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.clsp +177 -0
- chia/wallet/puzzles/singleton_top_layer.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer.py +296 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp +107 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.clsp.hex +1 -0
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +345 -0
- chia/wallet/puzzles/singleton_truths.clib +21 -0
- chia/wallet/puzzles/tails.py +348 -0
- chia/wallet/puzzles/utility_macros.clib +48 -0
- chia/wallet/signer_protocol.py +125 -0
- chia/wallet/singleton.py +106 -0
- chia/wallet/singleton_record.py +30 -0
- chia/wallet/trade_manager.py +1102 -0
- chia/wallet/trade_record.py +67 -0
- chia/wallet/trading/__init__.py +0 -0
- chia/wallet/trading/offer.py +702 -0
- chia/wallet/trading/trade_status.py +13 -0
- chia/wallet/trading/trade_store.py +526 -0
- chia/wallet/transaction_record.py +158 -0
- chia/wallet/transaction_sorting.py +14 -0
- chia/wallet/uncurried_puzzle.py +17 -0
- chia/wallet/util/__init__.py +0 -0
- chia/wallet/util/address_type.py +55 -0
- chia/wallet/util/blind_signer_tl.py +164 -0
- chia/wallet/util/clvm_streamable.py +203 -0
- chia/wallet/util/compute_hints.py +66 -0
- chia/wallet/util/compute_memos.py +43 -0
- chia/wallet/util/curry_and_treehash.py +91 -0
- chia/wallet/util/debug_spend_bundle.py +232 -0
- chia/wallet/util/merkle_tree.py +100 -0
- chia/wallet/util/merkle_utils.py +102 -0
- chia/wallet/util/new_peak_queue.py +82 -0
- chia/wallet/util/notifications.py +12 -0
- chia/wallet/util/peer_request_cache.py +174 -0
- chia/wallet/util/pprint.py +39 -0
- chia/wallet/util/puzzle_compression.py +95 -0
- chia/wallet/util/puzzle_decorator.py +100 -0
- chia/wallet/util/puzzle_decorator_type.py +7 -0
- chia/wallet/util/query_filter.py +59 -0
- chia/wallet/util/transaction_type.py +23 -0
- chia/wallet/util/tx_config.py +158 -0
- chia/wallet/util/wallet_sync_utils.py +351 -0
- chia/wallet/util/wallet_types.py +72 -0
- chia/wallet/vc_wallet/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +664 -0
- chia/wallet/vc_wallet/cr_cat_wallet.py +877 -0
- chia/wallet/vc_wallet/cr_outer_puzzle.py +102 -0
- chia/wallet/vc_wallet/cr_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp +3 -0
- chia/wallet/vc_wallet/cr_puzzles/conditions_w_fee_announce.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp +304 -0
- chia/wallet/vc_wallet/cr_puzzles/credential_restriction.clsp.hex +1 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp +45 -0
- chia/wallet/vc_wallet/cr_puzzles/flag_proofs_checker.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_drivers.py +838 -0
- chia/wallet/vc_wallet/vc_puzzles/__init__.py +0 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp +30 -0
- chia/wallet/vc_wallet/vc_puzzles/covenant_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp +75 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_covenant_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp +32 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_transfer_program_covenant_adapter.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp +80 -0
- chia/wallet/vc_wallet/vc_puzzles/eml_update_metadata_with_DID.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp +163 -0
- chia/wallet/vc_wallet/vc_puzzles/exigent_metadata_layer.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp +16 -0
- chia/wallet/vc_wallet/vc_puzzles/p2_announced_delegated_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp +74 -0
- chia/wallet/vc_wallet/vc_puzzles/standard_vc_backdoor_puzzle.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp +23 -0
- chia/wallet/vc_wallet/vc_puzzles/std_parent_morpher.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp +64 -0
- chia/wallet/vc_wallet/vc_puzzles/viral_backdoor.clsp.hex +1 -0
- chia/wallet/vc_wallet/vc_store.py +263 -0
- chia/wallet/vc_wallet/vc_wallet.py +638 -0
- chia/wallet/wallet.py +698 -0
- chia/wallet/wallet_action_scope.py +96 -0
- chia/wallet/wallet_blockchain.py +244 -0
- chia/wallet/wallet_coin_record.py +72 -0
- chia/wallet/wallet_coin_store.py +351 -0
- chia/wallet/wallet_info.py +35 -0
- chia/wallet/wallet_interested_store.py +188 -0
- chia/wallet/wallet_nft_store.py +279 -0
- chia/wallet/wallet_node.py +1765 -0
- chia/wallet/wallet_node_api.py +207 -0
- chia/wallet/wallet_pool_store.py +119 -0
- chia/wallet/wallet_protocol.py +90 -0
- chia/wallet/wallet_puzzle_store.py +396 -0
- chia/wallet/wallet_retry_store.py +70 -0
- chia/wallet/wallet_singleton_store.py +259 -0
- chia/wallet/wallet_spend_bundle.py +25 -0
- chia/wallet/wallet_state_manager.py +2819 -0
- chia/wallet/wallet_transaction_store.py +496 -0
- chia/wallet/wallet_user_store.py +110 -0
- chia/wallet/wallet_weight_proof_handler.py +126 -0
- chia_blockchain-2.5.1rc1.dist-info/LICENSE +201 -0
- chia_blockchain-2.5.1rc1.dist-info/METADATA +156 -0
- chia_blockchain-2.5.1rc1.dist-info/RECORD +1042 -0
- chia_blockchain-2.5.1rc1.dist-info/WHEEL +4 -0
- chia_blockchain-2.5.1rc1.dist-info/entry_points.txt +17 -0
- mozilla-ca/cacert.pem +3611 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import pathlib
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
from chia_rs import G1Element
|
|
8
|
+
from clvm_tools import binutils
|
|
9
|
+
|
|
10
|
+
from chia._tests.core.make_block_generator import make_block_generator
|
|
11
|
+
from chia._tests.util.get_name_puzzle_conditions import get_name_puzzle_conditions
|
|
12
|
+
from chia._tests.util.misc import BenchmarkRunner
|
|
13
|
+
from chia.consensus.condition_costs import ConditionCost
|
|
14
|
+
from chia.consensus.cost_calculator import NPCResult
|
|
15
|
+
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
16
|
+
from chia.full_node.bundle_tools import simple_solution_generator
|
|
17
|
+
from chia.full_node.mempool_check_conditions import get_puzzle_and_solution_for_coin
|
|
18
|
+
from chia.simulator.block_tools import BlockTools, test_constants
|
|
19
|
+
from chia.types.blockchain_format.coin import Coin
|
|
20
|
+
from chia.types.blockchain_format.program import Program
|
|
21
|
+
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
22
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
23
|
+
from chia.types.generator_types import BlockGenerator
|
|
24
|
+
from chia.util.ints import uint32, uint64
|
|
25
|
+
from chia.wallet.puzzles import p2_delegated_puzzle_or_hidden_puzzle
|
|
26
|
+
|
|
27
|
+
BURN_PUZZLE_HASH = bytes32(b"0" * 32)
|
|
28
|
+
SMALL_BLOCK_GENERATOR = make_block_generator(1)
|
|
29
|
+
|
|
30
|
+
log = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def large_block_generator(size: int) -> bytes:
|
|
34
|
+
# make a small block and hash it
|
|
35
|
+
# use this in the name for the cached big block
|
|
36
|
+
# the idea is, if the algorithm for building the big block changes,
|
|
37
|
+
# the name of the cache file will also change
|
|
38
|
+
|
|
39
|
+
name = SMALL_BLOCK_GENERATOR.program.get_tree_hash().hex()[:16]
|
|
40
|
+
|
|
41
|
+
my_dir = pathlib.Path(__file__).absolute().parent
|
|
42
|
+
hex_path = my_dir / f"large-block-{name}-{size}.hex"
|
|
43
|
+
try:
|
|
44
|
+
with open(hex_path) as f:
|
|
45
|
+
hex_str = f.read()
|
|
46
|
+
return bytes.fromhex(hex_str)
|
|
47
|
+
except FileNotFoundError:
|
|
48
|
+
generator = make_block_generator(size)
|
|
49
|
+
blob = bytes(generator.program)
|
|
50
|
+
# TODO: Re-enable large-block*.hex but cache in ~/.chia/subdir
|
|
51
|
+
# with open(hex_path, "w") as f:
|
|
52
|
+
# f.write(blob.hex())
|
|
53
|
+
return blob
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@pytest.mark.anyio
|
|
57
|
+
async def test_basics(softfork_height: int, bt: BlockTools) -> None:
|
|
58
|
+
wallet_tool = bt.get_pool_wallet_tool()
|
|
59
|
+
ph = wallet_tool.get_new_puzzlehash()
|
|
60
|
+
num_blocks = 3
|
|
61
|
+
blocks = bt.get_consecutive_blocks(
|
|
62
|
+
num_blocks, [], guarantee_transaction_block=True, pool_reward_puzzle_hash=ph, farmer_reward_puzzle_hash=ph
|
|
63
|
+
)
|
|
64
|
+
coinbase = None
|
|
65
|
+
for coin in blocks[2].get_included_reward_coins():
|
|
66
|
+
if coin.puzzle_hash == ph and coin.amount == 250000000000:
|
|
67
|
+
coinbase = coin
|
|
68
|
+
break
|
|
69
|
+
assert coinbase is not None
|
|
70
|
+
spend_bundle = wallet_tool.generate_signed_transaction(
|
|
71
|
+
uint64(coinbase.amount),
|
|
72
|
+
BURN_PUZZLE_HASH,
|
|
73
|
+
coinbase,
|
|
74
|
+
)
|
|
75
|
+
assert spend_bundle is not None
|
|
76
|
+
program: BlockGenerator = simple_solution_generator(spend_bundle)
|
|
77
|
+
|
|
78
|
+
npc_result: NPCResult = get_name_puzzle_conditions(
|
|
79
|
+
program,
|
|
80
|
+
bt.constants.MAX_BLOCK_COST_CLVM,
|
|
81
|
+
mempool_mode=False,
|
|
82
|
+
height=uint32(softfork_height),
|
|
83
|
+
constants=bt.constants,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
assert npc_result.error is None
|
|
87
|
+
assert len(bytes(program.program)) == 433
|
|
88
|
+
|
|
89
|
+
coin_spend = spend_bundle.coin_spends[0]
|
|
90
|
+
assert npc_result.conds is not None
|
|
91
|
+
assert coin_spend.coin.name() == npc_result.conds.spends[0].coin_id
|
|
92
|
+
spend_info = get_puzzle_and_solution_for_coin(program, coin_spend.coin, softfork_height, bt.constants)
|
|
93
|
+
assert spend_info.puzzle == coin_spend.puzzle_reveal
|
|
94
|
+
assert spend_info.solution == coin_spend.solution
|
|
95
|
+
|
|
96
|
+
if softfork_height >= bt.constants.HARD_FORK_HEIGHT:
|
|
97
|
+
clvm_cost = 27360
|
|
98
|
+
else:
|
|
99
|
+
clvm_cost = 404560
|
|
100
|
+
byte_cost = len(bytes(program.program)) * bt.constants.COST_PER_BYTE
|
|
101
|
+
assert (
|
|
102
|
+
npc_result.conds.cost == ConditionCost.CREATE_COIN.value + ConditionCost.AGG_SIG.value + clvm_cost + byte_cost
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# Create condition + agg_sig_condition + length + cpu_cost
|
|
106
|
+
assert (
|
|
107
|
+
npc_result.conds.cost
|
|
108
|
+
== ConditionCost.CREATE_COIN.value
|
|
109
|
+
+ ConditionCost.AGG_SIG.value
|
|
110
|
+
+ len(bytes(program.program)) * bt.constants.COST_PER_BYTE
|
|
111
|
+
+ clvm_cost
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@pytest.mark.anyio
|
|
116
|
+
async def test_mempool_mode(softfork_height: int, bt: BlockTools) -> None:
|
|
117
|
+
wallet_tool = bt.get_pool_wallet_tool()
|
|
118
|
+
ph = wallet_tool.get_new_puzzlehash()
|
|
119
|
+
|
|
120
|
+
num_blocks = 3
|
|
121
|
+
blocks = bt.get_consecutive_blocks(
|
|
122
|
+
num_blocks, [], guarantee_transaction_block=True, pool_reward_puzzle_hash=ph, farmer_reward_puzzle_hash=ph
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
coinbase = None
|
|
126
|
+
for coin in blocks[2].get_included_reward_coins():
|
|
127
|
+
if coin.puzzle_hash == ph:
|
|
128
|
+
coinbase = coin
|
|
129
|
+
break
|
|
130
|
+
assert coinbase is not None
|
|
131
|
+
spend_bundle = wallet_tool.generate_signed_transaction(
|
|
132
|
+
uint64(coinbase.amount),
|
|
133
|
+
BURN_PUZZLE_HASH,
|
|
134
|
+
coinbase,
|
|
135
|
+
)
|
|
136
|
+
assert spend_bundle is not None
|
|
137
|
+
|
|
138
|
+
pk = bytes.fromhex(
|
|
139
|
+
"88bc9360319e7c54ab42e19e974288a2d7a817976f7633f4b43f36ce72074e59c4ab8ddac362202f3e366f0aebbb6280"
|
|
140
|
+
)
|
|
141
|
+
puzzle = p2_delegated_puzzle_or_hidden_puzzle.puzzle_for_pk(G1Element.from_bytes(pk))
|
|
142
|
+
disassembly = binutils.disassemble(puzzle)
|
|
143
|
+
unknown_opcode = "15"
|
|
144
|
+
program = SerializedProgram.from_bytes(
|
|
145
|
+
binutils.assemble(
|
|
146
|
+
f"(q ((0x3d2331635a58c0d49912bc1427d7db51afe3f20a7b4bcaffa17ee250dcbcbfaa {disassembly} 300"
|
|
147
|
+
f" (() (q . (({unknown_opcode} '00000000000000000000000000000000' 0x0cbba106e000))) ()))))"
|
|
148
|
+
).as_bin()
|
|
149
|
+
)
|
|
150
|
+
generator = BlockGenerator(program, [])
|
|
151
|
+
npc_result: NPCResult = get_name_puzzle_conditions(
|
|
152
|
+
generator,
|
|
153
|
+
bt.constants.MAX_BLOCK_COST_CLVM,
|
|
154
|
+
mempool_mode=True,
|
|
155
|
+
height=uint32(softfork_height),
|
|
156
|
+
constants=bt.constants,
|
|
157
|
+
)
|
|
158
|
+
assert npc_result.error is not None
|
|
159
|
+
npc_result = get_name_puzzle_conditions(
|
|
160
|
+
generator,
|
|
161
|
+
bt.constants.MAX_BLOCK_COST_CLVM,
|
|
162
|
+
mempool_mode=False,
|
|
163
|
+
height=uint32(softfork_height),
|
|
164
|
+
constants=bt.constants,
|
|
165
|
+
)
|
|
166
|
+
assert npc_result.error is None
|
|
167
|
+
|
|
168
|
+
coin = Coin(
|
|
169
|
+
bytes32.fromhex("3d2331635a58c0d49912bc1427d7db51afe3f20a7b4bcaffa17ee250dcbcbfaa"),
|
|
170
|
+
bytes32.fromhex("14947eb0e69ee8fc8279190fc2d38cb4bbb61ba28f1a270cfd643a0e8d759576"),
|
|
171
|
+
uint64(300),
|
|
172
|
+
)
|
|
173
|
+
spend_info = get_puzzle_and_solution_for_coin(generator, coin, softfork_height, bt.constants)
|
|
174
|
+
assert spend_info.puzzle.to_program() == puzzle
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@pytest.mark.anyio
|
|
178
|
+
async def test_clvm_mempool_mode(softfork_height: int) -> None:
|
|
179
|
+
block = Program.from_bytes(bytes(SMALL_BLOCK_GENERATOR.program))
|
|
180
|
+
disassembly = binutils.disassemble(block)
|
|
181
|
+
# this is a valid generator program except the first clvm
|
|
182
|
+
# if-condition, that depends on executing an unknown operator
|
|
183
|
+
# ("0xfe"). In mempool mode, this should fail, but in non-mempool
|
|
184
|
+
# mode, the unknown operator should be treated as if it returns ().
|
|
185
|
+
program = SerializedProgram.from_bytes(binutils.assemble(f"(i (0xfe (q . 0)) (q . ()) {disassembly})").as_bin())
|
|
186
|
+
generator = BlockGenerator(program, [])
|
|
187
|
+
npc_result: NPCResult = get_name_puzzle_conditions(
|
|
188
|
+
generator,
|
|
189
|
+
test_constants.MAX_BLOCK_COST_CLVM,
|
|
190
|
+
mempool_mode=True,
|
|
191
|
+
height=uint32(softfork_height),
|
|
192
|
+
constants=test_constants,
|
|
193
|
+
)
|
|
194
|
+
assert npc_result.error is not None
|
|
195
|
+
npc_result = get_name_puzzle_conditions(
|
|
196
|
+
generator,
|
|
197
|
+
test_constants.MAX_BLOCK_COST_CLVM,
|
|
198
|
+
mempool_mode=False,
|
|
199
|
+
height=uint32(softfork_height),
|
|
200
|
+
constants=test_constants,
|
|
201
|
+
)
|
|
202
|
+
assert npc_result.error is None
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
@pytest.mark.anyio
|
|
206
|
+
async def test_tx_generator_speed(softfork_height: int, benchmark_runner: BenchmarkRunner) -> None:
|
|
207
|
+
LARGE_BLOCK_COIN_CONSUMED_COUNT = 687
|
|
208
|
+
generator_bytes = large_block_generator(LARGE_BLOCK_COIN_CONSUMED_COUNT)
|
|
209
|
+
program = SerializedProgram.from_bytes(generator_bytes)
|
|
210
|
+
|
|
211
|
+
with benchmark_runner.assert_runtime(seconds=1.25):
|
|
212
|
+
generator = BlockGenerator(program, [])
|
|
213
|
+
npc_result = get_name_puzzle_conditions(
|
|
214
|
+
generator,
|
|
215
|
+
test_constants.MAX_BLOCK_COST_CLVM,
|
|
216
|
+
mempool_mode=False,
|
|
217
|
+
height=uint32(softfork_height),
|
|
218
|
+
constants=test_constants,
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
assert npc_result.error is None
|
|
222
|
+
assert npc_result.conds is not None
|
|
223
|
+
assert len(npc_result.conds.spends) == LARGE_BLOCK_COIN_CONSUMED_COUNT
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
@pytest.mark.anyio
|
|
227
|
+
async def test_clvm_max_cost(softfork_height: int) -> None:
|
|
228
|
+
block = Program.from_bytes(bytes(SMALL_BLOCK_GENERATOR.program))
|
|
229
|
+
disassembly = binutils.disassemble(block)
|
|
230
|
+
# this is a valid generator program except the first clvm
|
|
231
|
+
# if-condition, that depends on executing an unknown operator
|
|
232
|
+
# ("0xfe"). In mempool mode, this should fail, but in non-mempool
|
|
233
|
+
# mode, the unknown operator should be treated as if it returns ().
|
|
234
|
+
# the CLVM program has a cost of 391969
|
|
235
|
+
program = SerializedProgram.from_bytes(
|
|
236
|
+
binutils.assemble(f"(i (softfork (q . 10000000)) (q . ()) {disassembly})").as_bin()
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
# ensure we fail if the program exceeds the cost
|
|
240
|
+
generator = BlockGenerator(program, [])
|
|
241
|
+
npc_result = get_name_puzzle_conditions(
|
|
242
|
+
generator, 10000000, mempool_mode=False, height=uint32(softfork_height), constants=test_constants
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
assert npc_result.error is not None
|
|
246
|
+
assert npc_result.conds is None
|
|
247
|
+
|
|
248
|
+
# raise the max cost to make sure this passes
|
|
249
|
+
# ensure we pass if the program does not exceeds the cost
|
|
250
|
+
npc_result = get_name_puzzle_conditions(
|
|
251
|
+
generator, 23000000, mempool_mode=False, height=uint32(softfork_height), constants=test_constants
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
assert npc_result.error is None
|
|
255
|
+
assert npc_result.conds is not None
|
|
256
|
+
assert npc_result.conds.cost > 10000000
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
@pytest.mark.anyio
|
|
260
|
+
async def test_standard_tx(benchmark_runner: BenchmarkRunner) -> None:
|
|
261
|
+
# this isn't a real public key, but we don't care
|
|
262
|
+
public_key = bytes.fromhex(
|
|
263
|
+
"af949b78fa6a957602c3593a3d6cb7711e08720415dad831ab18adacaa9b27ec3dda508ee32e24bc811c0abc5781ae21"
|
|
264
|
+
)
|
|
265
|
+
puzzle_program = SerializedProgram.from_bytes(
|
|
266
|
+
bytes(p2_delegated_puzzle_or_hidden_puzzle.puzzle_for_pk(G1Element.from_bytes(public_key)))
|
|
267
|
+
)
|
|
268
|
+
conditions = binutils.assemble(
|
|
269
|
+
"((51 0x699eca24f2b6f4b25b16f7a418d0dc4fc5fce3b9145aecdda184158927738e3e 10)"
|
|
270
|
+
" (51 0x847bb2385534070c39a39cc5dfdc7b35e2db472dc0ab10ab4dec157a2178adbf 0x00cbba106df6))"
|
|
271
|
+
)
|
|
272
|
+
solution_program = SerializedProgram.from_bytes(
|
|
273
|
+
bytes(p2_delegated_puzzle_or_hidden_puzzle.solution_for_conditions(conditions))
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
with benchmark_runner.assert_runtime(seconds=0.1):
|
|
277
|
+
total_cost = 0
|
|
278
|
+
for i in range(0, 1000):
|
|
279
|
+
cost, _result = puzzle_program.run_with_cost(test_constants.MAX_BLOCK_COST_CLVM, solution_program)
|
|
280
|
+
total_cost += cost
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
@pytest.mark.anyio
|
|
284
|
+
async def test_get_puzzle_and_solution_for_coin_performance(benchmark_runner: BenchmarkRunner) -> None:
|
|
285
|
+
from chia._tests.core.large_block import LARGE_BLOCK
|
|
286
|
+
from chia.full_node.mempool_check_conditions import DESERIALIZE_MOD
|
|
287
|
+
|
|
288
|
+
assert LARGE_BLOCK.transactions_generator is not None
|
|
289
|
+
# first, list all spent coins in the block
|
|
290
|
+
_, result = LARGE_BLOCK.transactions_generator.run_with_cost(
|
|
291
|
+
DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM, [DESERIALIZE_MOD, []]
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
coin_spends = result.first()
|
|
295
|
+
spent_coins: list[Coin] = []
|
|
296
|
+
for spend in coin_spends.as_iter():
|
|
297
|
+
parent, puzzle, amount_program, _ = spend.as_iter()
|
|
298
|
+
parent_coin_info = parent.as_atom()
|
|
299
|
+
puzzle_hash = puzzle.get_tree_hash()
|
|
300
|
+
amount = uint64(amount_program.as_int())
|
|
301
|
+
coin = Coin(parent_coin_info=parent_coin_info, puzzle_hash=puzzle_hash, amount=amount)
|
|
302
|
+
spent_coins.append(coin)
|
|
303
|
+
|
|
304
|
+
print(f"found {len(spent_coins)} spent coins in block")
|
|
305
|
+
|
|
306
|
+
# benchmark the function to pick out the puzzle and solution for a specific
|
|
307
|
+
# coin
|
|
308
|
+
generator = BlockGenerator(LARGE_BLOCK.transactions_generator, [])
|
|
309
|
+
with benchmark_runner.assert_runtime(seconds=8.5):
|
|
310
|
+
for _ in range(3):
|
|
311
|
+
for c in spent_coins:
|
|
312
|
+
spend_info = get_puzzle_and_solution_for_coin(generator, c, 0, test_constants)
|
|
313
|
+
assert spend_info.puzzle.get_tree_hash() == c.puzzle_hash
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import time
|
|
5
|
+
from datetime import datetime, timedelta
|
|
6
|
+
from typing import cast
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
from chia._tests.util.setup_nodes import SimulatorsAndWalletsServices
|
|
11
|
+
from chia._tests.util.time_out_assert import time_out_assert
|
|
12
|
+
from chia.full_node.full_node_api import FullNodeAPI
|
|
13
|
+
from chia.protocols.full_node_protocol import NewPeak
|
|
14
|
+
from chia.protocols.protocol_message_types import ProtocolMessageTypes
|
|
15
|
+
from chia.protocols.wallet_protocol import RequestChildren
|
|
16
|
+
from chia.seeder.peer_record import PeerRecord, PeerReliability
|
|
17
|
+
from chia.server.outbound_message import make_msg
|
|
18
|
+
from chia.types.aliases import CrawlerService
|
|
19
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
20
|
+
from chia.types.peer_info import PeerInfo
|
|
21
|
+
from chia.util.ints import uint32, uint64, uint128
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@pytest.mark.anyio
|
|
25
|
+
async def test_crawler_loops_by_default(crawler_service: CrawlerService) -> None:
|
|
26
|
+
"""
|
|
27
|
+
Ensures that when the crawler is started with all defaults, the crawling loop is started
|
|
28
|
+
"""
|
|
29
|
+
crawler = crawler_service._node
|
|
30
|
+
assert crawler.crawl_task is not None
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@pytest.mark.anyio
|
|
34
|
+
async def test_crawler_no_loops(crawler_service_no_loop: CrawlerService) -> None:
|
|
35
|
+
"""
|
|
36
|
+
Ensures that when the crawler is call in no loop mode, there is no loop running
|
|
37
|
+
"""
|
|
38
|
+
crawler = crawler_service_no_loop._node
|
|
39
|
+
assert crawler.crawl_task is None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@pytest.mark.anyio
|
|
43
|
+
async def test_unknown_messages(
|
|
44
|
+
self_hostname: str,
|
|
45
|
+
one_node: SimulatorsAndWalletsServices,
|
|
46
|
+
crawler_service_no_loop: CrawlerService,
|
|
47
|
+
caplog: pytest.LogCaptureFixture,
|
|
48
|
+
) -> None:
|
|
49
|
+
[full_node_service], _, _ = one_node
|
|
50
|
+
crawler = crawler_service_no_loop._node
|
|
51
|
+
full_node = full_node_service._node
|
|
52
|
+
assert await crawler.server.start_client(
|
|
53
|
+
PeerInfo(self_hostname, cast(FullNodeAPI, full_node_service._api).server.get_port()), None
|
|
54
|
+
)
|
|
55
|
+
connection = full_node.server.all_connections[crawler.server.node_id]
|
|
56
|
+
|
|
57
|
+
def receiving_failed() -> bool:
|
|
58
|
+
return "Non existing function: request_children" in caplog.text
|
|
59
|
+
|
|
60
|
+
with caplog.at_level(logging.ERROR):
|
|
61
|
+
msg = make_msg(ProtocolMessageTypes.request_children, RequestChildren(bytes32.zeros))
|
|
62
|
+
assert await connection.send_message(msg)
|
|
63
|
+
await time_out_assert(10, receiving_failed)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@pytest.mark.anyio
|
|
67
|
+
async def test_valid_message(
|
|
68
|
+
self_hostname: str,
|
|
69
|
+
one_node: SimulatorsAndWalletsServices,
|
|
70
|
+
crawler_service_no_loop: CrawlerService,
|
|
71
|
+
caplog: pytest.LogCaptureFixture,
|
|
72
|
+
) -> None:
|
|
73
|
+
[full_node_service], _, _ = one_node
|
|
74
|
+
crawler = crawler_service_no_loop._node
|
|
75
|
+
full_node = full_node_service._node
|
|
76
|
+
assert await crawler.server.start_client(
|
|
77
|
+
PeerInfo(self_hostname, cast(FullNodeAPI, full_node_service._api).server.get_port()), None
|
|
78
|
+
)
|
|
79
|
+
connection = full_node.server.all_connections[crawler.server.node_id]
|
|
80
|
+
|
|
81
|
+
def peer_added() -> bool:
|
|
82
|
+
return crawler.server.all_connections[full_node.server.node_id].get_peer_logging() in crawler.with_peak
|
|
83
|
+
|
|
84
|
+
msg = make_msg(
|
|
85
|
+
ProtocolMessageTypes.new_peak,
|
|
86
|
+
NewPeak(bytes32.zeros, uint32(2), uint128(1), uint32(1), bytes32(b"\1" * 32)),
|
|
87
|
+
)
|
|
88
|
+
assert await connection.send_message(msg)
|
|
89
|
+
await time_out_assert(10, peer_added)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@pytest.mark.anyio
|
|
93
|
+
async def test_crawler_to_db(crawler_service_no_loop: CrawlerService, one_node: SimulatorsAndWalletsServices) -> None:
|
|
94
|
+
"""
|
|
95
|
+
This is a lot more of an integration test, but it tests the whole process. We add a node to the crawler, then we
|
|
96
|
+
save it to the db and validate.
|
|
97
|
+
"""
|
|
98
|
+
[full_node_service], _, _ = one_node
|
|
99
|
+
full_node = full_node_service._node
|
|
100
|
+
crawler = crawler_service_no_loop._node
|
|
101
|
+
crawl_store = crawler.crawl_store
|
|
102
|
+
assert crawl_store is not None
|
|
103
|
+
peer_address = "127.0.0.1"
|
|
104
|
+
|
|
105
|
+
# create peer records
|
|
106
|
+
peer_record = PeerRecord(
|
|
107
|
+
peer_address,
|
|
108
|
+
peer_address,
|
|
109
|
+
uint32(full_node.server.get_port()),
|
|
110
|
+
False,
|
|
111
|
+
uint64(0),
|
|
112
|
+
uint32(0),
|
|
113
|
+
uint64(0),
|
|
114
|
+
uint64(int(time.time())),
|
|
115
|
+
uint64(0),
|
|
116
|
+
"undefined",
|
|
117
|
+
uint64(0),
|
|
118
|
+
tls_version="unknown",
|
|
119
|
+
)
|
|
120
|
+
peer_reliability = PeerReliability(peer_address, tries=1, successes=1)
|
|
121
|
+
|
|
122
|
+
# add peer to the db & mark it as connected
|
|
123
|
+
await crawl_store.add_peer(peer_record, peer_reliability)
|
|
124
|
+
assert peer_record == crawl_store.host_to_records[peer_address]
|
|
125
|
+
await crawler.save_to_db()
|
|
126
|
+
good_peers = await crawl_store.get_good_peers()
|
|
127
|
+
assert good_peers == [peer_address]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@pytest.mark.anyio
|
|
131
|
+
async def test_crawler_peer_cleanup(
|
|
132
|
+
crawler_service_no_loop: CrawlerService, one_node: SimulatorsAndWalletsServices
|
|
133
|
+
) -> None:
|
|
134
|
+
"""
|
|
135
|
+
This is a lot more of an integration test, but it tests the whole process. We add multiple nodes to the crawler,
|
|
136
|
+
then we save them to the db and validate. One of the nodes is older than the 90 day cutoff, so we also
|
|
137
|
+
call the prune function and ensure the node is deleted as expected
|
|
138
|
+
"""
|
|
139
|
+
[full_node_service], _, _ = one_node
|
|
140
|
+
full_node = full_node_service._node
|
|
141
|
+
crawler = crawler_service_no_loop._node
|
|
142
|
+
crawl_store = crawler.crawl_store
|
|
143
|
+
assert crawl_store is not None
|
|
144
|
+
peer_addresses = ["10.0.0.1", "10.0.0.2", "10.0.0.3", "10.0.0.4", "10.0.0.5"]
|
|
145
|
+
|
|
146
|
+
for idx, peer_address in enumerate(peer_addresses):
|
|
147
|
+
# create peer records
|
|
148
|
+
peer_record = PeerRecord(
|
|
149
|
+
peer_address,
|
|
150
|
+
peer_address,
|
|
151
|
+
uint32(full_node.server.get_port()),
|
|
152
|
+
False,
|
|
153
|
+
uint64(0),
|
|
154
|
+
uint32(0),
|
|
155
|
+
uint64(0),
|
|
156
|
+
uint64(int(time.time())),
|
|
157
|
+
uint64(int((datetime.now() - timedelta(days=idx * 10)).timestamp())),
|
|
158
|
+
"undefined",
|
|
159
|
+
uint64(0),
|
|
160
|
+
tls_version="unknown",
|
|
161
|
+
)
|
|
162
|
+
peer_reliability = PeerReliability(peer_address, tries=1, successes=1)
|
|
163
|
+
|
|
164
|
+
# add peer to the db & mark it as connected
|
|
165
|
+
await crawl_store.add_peer(peer_record, peer_reliability)
|
|
166
|
+
assert peer_record == crawl_store.host_to_records[peer_address]
|
|
167
|
+
|
|
168
|
+
await crawler.save_to_db()
|
|
169
|
+
good_peers = await crawl_store.get_good_peers()
|
|
170
|
+
assert set(good_peers) == set(peer_addresses)
|
|
171
|
+
|
|
172
|
+
await crawl_store.prune_old_peers(older_than_days=31)
|
|
173
|
+
assert 4 == len(crawl_store.host_to_records)
|
|
174
|
+
good_peers = await crawl_store.get_good_peers()
|
|
175
|
+
assert set(good_peers) == {"10.0.0.1", "10.0.0.2", "10.0.0.3", "10.0.0.4"}, good_peers
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from chia.rpc.crawler_rpc_api import CrawlerRpcApi
|
|
6
|
+
from chia.seeder.crawler import Crawler
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.anyio
|
|
10
|
+
async def test_get_ips_after_timestamp(bt):
|
|
11
|
+
crawler = Crawler(bt.config.get("seeder", {}), bt.root_path, constants=bt.constants)
|
|
12
|
+
crawler_rpc_api = CrawlerRpcApi(crawler)
|
|
13
|
+
|
|
14
|
+
# Should raise ValueError when `after` is not supplied
|
|
15
|
+
with pytest.raises(ValueError):
|
|
16
|
+
await crawler_rpc_api.get_ips_after_timestamp({})
|
|
17
|
+
|
|
18
|
+
# Crawler isn't actually crawling, so this should return zero IPs
|
|
19
|
+
response = await crawler_rpc_api.get_ips_after_timestamp({"after": 0})
|
|
20
|
+
assert len(response["ips"]) == 0
|
|
21
|
+
|
|
22
|
+
# Add some known data
|
|
23
|
+
# IPs are listed here out of order (by time) to test consistent sorting
|
|
24
|
+
# Timestamps increase as the IP value increases
|
|
25
|
+
crawler.best_timestamp_per_peer["0.0.0.0"] = 0
|
|
26
|
+
crawler.best_timestamp_per_peer["2.2.2.2"] = 1644300000
|
|
27
|
+
crawler.best_timestamp_per_peer["1.1.1.1"] = 1644213600
|
|
28
|
+
crawler.best_timestamp_per_peer["7.7.7.7"] = 1644732000
|
|
29
|
+
crawler.best_timestamp_per_peer["3.3.3.3"] = 1644386400
|
|
30
|
+
crawler.best_timestamp_per_peer["4.4.4.4"] = 1644472800
|
|
31
|
+
crawler.best_timestamp_per_peer["9.9.9.9"] = 1644904800
|
|
32
|
+
crawler.best_timestamp_per_peer["5.5.5.5"] = 1644559200
|
|
33
|
+
crawler.best_timestamp_per_peer["6.6.6.6"] = 1644645600
|
|
34
|
+
crawler.best_timestamp_per_peer["8.8.8.8"] = 1644818400
|
|
35
|
+
|
|
36
|
+
response = await crawler_rpc_api.get_ips_after_timestamp({"after": 0})
|
|
37
|
+
assert len(response["ips"]) == 9
|
|
38
|
+
|
|
39
|
+
response = await crawler_rpc_api.get_ips_after_timestamp({"after": 1644473000})
|
|
40
|
+
assert len(response["ips"]) == 5
|
|
41
|
+
|
|
42
|
+
# Test offset/limit functionality
|
|
43
|
+
response = await crawler_rpc_api.get_ips_after_timestamp({"after": 0, "limit": 2})
|
|
44
|
+
assert len(response["ips"]) == 2
|
|
45
|
+
assert response["total"] == 9
|
|
46
|
+
assert response["ips"][0] == "1.1.1.1"
|
|
47
|
+
assert response["ips"][1] == "2.2.2.2"
|
|
48
|
+
|
|
49
|
+
response = await crawler_rpc_api.get_ips_after_timestamp({"after": 0, "offset": 2, "limit": 2})
|
|
50
|
+
assert len(response["ips"]) == 2
|
|
51
|
+
assert response["total"] == 9
|
|
52
|
+
assert response["ips"][0] == "3.3.3.3"
|
|
53
|
+
assert response["ips"][1] == "4.4.4.4"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from chia import __version__
|
|
6
|
+
from chia.daemon.client import connect_to_daemon
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.anyio
|
|
10
|
+
async def test_get_version_rpc(get_daemon, bt):
|
|
11
|
+
ws_server = get_daemon
|
|
12
|
+
config = bt.config
|
|
13
|
+
client = await connect_to_daemon(
|
|
14
|
+
config["self_hostname"],
|
|
15
|
+
config["daemon_port"],
|
|
16
|
+
50 * 1000 * 1000,
|
|
17
|
+
bt.get_daemon_ssl_context(),
|
|
18
|
+
heartbeat=config["daemon_heartbeat"],
|
|
19
|
+
)
|
|
20
|
+
response = await client.get_version()
|
|
21
|
+
|
|
22
|
+
assert response["data"]["success"]
|
|
23
|
+
assert response["data"]["version"] == __version__
|
|
24
|
+
ws_server.stop()
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import random
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from chia._tests.util.temp_file import TempFile
|
|
9
|
+
from chia.cmds.db_upgrade_func import convert_v1_to_v2
|
|
10
|
+
from chia.consensus.block_body_validation import ForkInfo
|
|
11
|
+
from chia.consensus.blockchain import Blockchain
|
|
12
|
+
from chia.consensus.multiprocess_validation import PreValidationResult
|
|
13
|
+
from chia.full_node.block_store import BlockStore
|
|
14
|
+
from chia.full_node.coin_store import CoinStore
|
|
15
|
+
from chia.full_node.hint_store import HintStore
|
|
16
|
+
from chia.simulator.block_tools import test_constants
|
|
17
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
18
|
+
from chia.util.db_wrapper import DBWrapper2
|
|
19
|
+
from chia.util.ints import uint32, uint64
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def rand_bytes(num) -> bytes:
|
|
23
|
+
ret = bytearray(num)
|
|
24
|
+
for i in range(num):
|
|
25
|
+
ret[i] = random.getrandbits(8)
|
|
26
|
+
return bytes(ret)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.mark.anyio
|
|
30
|
+
@pytest.mark.parametrize("with_hints", [True, False])
|
|
31
|
+
@pytest.mark.skip("we no longer support DB v1")
|
|
32
|
+
async def test_blocks(default_1000_blocks, with_hints: bool):
|
|
33
|
+
blocks = default_1000_blocks
|
|
34
|
+
|
|
35
|
+
hints: list[tuple[bytes32, bytes]] = []
|
|
36
|
+
for i in range(351):
|
|
37
|
+
hints.append((bytes32(rand_bytes(32)), rand_bytes(20)))
|
|
38
|
+
|
|
39
|
+
# the v1 schema allows duplicates in the hints table
|
|
40
|
+
for i in range(10):
|
|
41
|
+
coin_id = bytes32(rand_bytes(32))
|
|
42
|
+
hint = rand_bytes(20)
|
|
43
|
+
hints.append((coin_id, hint))
|
|
44
|
+
hints.append((coin_id, hint))
|
|
45
|
+
|
|
46
|
+
for i in range(2000):
|
|
47
|
+
hints.append((bytes32(rand_bytes(32)), rand_bytes(20)))
|
|
48
|
+
|
|
49
|
+
for i in range(5):
|
|
50
|
+
coin_id = bytes32(rand_bytes(32))
|
|
51
|
+
hint = rand_bytes(20)
|
|
52
|
+
hints.append((coin_id, hint))
|
|
53
|
+
hints.append((coin_id, hint))
|
|
54
|
+
|
|
55
|
+
with TempFile() as in_file, TempFile() as out_file:
|
|
56
|
+
async with DBWrapper2.managed(
|
|
57
|
+
database=in_file,
|
|
58
|
+
reader_count=1,
|
|
59
|
+
db_version=1,
|
|
60
|
+
journal_mode="OFF",
|
|
61
|
+
synchronous="OFF",
|
|
62
|
+
) as db_wrapper1:
|
|
63
|
+
block_store1 = await BlockStore.create(db_wrapper1)
|
|
64
|
+
coin_store1 = await CoinStore.create(db_wrapper1)
|
|
65
|
+
hint_store1 = await HintStore.create(db_wrapper1)
|
|
66
|
+
if with_hints:
|
|
67
|
+
for h in hints:
|
|
68
|
+
await hint_store1.add_hints([(h[0], h[1])])
|
|
69
|
+
|
|
70
|
+
bc = await Blockchain.create(coin_store1, block_store1, test_constants, Path("."), reserved_cores=0)
|
|
71
|
+
sub_slot_iters = test_constants.SUB_SLOT_ITERS_STARTING
|
|
72
|
+
for block in blocks:
|
|
73
|
+
if block.height != 0 and len(block.finished_sub_slots) > 0:
|
|
74
|
+
if block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters is not None:
|
|
75
|
+
sub_slot_iters = block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters
|
|
76
|
+
# await _validate_and_add_block(bc, block)
|
|
77
|
+
results = PreValidationResult(None, uint64(1), None, uint32(0))
|
|
78
|
+
fork_info = ForkInfo(block.height - 1, block.height - 1, block.prev_header_hash)
|
|
79
|
+
_, err, _ = await bc.add_block(block, results, sub_slot_iters=sub_slot_iters, fork_info=fork_info)
|
|
80
|
+
assert err is None
|
|
81
|
+
|
|
82
|
+
# now, convert v1 in_file to v2 out_file
|
|
83
|
+
convert_v1_to_v2(in_file, out_file)
|
|
84
|
+
|
|
85
|
+
async with DBWrapper2.managed(database=in_file, reader_count=1, db_version=1) as db_wrapper1:
|
|
86
|
+
async with DBWrapper2.managed(database=out_file, reader_count=1, db_version=2) as db_wrapper2:
|
|
87
|
+
block_store1 = await BlockStore.create(db_wrapper1)
|
|
88
|
+
coin_store1 = await CoinStore.create(db_wrapper1)
|
|
89
|
+
hint_store1 = await HintStore.create(db_wrapper1)
|
|
90
|
+
|
|
91
|
+
block_store2 = await BlockStore.create(db_wrapper2)
|
|
92
|
+
coin_store2 = await CoinStore.create(db_wrapper2)
|
|
93
|
+
hint_store2 = await HintStore.create(db_wrapper2)
|
|
94
|
+
|
|
95
|
+
if with_hints:
|
|
96
|
+
# check hints
|
|
97
|
+
for h in hints:
|
|
98
|
+
assert h[0] in await hint_store1.get_coin_ids(h[1])
|
|
99
|
+
assert h[0] in await hint_store2.get_coin_ids(h[1])
|
|
100
|
+
|
|
101
|
+
# check peak
|
|
102
|
+
assert await block_store1.get_peak() == await block_store2.get_peak()
|
|
103
|
+
|
|
104
|
+
# check blocks
|
|
105
|
+
for block in blocks:
|
|
106
|
+
hh = block.header_hash
|
|
107
|
+
height = block.height
|
|
108
|
+
assert await block_store1.get_full_block(hh) == await block_store2.get_full_block(hh)
|
|
109
|
+
assert await block_store1.get_full_block_bytes(hh) == await block_store2.get_full_block_bytes(hh)
|
|
110
|
+
assert await block_store1.get_full_blocks_at([height]) == await block_store2.get_full_blocks_at(
|
|
111
|
+
[height]
|
|
112
|
+
)
|
|
113
|
+
assert await block_store1.get_block_records_by_hash(
|
|
114
|
+
[hh]
|
|
115
|
+
) == await block_store2.get_block_records_by_hash([hh])
|
|
116
|
+
assert await block_store1.get_block_record(hh) == await block_store2.get_block_record(hh)
|
|
117
|
+
assert await block_store1.is_fully_compactified(hh) == await block_store2.is_fully_compactified(hh)
|
|
118
|
+
|
|
119
|
+
# check coins
|
|
120
|
+
for block in blocks:
|
|
121
|
+
coins = await coin_store1.get_coins_added_at_height(block.height)
|
|
122
|
+
coins2 = await coin_store2.get_coins_added_at_height(block.height)
|
|
123
|
+
assert len(coins) == len(coins2)
|
|
124
|
+
assert set(coins) == set(coins2)
|
|
125
|
+
assert await coin_store1.get_coins_removed_at_height(
|
|
126
|
+
block.height
|
|
127
|
+
) == await coin_store2.get_coins_removed_at_height(block.height)
|
|
128
|
+
for c in coins:
|
|
129
|
+
n = c.coin.name()
|
|
130
|
+
assert await coin_store1.get_coin_record(n) == await coin_store2.get_coin_record(n)
|