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,452 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import platform
|
|
5
|
+
import shutil
|
|
6
|
+
import sqlite3
|
|
7
|
+
import sys
|
|
8
|
+
import tempfile
|
|
9
|
+
import textwrap
|
|
10
|
+
from contextlib import closing
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from time import monotonic
|
|
13
|
+
from typing import Any, Optional
|
|
14
|
+
|
|
15
|
+
import zstd
|
|
16
|
+
|
|
17
|
+
from chia.util.config import load_config, lock_and_load_config, save_config
|
|
18
|
+
from chia.util.db_wrapper import get_host_parameter_limit
|
|
19
|
+
from chia.util.path import path_from_root
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# if either the input database or output database file is specified, the
|
|
23
|
+
# configuration file will not be updated to use the new database. Only when using
|
|
24
|
+
# the currently configured db file, and writing to the default output file will
|
|
25
|
+
# the configuration file also be updated
|
|
26
|
+
def db_upgrade_func(
|
|
27
|
+
root_path: Path,
|
|
28
|
+
in_db_path: Optional[Path] = None,
|
|
29
|
+
out_db_path: Optional[Path] = None,
|
|
30
|
+
*,
|
|
31
|
+
no_update_config: bool = False,
|
|
32
|
+
force: bool = False,
|
|
33
|
+
) -> None:
|
|
34
|
+
update_config: bool = in_db_path is None and out_db_path is None and not no_update_config
|
|
35
|
+
|
|
36
|
+
config: dict[str, Any]
|
|
37
|
+
selected_network: str
|
|
38
|
+
db_pattern: str
|
|
39
|
+
if in_db_path is None or out_db_path is None:
|
|
40
|
+
config = load_config(root_path, "config.yaml")["full_node"]
|
|
41
|
+
selected_network = config["selected_network"]
|
|
42
|
+
db_pattern = config["database_path"]
|
|
43
|
+
|
|
44
|
+
db_path_replaced: str
|
|
45
|
+
if in_db_path is None:
|
|
46
|
+
db_path_replaced = db_pattern.replace("CHALLENGE", selected_network)
|
|
47
|
+
in_db_path = path_from_root(root_path, db_path_replaced)
|
|
48
|
+
|
|
49
|
+
if out_db_path is None:
|
|
50
|
+
db_path_replaced = db_pattern.replace("CHALLENGE", selected_network).replace("_v1_", "_v2_")
|
|
51
|
+
out_db_path = path_from_root(root_path, db_path_replaced)
|
|
52
|
+
out_db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
53
|
+
|
|
54
|
+
_, _, free = shutil.disk_usage(out_db_path.parent)
|
|
55
|
+
in_db_size = in_db_path.stat().st_size
|
|
56
|
+
if free < in_db_size:
|
|
57
|
+
no_free: bool = free < in_db_size * 0.6
|
|
58
|
+
strength: str
|
|
59
|
+
if no_free:
|
|
60
|
+
strength = "probably not enough"
|
|
61
|
+
else:
|
|
62
|
+
strength = "very little"
|
|
63
|
+
print(f"there is {strength} free space on the volume where the output database will be written:")
|
|
64
|
+
print(f" {out_db_path}")
|
|
65
|
+
print(
|
|
66
|
+
f"free space: {free / 1024 / 1024 / 1024:0.2f} GiB expected about "
|
|
67
|
+
f"{in_db_size / 1024 / 1024 / 1024:0.2f} GiB"
|
|
68
|
+
)
|
|
69
|
+
if no_free and not force:
|
|
70
|
+
print("to override this check and convert anyway, pass --force")
|
|
71
|
+
return
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
convert_v1_to_v2(in_db_path, out_db_path)
|
|
75
|
+
|
|
76
|
+
if update_config:
|
|
77
|
+
print("updating config.yaml")
|
|
78
|
+
with lock_and_load_config(root_path, "config.yaml") as config:
|
|
79
|
+
new_db_path = db_pattern.replace("_v1_", "_v2_")
|
|
80
|
+
config["full_node"]["database_path"] = new_db_path
|
|
81
|
+
print(f"database_path: {new_db_path}")
|
|
82
|
+
save_config(root_path, "config.yaml", config)
|
|
83
|
+
|
|
84
|
+
except RuntimeError as e:
|
|
85
|
+
print(f"conversion failed with error: {e}.")
|
|
86
|
+
except Exception as e:
|
|
87
|
+
print(
|
|
88
|
+
textwrap.dedent(
|
|
89
|
+
f"""\
|
|
90
|
+
conversion failed with error: {e}.
|
|
91
|
+
The target v2 database is left in place (possibly in an incomplete state)
|
|
92
|
+
{out_db_path}
|
|
93
|
+
If the failure was caused by a full disk, ensure the volumes of your
|
|
94
|
+
temporary- and target directory have sufficient free space."""
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
if platform.system() == "Windows":
|
|
98
|
+
temp_dir = None
|
|
99
|
+
# this is where GetTempPath() looks
|
|
100
|
+
# https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-gettemppatha
|
|
101
|
+
if "TMP" in os.environ:
|
|
102
|
+
temp_dir = os.environ["TMP"]
|
|
103
|
+
elif "TEMP" in os.environ:
|
|
104
|
+
temp_dir = os.environ["TEMP"]
|
|
105
|
+
elif "USERPROFILE" in os.environ:
|
|
106
|
+
temp_dir = os.environ["USERPROFILE"]
|
|
107
|
+
if temp_dir is not None:
|
|
108
|
+
print(f"your temporary directory may be {temp_dir}")
|
|
109
|
+
temp_env = "TMP"
|
|
110
|
+
else:
|
|
111
|
+
temp_env = "SQLITE_TMPDIR"
|
|
112
|
+
print(f'you can specify the "{temp_env}" environment variable to control the temporary directory to be used')
|
|
113
|
+
|
|
114
|
+
print(f"\n\nLEAVING PREVIOUS DB FILE UNTOUCHED {in_db_path}\n")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def convert_v1_to_v2(in_path: Path, out_path: Path) -> None:
|
|
118
|
+
BATCH_SIZE = 300_000
|
|
119
|
+
if not in_path.exists():
|
|
120
|
+
raise RuntimeError(f"Input file doesn't exist. {in_path}")
|
|
121
|
+
if in_path == out_path:
|
|
122
|
+
raise RuntimeError(f"Output file is the same as the input {in_path}")
|
|
123
|
+
if out_path.exists():
|
|
124
|
+
raise RuntimeError(f"Output file already exists. {out_path}")
|
|
125
|
+
|
|
126
|
+
print(f"-- Opening file for reading: {in_path}")
|
|
127
|
+
with sqlite3.connect(in_path) as conn:
|
|
128
|
+
try:
|
|
129
|
+
with closing(conn.execute("SELECT version FROM database_version LIMIT 1")) as cursor:
|
|
130
|
+
row = cursor.fetchone()
|
|
131
|
+
if row is not None and row[0] != 1:
|
|
132
|
+
raise RuntimeError(f"Blockchain database already version {row[0]}. Won't convert")
|
|
133
|
+
except sqlite3.OperationalError:
|
|
134
|
+
pass
|
|
135
|
+
try:
|
|
136
|
+
conn.execute("SELECT unhex('00')")
|
|
137
|
+
except sqlite3.OperationalError:
|
|
138
|
+
print("-- No built-in unhex(), falling back to bytes.fromhex()")
|
|
139
|
+
conn.create_function("unhex", 1, bytes.fromhex)
|
|
140
|
+
conn.create_function("zstd_compress", 1, zstd.compress)
|
|
141
|
+
conn.execute("PRAGMA synchronous=off")
|
|
142
|
+
temp_dir = tempfile.gettempdir()
|
|
143
|
+
_, _, free = shutil.disk_usage(temp_dir)
|
|
144
|
+
if free < 50 * 1024 * 1024 * 1024:
|
|
145
|
+
print(f"-- Setting temp_store_directory to: {out_path.parent}")
|
|
146
|
+
conn.execute(f"PRAGMA temp_store_directory = '{out_path.parent}'")
|
|
147
|
+
print(f"-- Opening file for writing: {out_path}")
|
|
148
|
+
conn.execute("ATTACH DATABASE ? AS out_db", (str(out_path),))
|
|
149
|
+
conn.execute("PRAGMA out_db.journal_mode=off")
|
|
150
|
+
conn.execute("PRAGMA out_db.synchronous=off")
|
|
151
|
+
conn.execute("PRAGMA out_db.locking_mode=exclusive")
|
|
152
|
+
conn.execute("PRAGMA out_db.cache_size=131072")
|
|
153
|
+
print("-- Initializing v2 version")
|
|
154
|
+
conn.execute("CREATE TABLE out_db.database_version(version int)")
|
|
155
|
+
conn.execute("INSERT INTO out_db.database_version VALUES(?)", (2,))
|
|
156
|
+
print("-- Initializing current_peak")
|
|
157
|
+
conn.execute("CREATE TABLE out_db.current_peak(key int PRIMARY KEY, hash blob)")
|
|
158
|
+
with closing(conn.execute("SELECT header_hash, height FROM block_records WHERE is_peak = 1 LIMIT 1")) as cursor:
|
|
159
|
+
peak_row = cursor.fetchone()
|
|
160
|
+
if peak_row is None:
|
|
161
|
+
raise RuntimeError("v1 database does not have a peak block, there is no blockchain to convert")
|
|
162
|
+
peak_hash, peak_height = peak_row
|
|
163
|
+
print(f"-- Peak: {peak_hash} Height: {peak_height}")
|
|
164
|
+
conn.execute("INSERT INTO out_db.current_peak VALUES(?, ?)", (0, bytes.fromhex(peak_hash)))
|
|
165
|
+
conn.commit()
|
|
166
|
+
print("-- DB v1 to v2 conversion started")
|
|
167
|
+
print("-- [1/4] Converting full_blocks")
|
|
168
|
+
conn.execute(
|
|
169
|
+
"""
|
|
170
|
+
CREATE TABLE out_db.full_blocks(
|
|
171
|
+
header_hash blob PRIMARY KEY,
|
|
172
|
+
prev_hash blob,
|
|
173
|
+
height bigint,
|
|
174
|
+
sub_epoch_summary blob,
|
|
175
|
+
is_fully_compactified tinyint,
|
|
176
|
+
in_main_chain tinyint,
|
|
177
|
+
block blob,
|
|
178
|
+
block_record blob
|
|
179
|
+
)
|
|
180
|
+
"""
|
|
181
|
+
)
|
|
182
|
+
conn.commit()
|
|
183
|
+
parameter_limit = get_host_parameter_limit()
|
|
184
|
+
start_time = monotonic()
|
|
185
|
+
block_start_time = start_time
|
|
186
|
+
rowids: list[int] = []
|
|
187
|
+
small_batch_size = BATCH_SIZE <= parameter_limit
|
|
188
|
+
small_chain = peak_height <= parameter_limit
|
|
189
|
+
current_header_hash = peak_hash
|
|
190
|
+
current_height = peak_height
|
|
191
|
+
insertions_vs_batch = 0
|
|
192
|
+
rate = 1.0
|
|
193
|
+
while current_height >= 0:
|
|
194
|
+
while len(rowids) < parameter_limit:
|
|
195
|
+
if current_height < 0:
|
|
196
|
+
break
|
|
197
|
+
with closing(
|
|
198
|
+
conn.execute(
|
|
199
|
+
"SELECT rowid, prev_hash FROM block_records WHERE header_hash = ? AND height = ? LIMIT 1",
|
|
200
|
+
(current_header_hash, current_height),
|
|
201
|
+
)
|
|
202
|
+
) as cursor:
|
|
203
|
+
row = cursor.fetchone()
|
|
204
|
+
if row is None:
|
|
205
|
+
raise RuntimeError(f"rowid not found for {current_header_hash} at height {current_height}")
|
|
206
|
+
rowid, prev_hash = row
|
|
207
|
+
rowids.append(rowid)
|
|
208
|
+
current_header_hash = prev_hash
|
|
209
|
+
current_height -= 1
|
|
210
|
+
conn.execute(
|
|
211
|
+
f"""
|
|
212
|
+
INSERT INTO out_db.full_blocks
|
|
213
|
+
SELECT
|
|
214
|
+
unhex(br.header_hash),
|
|
215
|
+
unhex(br.prev_hash),
|
|
216
|
+
br.height, br.sub_epoch_summary,
|
|
217
|
+
fb.is_fully_compactified,
|
|
218
|
+
1 AS in_main_chain,
|
|
219
|
+
zstd_compress(fb.block),
|
|
220
|
+
br.block
|
|
221
|
+
FROM block_records br
|
|
222
|
+
JOIN full_blocks fb ON br.header_hash = fb.header_hash
|
|
223
|
+
WHERE br.rowid IN ({','.join('?' * len(rowids))})
|
|
224
|
+
""",
|
|
225
|
+
rowids,
|
|
226
|
+
)
|
|
227
|
+
insertions_vs_batch += len(rowids)
|
|
228
|
+
rowids = []
|
|
229
|
+
if insertions_vs_batch >= BATCH_SIZE or small_batch_size or small_chain:
|
|
230
|
+
conn.commit()
|
|
231
|
+
end_time = monotonic()
|
|
232
|
+
rate = BATCH_SIZE / (end_time - start_time)
|
|
233
|
+
print(
|
|
234
|
+
f"\r{current_height:10d} {(peak_height - current_height) * 100 / peak_height:.3f}% "
|
|
235
|
+
f"{rate:0.1f} blocks/s ETA: {current_height // rate} s ",
|
|
236
|
+
end="",
|
|
237
|
+
)
|
|
238
|
+
sys.stdout.flush()
|
|
239
|
+
start_time = end_time
|
|
240
|
+
insertions_vs_batch = 0
|
|
241
|
+
end_time = monotonic()
|
|
242
|
+
print(
|
|
243
|
+
"\r-- [1/4] Converting full_blocks SUCCEEDED in "
|
|
244
|
+
f"{end_time - block_start_time:.2f} seconds "
|
|
245
|
+
)
|
|
246
|
+
print("-- [1/4] Creating full_blocks height index")
|
|
247
|
+
height_index_start_time = monotonic()
|
|
248
|
+
conn.execute("CREATE INDEX out_db.height ON full_blocks(height)")
|
|
249
|
+
conn.commit()
|
|
250
|
+
end_time = monotonic()
|
|
251
|
+
print(
|
|
252
|
+
"\r-- [1/4] Creating full_blocks height index SUCCEEDED in "
|
|
253
|
+
f"{end_time - height_index_start_time:.2f} seconds "
|
|
254
|
+
)
|
|
255
|
+
print("-- [1/4] Creating full_blocks is_fully_compactified index")
|
|
256
|
+
ifc_index_start_time = monotonic()
|
|
257
|
+
conn.execute(
|
|
258
|
+
"""
|
|
259
|
+
CREATE INDEX out_db.is_fully_compactified
|
|
260
|
+
ON full_blocks(is_fully_compactified, in_main_chain)
|
|
261
|
+
WHERE in_main_chain=1
|
|
262
|
+
"""
|
|
263
|
+
)
|
|
264
|
+
conn.commit()
|
|
265
|
+
end_time = monotonic()
|
|
266
|
+
print(
|
|
267
|
+
"\r-- [1/4] Creating full_blocks is_fully_compactified index SUCCEEDED in "
|
|
268
|
+
f"{end_time - ifc_index_start_time:.2f} seconds "
|
|
269
|
+
)
|
|
270
|
+
print("-- [1/4] Creating full_blocks main_chain index")
|
|
271
|
+
main_chain_index_start_time = monotonic()
|
|
272
|
+
conn.execute(
|
|
273
|
+
"""
|
|
274
|
+
CREATE INDEX out_db.main_chain
|
|
275
|
+
ON full_blocks(height, in_main_chain)
|
|
276
|
+
WHERE in_main_chain=1
|
|
277
|
+
"""
|
|
278
|
+
)
|
|
279
|
+
conn.commit()
|
|
280
|
+
end_time = monotonic()
|
|
281
|
+
print(
|
|
282
|
+
"\r-- [1/4] Creating full_blocks main_chain index SUCCEEDED in "
|
|
283
|
+
f"{end_time - main_chain_index_start_time:.2f} seconds "
|
|
284
|
+
)
|
|
285
|
+
print("-- [2/4] Converting sub_epoch_segments_v3")
|
|
286
|
+
conn.execute(
|
|
287
|
+
"""
|
|
288
|
+
CREATE TABLE out_db.sub_epoch_segments_v3(
|
|
289
|
+
ses_block_hash blob PRIMARY KEY,
|
|
290
|
+
challenge_segments blob
|
|
291
|
+
)
|
|
292
|
+
"""
|
|
293
|
+
)
|
|
294
|
+
conn.commit()
|
|
295
|
+
ses_start_time = monotonic()
|
|
296
|
+
conn.execute(
|
|
297
|
+
"""
|
|
298
|
+
INSERT INTO out_db.sub_epoch_segments_v3
|
|
299
|
+
SELECT
|
|
300
|
+
unhex(ses_block_hash),
|
|
301
|
+
challenge_segments
|
|
302
|
+
FROM sub_epoch_segments_v3
|
|
303
|
+
"""
|
|
304
|
+
)
|
|
305
|
+
conn.commit()
|
|
306
|
+
end_time = monotonic()
|
|
307
|
+
print(
|
|
308
|
+
"\r-- [2/4] Converting sub_epoch_segments_v3 SUCCEEDED in "
|
|
309
|
+
f"{end_time - ses_start_time:.2f} seconds "
|
|
310
|
+
)
|
|
311
|
+
print("-- [3/4] Converting hints")
|
|
312
|
+
conn.execute("CREATE TABLE out_db.hints(coin_id blob, hint blob, UNIQUE (coin_id, hint))")
|
|
313
|
+
conn.commit()
|
|
314
|
+
start_time = monotonic()
|
|
315
|
+
hint_start_time = start_time
|
|
316
|
+
hints_count = 0
|
|
317
|
+
rate = 1.0
|
|
318
|
+
range_start = 1
|
|
319
|
+
while True:
|
|
320
|
+
with closing(
|
|
321
|
+
conn.execute("SELECT id FROM hints WHERE id >= ? LIMIT ?", (range_start, parameter_limit))
|
|
322
|
+
) as cursor:
|
|
323
|
+
rows = cursor.fetchall()
|
|
324
|
+
if len(rows) == 0:
|
|
325
|
+
break
|
|
326
|
+
conn.execute(
|
|
327
|
+
f"""
|
|
328
|
+
INSERT OR IGNORE INTO out_db.hints
|
|
329
|
+
SELECT
|
|
330
|
+
coin_id,
|
|
331
|
+
hint
|
|
332
|
+
FROM hints
|
|
333
|
+
WHERE id IN ({','.join('?' * len(rows))})
|
|
334
|
+
""",
|
|
335
|
+
[id_tuple[0] for id_tuple in rows],
|
|
336
|
+
)
|
|
337
|
+
conn.commit()
|
|
338
|
+
end_time = monotonic()
|
|
339
|
+
rate = parameter_limit / (end_time - start_time)
|
|
340
|
+
start_time = end_time
|
|
341
|
+
hints_count += len(rows)
|
|
342
|
+
print(f"\r{hints_count // 1000:10d}k hints {rate:0.1f} hints/s ", end="")
|
|
343
|
+
sys.stdout.flush()
|
|
344
|
+
range_start += parameter_limit
|
|
345
|
+
end_time = monotonic()
|
|
346
|
+
print(
|
|
347
|
+
"\r-- [3/4] Converting hints SUCCEEDED in "
|
|
348
|
+
f"{end_time - hint_start_time:.2f} seconds "
|
|
349
|
+
)
|
|
350
|
+
print("-- [3/4] Creating hints hint_index index")
|
|
351
|
+
hint_index_start_time = monotonic()
|
|
352
|
+
conn.execute("CREATE INDEX out_db.hint_index on hints(hint)")
|
|
353
|
+
conn.commit()
|
|
354
|
+
end_time = monotonic()
|
|
355
|
+
print(
|
|
356
|
+
"\r-- [3/4] Creating hints hint_index index SUCCEEDED in "
|
|
357
|
+
f"{end_time - hint_index_start_time:.2f} seconds "
|
|
358
|
+
)
|
|
359
|
+
print("-- [4/4] Converting coin_record")
|
|
360
|
+
conn.execute(
|
|
361
|
+
"""
|
|
362
|
+
CREATE TABLE out_db.coin_record(
|
|
363
|
+
coin_name blob PRIMARY KEY,
|
|
364
|
+
confirmed_index bigint,
|
|
365
|
+
spent_index bigint,
|
|
366
|
+
coinbase int,
|
|
367
|
+
puzzle_hash blob,
|
|
368
|
+
coin_parent blob,
|
|
369
|
+
amount blob,
|
|
370
|
+
timestamp bigint
|
|
371
|
+
)
|
|
372
|
+
"""
|
|
373
|
+
)
|
|
374
|
+
conn.commit()
|
|
375
|
+
start_time = monotonic()
|
|
376
|
+
coin_start_time = start_time
|
|
377
|
+
coins_count = 0
|
|
378
|
+
rate = 1.0
|
|
379
|
+
print("-- [4/4] Creating temp table (slow, patience)", end="\r")
|
|
380
|
+
conn.execute(
|
|
381
|
+
"""
|
|
382
|
+
CREATE TABLE temp.coin_record AS
|
|
383
|
+
SELECT
|
|
384
|
+
unhex(coin_name),
|
|
385
|
+
confirmed_index,
|
|
386
|
+
CASE WHEN spent_index <= ? THEN spent_index ELSE 0 END AS spent_index,
|
|
387
|
+
coinbase,
|
|
388
|
+
unhex(puzzle_hash),
|
|
389
|
+
unhex(coin_parent),
|
|
390
|
+
amount,
|
|
391
|
+
timestamp
|
|
392
|
+
FROM coin_record
|
|
393
|
+
WHERE confirmed_index <= ?
|
|
394
|
+
ORDER BY unhex(coin_name)
|
|
395
|
+
""",
|
|
396
|
+
(peak_height, peak_height),
|
|
397
|
+
)
|
|
398
|
+
with closing(conn.execute("SELECT * FROM temp.coin_record")) as cursor:
|
|
399
|
+
while True:
|
|
400
|
+
rows = cursor.fetchmany(BATCH_SIZE)
|
|
401
|
+
if len(rows) == 0:
|
|
402
|
+
break
|
|
403
|
+
conn.executemany("INSERT INTO out_db.coin_record VALUES (?, ?, ?, ?, ?, ?, ?, ?)", rows)
|
|
404
|
+
conn.commit()
|
|
405
|
+
end_time = monotonic()
|
|
406
|
+
rate = len(rows) / (end_time - start_time)
|
|
407
|
+
start_time = end_time
|
|
408
|
+
coins_count += len(rows)
|
|
409
|
+
print(f"\r{coins_count // 1000:10d}k coins {rate:0.1f} coins/s ", end="")
|
|
410
|
+
sys.stdout.flush()
|
|
411
|
+
end_time = monotonic()
|
|
412
|
+
print(
|
|
413
|
+
"\r-- [4/4] Converting coin_record SUCCEEDED in "
|
|
414
|
+
f"{end_time - coin_start_time:.2f} seconds "
|
|
415
|
+
)
|
|
416
|
+
print("-- [4/4] Creating coin_record coin_confirmed_index index")
|
|
417
|
+
coin_confirmed_index_start_time = monotonic()
|
|
418
|
+
conn.execute("CREATE INDEX out_db.coin_confirmed_index ON coin_record(confirmed_index)")
|
|
419
|
+
conn.commit()
|
|
420
|
+
end_time = monotonic()
|
|
421
|
+
print(
|
|
422
|
+
"\r-- [4/4] Creating coin_record coin_confirmed_index index SUCCEEDED in "
|
|
423
|
+
f"{end_time - coin_confirmed_index_start_time:.2f} seconds "
|
|
424
|
+
)
|
|
425
|
+
print("-- [4/4] Creating coin_record coin_spent_index index")
|
|
426
|
+
coin_spent_index_start_time = monotonic()
|
|
427
|
+
conn.execute("CREATE INDEX out_db.coin_spent_index ON coin_record(spent_index)")
|
|
428
|
+
conn.commit()
|
|
429
|
+
end_time = monotonic()
|
|
430
|
+
print(
|
|
431
|
+
"\r-- [4/4] Creating coin_record coin_spent_index index SUCCEEDED in "
|
|
432
|
+
f"{end_time - coin_spent_index_start_time:.2f} seconds "
|
|
433
|
+
)
|
|
434
|
+
print("-- [4/4] Creating coin_record coin_puzzle_hash index")
|
|
435
|
+
coin_puzzle_hash_index_start_time = monotonic()
|
|
436
|
+
conn.execute("CREATE INDEX out_db.coin_puzzle_hash ON coin_record(puzzle_hash)")
|
|
437
|
+
conn.commit()
|
|
438
|
+
end_time = monotonic()
|
|
439
|
+
print(
|
|
440
|
+
"\r-- [4/4] Creating coin_record coin_puzzle_hash index SUCCEEDED in "
|
|
441
|
+
f"{end_time - coin_puzzle_hash_index_start_time:.2f} seconds "
|
|
442
|
+
)
|
|
443
|
+
print("-- [4/4] Creating coin_record coin_parent_index index")
|
|
444
|
+
coin_parent_index_start_time = monotonic()
|
|
445
|
+
conn.execute("CREATE INDEX out_db.coin_parent_index ON coin_record(coin_parent)")
|
|
446
|
+
conn.commit()
|
|
447
|
+
end_time = monotonic()
|
|
448
|
+
print(
|
|
449
|
+
"\r-- [4/4] Creating coin_record coin_parent_index index SUCCEEDED in "
|
|
450
|
+
f"{end_time - coin_parent_index_start_time:.2f} seconds "
|
|
451
|
+
)
|
|
452
|
+
conn.execute("DETACH DATABASE out_db")
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any, Optional
|
|
5
|
+
|
|
6
|
+
from chia.consensus.block_record import BlockRecord
|
|
7
|
+
from chia.consensus.default_constants import DEFAULT_CONSTANTS
|
|
8
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
9
|
+
from chia.types.full_block import FullBlock
|
|
10
|
+
from chia.util.config import load_config
|
|
11
|
+
from chia.util.path import path_from_root
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def db_validate_func(
|
|
15
|
+
root_path: Path,
|
|
16
|
+
in_db_path: Optional[Path] = None,
|
|
17
|
+
*,
|
|
18
|
+
validate_blocks: bool,
|
|
19
|
+
) -> None:
|
|
20
|
+
if in_db_path is None:
|
|
21
|
+
config: dict[str, Any] = load_config(root_path, "config.yaml")["full_node"]
|
|
22
|
+
selected_network: str = config["selected_network"]
|
|
23
|
+
db_pattern: str = config["database_path"]
|
|
24
|
+
db_path_replaced: str = db_pattern.replace("CHALLENGE", selected_network)
|
|
25
|
+
in_db_path = path_from_root(root_path, db_path_replaced)
|
|
26
|
+
|
|
27
|
+
validate_v2(in_db_path, validate_blocks=validate_blocks)
|
|
28
|
+
|
|
29
|
+
print(f"\n\nDATABASE IS VALID: {in_db_path}\n")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def validate_v2(in_path: Path, *, validate_blocks: bool) -> None:
|
|
33
|
+
import sqlite3
|
|
34
|
+
from contextlib import closing
|
|
35
|
+
|
|
36
|
+
import zstd
|
|
37
|
+
|
|
38
|
+
if not in_path.exists():
|
|
39
|
+
print(f"input file doesn't exist. {in_path}")
|
|
40
|
+
raise RuntimeError(f"can't find {in_path}")
|
|
41
|
+
|
|
42
|
+
print(f"opening file for reading: {in_path}")
|
|
43
|
+
with closing(sqlite3.connect(in_path)) as in_db:
|
|
44
|
+
# read the database version
|
|
45
|
+
try:
|
|
46
|
+
with closing(in_db.execute("SELECT * FROM database_version")) as cursor:
|
|
47
|
+
row = cursor.fetchone()
|
|
48
|
+
if row is None or row == []:
|
|
49
|
+
raise RuntimeError("Database is missing version field")
|
|
50
|
+
if row[0] != 2:
|
|
51
|
+
raise RuntimeError(f"Database has the wrong version ({row[0]} expected 2)")
|
|
52
|
+
except sqlite3.OperationalError:
|
|
53
|
+
raise RuntimeError("Database is missing version table")
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
with closing(in_db.execute("SELECT hash FROM current_peak WHERE key = 0")) as cursor:
|
|
57
|
+
row = cursor.fetchone()
|
|
58
|
+
if row is None or row == []:
|
|
59
|
+
raise RuntimeError("Database is missing current_peak field")
|
|
60
|
+
peak = bytes32(row[0])
|
|
61
|
+
except sqlite3.OperationalError:
|
|
62
|
+
raise RuntimeError("Database is missing current_peak table")
|
|
63
|
+
|
|
64
|
+
print(f"peak hash: {peak}")
|
|
65
|
+
|
|
66
|
+
with closing(in_db.execute("SELECT height FROM full_blocks WHERE header_hash = ?", (peak,))) as cursor:
|
|
67
|
+
peak_row = cursor.fetchone()
|
|
68
|
+
if peak_row is None or peak_row == []:
|
|
69
|
+
raise RuntimeError("Database is missing the peak block")
|
|
70
|
+
peak_height = peak_row[0]
|
|
71
|
+
|
|
72
|
+
print(f"peak height: {peak_height}")
|
|
73
|
+
|
|
74
|
+
print("traversing the full chain")
|
|
75
|
+
|
|
76
|
+
current_height = peak_height
|
|
77
|
+
# we're looking for a block with this hash
|
|
78
|
+
expect_hash = peak
|
|
79
|
+
# once we find it, we know what the next block to look for is, which
|
|
80
|
+
# this is set to
|
|
81
|
+
next_hash = None
|
|
82
|
+
|
|
83
|
+
num_orphans = 0
|
|
84
|
+
height_to_hash = bytearray(peak_height * 32)
|
|
85
|
+
|
|
86
|
+
with closing(
|
|
87
|
+
in_db.execute(
|
|
88
|
+
f"SELECT header_hash, prev_hash, height, in_main_chain"
|
|
89
|
+
f"{', block, block_record' if validate_blocks else ''} "
|
|
90
|
+
"FROM full_blocks ORDER BY height DESC"
|
|
91
|
+
)
|
|
92
|
+
) as cursor:
|
|
93
|
+
for row in cursor:
|
|
94
|
+
hh = row[0]
|
|
95
|
+
prev = row[1]
|
|
96
|
+
height = row[2]
|
|
97
|
+
in_main_chain = row[3]
|
|
98
|
+
|
|
99
|
+
# if there are blocks being added to the database, just ignore
|
|
100
|
+
# the ones added since we picked the peak
|
|
101
|
+
if height > peak_height:
|
|
102
|
+
continue
|
|
103
|
+
|
|
104
|
+
if validate_blocks:
|
|
105
|
+
block = FullBlock.from_bytes(zstd.decompress(row[4]))
|
|
106
|
+
block_record = BlockRecord.from_bytes(row[5])
|
|
107
|
+
actual_header_hash = block.header_hash
|
|
108
|
+
actual_prev_hash = block.prev_header_hash
|
|
109
|
+
if actual_header_hash != hh:
|
|
110
|
+
raise RuntimeError(
|
|
111
|
+
f"Block {hh.hex()} has a blob with mismatching hash: {actual_header_hash.hex()}"
|
|
112
|
+
)
|
|
113
|
+
if block_record.header_hash != hh:
|
|
114
|
+
raise RuntimeError(
|
|
115
|
+
f"Block {hh.hex()} has a block record with mismatching "
|
|
116
|
+
f"hash: {block_record.header_hash.hex()}"
|
|
117
|
+
)
|
|
118
|
+
if block_record.total_iters != block.total_iters:
|
|
119
|
+
raise RuntimeError(
|
|
120
|
+
f"Block {hh.hex()} has a block record with mismatching total "
|
|
121
|
+
f"iters: {block_record.total_iters} expected {block.total_iters}"
|
|
122
|
+
)
|
|
123
|
+
if block_record.prev_hash != actual_prev_hash:
|
|
124
|
+
raise RuntimeError(
|
|
125
|
+
f"Block {hh.hex()} has a block record with mismatching "
|
|
126
|
+
f"prev_hash: {block_record.prev_hash} expected {actual_prev_hash.hex()}"
|
|
127
|
+
)
|
|
128
|
+
if block.height != height:
|
|
129
|
+
raise RuntimeError(
|
|
130
|
+
f"Block {hh.hex()} has a mismatching height: {block.height} expected {height}"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
if height != current_height:
|
|
134
|
+
# we're moving to the next level. Make sure we found the block
|
|
135
|
+
# we were looking for at the previous level
|
|
136
|
+
if next_hash is None:
|
|
137
|
+
raise RuntimeError(
|
|
138
|
+
f"Database is missing the block with hash {expect_hash} at height {current_height}"
|
|
139
|
+
)
|
|
140
|
+
expect_hash = next_hash
|
|
141
|
+
next_hash = None
|
|
142
|
+
current_height = height
|
|
143
|
+
|
|
144
|
+
if hh == expect_hash:
|
|
145
|
+
if next_hash is not None:
|
|
146
|
+
raise RuntimeError(f"Database has multiple blocks with hash {hh.hex()}, at height {height}")
|
|
147
|
+
if not in_main_chain:
|
|
148
|
+
raise RuntimeError(
|
|
149
|
+
f"block {hh.hex()} (height: {height}) is part of the main chain, "
|
|
150
|
+
f"but in_main_chain is not set"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
if validate_blocks:
|
|
154
|
+
if actual_prev_hash != prev:
|
|
155
|
+
raise RuntimeError(
|
|
156
|
+
f"Block {hh.hex()} has a blob with mismatching "
|
|
157
|
+
f"prev-hash: {actual_prev_hash}, expected {prev}"
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
next_hash = prev
|
|
161
|
+
|
|
162
|
+
height_to_hash[height * 32 : height * 32 + 32] = hh
|
|
163
|
+
|
|
164
|
+
print(f"\r{height} orphaned blocks: {num_orphans} ", end="")
|
|
165
|
+
|
|
166
|
+
else:
|
|
167
|
+
if in_main_chain:
|
|
168
|
+
raise RuntimeError(f"block {hh.hex()} (height: {height}) is orphaned, but in_main_chain is set")
|
|
169
|
+
num_orphans += 1
|
|
170
|
+
print("")
|
|
171
|
+
|
|
172
|
+
if current_height != 0:
|
|
173
|
+
raise RuntimeError(f"Database is missing blocks below height {current_height}")
|
|
174
|
+
|
|
175
|
+
# make sure the prev_hash pointer of block height 0 is the genesis
|
|
176
|
+
# challenge
|
|
177
|
+
if next_hash != DEFAULT_CONSTANTS.AGG_SIG_ME_ADDITIONAL_DATA:
|
|
178
|
+
raise RuntimeError(
|
|
179
|
+
f"Blockchain has invalid genesis challenge {next_hash}, expected "
|
|
180
|
+
f"{DEFAULT_CONSTANTS.AGG_SIG_ME_ADDITIONAL_DATA.hex()}"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
if num_orphans > 0:
|
|
184
|
+
print(f"{num_orphans} orphaned blocks")
|
chia/cmds/dev.py
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
|
|
5
|
+
from chia.cmds.gh import gh_group
|
|
6
|
+
from chia.cmds.installers import installers_group
|
|
7
|
+
from chia.cmds.sim import sim_cmd
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@click.group("dev", help="Developer commands and tools")
|
|
11
|
+
@click.pass_context
|
|
12
|
+
def dev_cmd(ctx: click.Context) -> None:
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
dev_cmd.add_command(sim_cmd)
|
|
17
|
+
dev_cmd.add_command(installers_group)
|
|
18
|
+
dev_cmd.add_command(gh_group)
|