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,556 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import struct
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
from chia._tests.util.db_connection import DBConnection
|
|
11
|
+
from chia.full_node.block_height_map import BlockHeightMap, SesCache
|
|
12
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
13
|
+
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
14
|
+
from chia.util.db_wrapper import DBWrapper2
|
|
15
|
+
from chia.util.files import write_file_async
|
|
16
|
+
from chia.util.ints import uint8, uint32
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def gen_block_hash(height: int) -> bytes32:
|
|
20
|
+
return bytes32(struct.pack(">I", height + 1) * (32 // 4))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def gen_ses(height: int) -> SubEpochSummary:
|
|
24
|
+
prev_ses = gen_block_hash(height + 0xFA0000)
|
|
25
|
+
reward_chain_hash = gen_block_hash(height + 0xFC0000)
|
|
26
|
+
return SubEpochSummary(prev_ses, reward_chain_hash, uint8(0), None, None)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def new_block(
|
|
30
|
+
db: DBWrapper2, block_hash: bytes32, parent: bytes32, height: int, is_peak: bool, ses: Optional[SubEpochSummary]
|
|
31
|
+
) -> None:
|
|
32
|
+
async with db.writer_maybe_transaction() as conn:
|
|
33
|
+
cursor = await conn.execute(
|
|
34
|
+
"INSERT INTO full_blocks VALUES(?, ?, ?, ?, ?)",
|
|
35
|
+
(
|
|
36
|
+
block_hash,
|
|
37
|
+
parent,
|
|
38
|
+
height,
|
|
39
|
+
True, # in_main_chain
|
|
40
|
+
# sub epoch summary
|
|
41
|
+
None if ses is None else bytes(ses),
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
await cursor.close()
|
|
45
|
+
if is_peak:
|
|
46
|
+
cursor = await conn.execute("INSERT OR REPLACE INTO current_peak VALUES(?, ?)", (0, block_hash))
|
|
47
|
+
await cursor.close()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def setup_db(db: DBWrapper2) -> None:
|
|
51
|
+
async with db.writer_maybe_transaction() as conn:
|
|
52
|
+
await conn.execute(
|
|
53
|
+
"CREATE TABLE IF NOT EXISTS full_blocks("
|
|
54
|
+
"header_hash blob PRIMARY KEY,"
|
|
55
|
+
"prev_hash blob,"
|
|
56
|
+
"height bigint,"
|
|
57
|
+
"in_main_chain tinyint,"
|
|
58
|
+
"sub_epoch_summary blob)"
|
|
59
|
+
)
|
|
60
|
+
await conn.execute("CREATE TABLE IF NOT EXISTS current_peak(key int PRIMARY KEY, hash blob)")
|
|
61
|
+
|
|
62
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS height on full_blocks(height)")
|
|
63
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS hh on full_blocks(header_hash)")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# if chain_id != 0, the last block in the chain won't be considered the peak,
|
|
67
|
+
# and the chain_id will be mixed in to the hashes, to form a separate chain at
|
|
68
|
+
# the same heights as the main chain
|
|
69
|
+
async def setup_chain(
|
|
70
|
+
db: DBWrapper2, length: int, *, chain_id: int = 0, ses_every: Optional[int] = None, start_height: int = 0
|
|
71
|
+
) -> None:
|
|
72
|
+
height = start_height
|
|
73
|
+
peak_hash = gen_block_hash(height + chain_id * 65536)
|
|
74
|
+
parent_hash = bytes32.zeros
|
|
75
|
+
while height < length:
|
|
76
|
+
ses = None
|
|
77
|
+
if ses_every is not None and height % ses_every == 0:
|
|
78
|
+
ses = gen_ses(height)
|
|
79
|
+
|
|
80
|
+
await new_block(db, peak_hash, parent_hash, height, False, ses)
|
|
81
|
+
height += 1
|
|
82
|
+
parent_hash = peak_hash
|
|
83
|
+
peak_hash = gen_block_hash(height + chain_id * 65536)
|
|
84
|
+
|
|
85
|
+
# we only set is_peak=1 for chain_id 0
|
|
86
|
+
if ses_every is not None and height % ses_every == 0:
|
|
87
|
+
ses = gen_ses(height)
|
|
88
|
+
await new_block(db, peak_hash, parent_hash, height, chain_id == 0, ses)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class TestBlockHeightMap:
|
|
92
|
+
@pytest.mark.anyio
|
|
93
|
+
async def test_height_to_hash(self, tmp_dir: Path, db_version: int) -> None:
|
|
94
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
95
|
+
await setup_db(db_wrapper)
|
|
96
|
+
await setup_chain(db_wrapper, 10)
|
|
97
|
+
|
|
98
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
99
|
+
|
|
100
|
+
assert not height_map.contains_height(uint32(11))
|
|
101
|
+
for height in reversed(range(10)):
|
|
102
|
+
assert height_map.contains_height(uint32(height))
|
|
103
|
+
|
|
104
|
+
for height in reversed(range(10)):
|
|
105
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
106
|
+
|
|
107
|
+
@pytest.mark.anyio
|
|
108
|
+
async def test_height_to_hash_long_chain(self, tmp_dir: Path, db_version: int) -> None:
|
|
109
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
110
|
+
await setup_db(db_wrapper)
|
|
111
|
+
await setup_chain(db_wrapper, 10000)
|
|
112
|
+
|
|
113
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
114
|
+
|
|
115
|
+
for height in reversed(range(1000)):
|
|
116
|
+
assert height_map.contains_height(uint32(height))
|
|
117
|
+
|
|
118
|
+
for height in reversed(range(10000)):
|
|
119
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
120
|
+
|
|
121
|
+
@pytest.mark.parametrize("ses_every", [20, 1])
|
|
122
|
+
@pytest.mark.anyio
|
|
123
|
+
async def test_save_restore(self, ses_every: int, tmp_dir: Path, db_version: int) -> None:
|
|
124
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
125
|
+
await setup_db(db_wrapper)
|
|
126
|
+
await setup_chain(db_wrapper, 10000, ses_every=ses_every)
|
|
127
|
+
|
|
128
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
129
|
+
|
|
130
|
+
for height in reversed(range(10000)):
|
|
131
|
+
assert height_map.contains_height(uint32(height))
|
|
132
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
133
|
+
if (height % ses_every) == 0:
|
|
134
|
+
assert height_map.get_ses(uint32(height)) == gen_ses(height)
|
|
135
|
+
else:
|
|
136
|
+
with pytest.raises(KeyError) as _:
|
|
137
|
+
height_map.get_ses(uint32(height))
|
|
138
|
+
|
|
139
|
+
await height_map.maybe_flush()
|
|
140
|
+
|
|
141
|
+
del height_map
|
|
142
|
+
|
|
143
|
+
# To ensure we're actually loading from cache, and not the DB, clear
|
|
144
|
+
# the table (but we still need the peak). We need at least 20 blocks
|
|
145
|
+
# in the DB since we keep loading until we find a match of both hash
|
|
146
|
+
# and sub epoch summary. In this test we have a sub epoch summary
|
|
147
|
+
# every 20 blocks, so we generate the 30 last blocks only
|
|
148
|
+
async with db_wrapper.writer_maybe_transaction() as conn:
|
|
149
|
+
await conn.execute("DROP TABLE full_blocks")
|
|
150
|
+
await setup_db(db_wrapper)
|
|
151
|
+
await setup_chain(db_wrapper, 10000, ses_every=ses_every, start_height=9970)
|
|
152
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
153
|
+
|
|
154
|
+
for height in reversed(range(10000)):
|
|
155
|
+
assert height_map.contains_height(uint32(height))
|
|
156
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
157
|
+
if (height % ses_every) == 0:
|
|
158
|
+
assert height_map.get_ses(uint32(height)) == gen_ses(height)
|
|
159
|
+
else:
|
|
160
|
+
with pytest.raises(KeyError) as _:
|
|
161
|
+
height_map.get_ses(uint32(height))
|
|
162
|
+
|
|
163
|
+
@pytest.mark.anyio
|
|
164
|
+
async def test_restore_entire_chain(self, tmp_dir: Path, db_version: int) -> None:
|
|
165
|
+
# this is a test where the height-to-hash and height-to-ses caches are
|
|
166
|
+
# entirely unrelated to the database. Make sure they can both be fully
|
|
167
|
+
# replaced
|
|
168
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
169
|
+
heights = bytearray(900 * 32)
|
|
170
|
+
for i in range(900):
|
|
171
|
+
idx = i * 32
|
|
172
|
+
heights[idx : idx + 32] = bytes([i % 256] * 32)
|
|
173
|
+
|
|
174
|
+
await write_file_async(tmp_dir / "height-to-hash", heights)
|
|
175
|
+
|
|
176
|
+
ses_cache = []
|
|
177
|
+
for i in range(0, 900, 19):
|
|
178
|
+
ses_cache.append((uint32(i), bytes(gen_ses(i + 9999))))
|
|
179
|
+
|
|
180
|
+
await write_file_async(tmp_dir / "sub-epoch-summaries", bytes(SesCache(ses_cache)))
|
|
181
|
+
|
|
182
|
+
await setup_db(db_wrapper)
|
|
183
|
+
await setup_chain(db_wrapper, 10000, ses_every=20)
|
|
184
|
+
|
|
185
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
186
|
+
|
|
187
|
+
for height in reversed(range(10000)):
|
|
188
|
+
assert height_map.contains_height(uint32(height))
|
|
189
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
190
|
+
if (height % 20) == 0:
|
|
191
|
+
assert height_map.get_ses(uint32(height)) == gen_ses(height)
|
|
192
|
+
else:
|
|
193
|
+
with pytest.raises(KeyError) as _:
|
|
194
|
+
height_map.get_ses(uint32(height))
|
|
195
|
+
|
|
196
|
+
@pytest.mark.anyio
|
|
197
|
+
async def test_restore_ses_only(self, tmp_dir: Path, db_version: int) -> None:
|
|
198
|
+
# this is a test where the height-to-hash is complete and correct but
|
|
199
|
+
# sub epoch summaries are missing. We need to be able to restore them in
|
|
200
|
+
# this case.
|
|
201
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
202
|
+
await setup_db(db_wrapper)
|
|
203
|
+
await setup_chain(db_wrapper, 2000, ses_every=20)
|
|
204
|
+
|
|
205
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
206
|
+
await height_map.maybe_flush()
|
|
207
|
+
del height_map
|
|
208
|
+
|
|
209
|
+
# corrupt the sub epoch cache
|
|
210
|
+
ses_cache = []
|
|
211
|
+
for i in range(0, 2000, 19):
|
|
212
|
+
ses_cache.append((uint32(i), bytes(gen_ses(i + 9999))))
|
|
213
|
+
|
|
214
|
+
await write_file_async(tmp_dir / "sub-epoch-summaries", bytes(SesCache(ses_cache)))
|
|
215
|
+
|
|
216
|
+
# the test starts here
|
|
217
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
218
|
+
|
|
219
|
+
for height in reversed(range(2000)):
|
|
220
|
+
assert height_map.contains_height(uint32(height))
|
|
221
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
222
|
+
if (height % 20) == 0:
|
|
223
|
+
assert height_map.get_ses(uint32(height)) == gen_ses(height)
|
|
224
|
+
else:
|
|
225
|
+
with pytest.raises(KeyError) as _:
|
|
226
|
+
height_map.get_ses(uint32(height))
|
|
227
|
+
|
|
228
|
+
@pytest.mark.anyio
|
|
229
|
+
async def test_restore_extend(self, tmp_dir: Path, db_version: int) -> None:
|
|
230
|
+
# test the case where the cache has fewer blocks than the DB, and that
|
|
231
|
+
# we correctly load all the missing blocks from the DB to update the
|
|
232
|
+
# cache
|
|
233
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
234
|
+
await setup_db(db_wrapper)
|
|
235
|
+
await setup_chain(db_wrapper, 2000, ses_every=20)
|
|
236
|
+
|
|
237
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
238
|
+
|
|
239
|
+
for height in reversed(range(2000)):
|
|
240
|
+
assert height_map.contains_height(uint32(height))
|
|
241
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
242
|
+
if (height % 20) == 0:
|
|
243
|
+
assert height_map.get_ses(uint32(height)) == gen_ses(height)
|
|
244
|
+
else:
|
|
245
|
+
with pytest.raises(KeyError) as _:
|
|
246
|
+
height_map.get_ses(uint32(height))
|
|
247
|
+
|
|
248
|
+
await height_map.maybe_flush()
|
|
249
|
+
|
|
250
|
+
del height_map
|
|
251
|
+
|
|
252
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
253
|
+
await setup_db(db_wrapper)
|
|
254
|
+
# add 2000 blocks to the chain
|
|
255
|
+
await setup_chain(db_wrapper, 4000, ses_every=20)
|
|
256
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
257
|
+
|
|
258
|
+
# now make sure we have the complete chain, height 0 -> 4000
|
|
259
|
+
for height in reversed(range(4000)):
|
|
260
|
+
assert height_map.contains_height(uint32(height))
|
|
261
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
262
|
+
if (height % 20) == 0:
|
|
263
|
+
assert height_map.get_ses(uint32(height)) == gen_ses(height)
|
|
264
|
+
else:
|
|
265
|
+
with pytest.raises(KeyError) as _:
|
|
266
|
+
height_map.get_ses(uint32(height))
|
|
267
|
+
|
|
268
|
+
@pytest.mark.anyio
|
|
269
|
+
async def test_height_to_hash_with_orphans(self, tmp_dir: Path, db_version: int) -> None:
|
|
270
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
271
|
+
await setup_db(db_wrapper)
|
|
272
|
+
await setup_chain(db_wrapper, 10)
|
|
273
|
+
|
|
274
|
+
# set up two separate chains, but without the peak
|
|
275
|
+
await setup_chain(db_wrapper, 10, chain_id=1)
|
|
276
|
+
await setup_chain(db_wrapper, 10, chain_id=2)
|
|
277
|
+
|
|
278
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
279
|
+
|
|
280
|
+
for height in range(10):
|
|
281
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
282
|
+
|
|
283
|
+
@pytest.mark.anyio
|
|
284
|
+
async def test_height_to_hash_update(self, tmp_dir: Path, db_version: int) -> None:
|
|
285
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
286
|
+
await setup_db(db_wrapper)
|
|
287
|
+
await setup_chain(db_wrapper, 10)
|
|
288
|
+
|
|
289
|
+
# orphan blocks
|
|
290
|
+
await setup_chain(db_wrapper, 10, chain_id=1)
|
|
291
|
+
|
|
292
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
293
|
+
|
|
294
|
+
for height in range(10):
|
|
295
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
296
|
+
|
|
297
|
+
height_map.update_height(uint32(10), gen_block_hash(100), None)
|
|
298
|
+
|
|
299
|
+
for height in range(9):
|
|
300
|
+
assert height_map.get_hash(uint32(height)) == gen_block_hash(height)
|
|
301
|
+
|
|
302
|
+
assert height_map.get_hash(uint32(10)) == gen_block_hash(100)
|
|
303
|
+
|
|
304
|
+
@pytest.mark.anyio
|
|
305
|
+
async def test_update_ses(self, tmp_dir: Path, db_version: int) -> None:
|
|
306
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
307
|
+
await setup_db(db_wrapper)
|
|
308
|
+
await setup_chain(db_wrapper, 10)
|
|
309
|
+
|
|
310
|
+
# orphan blocks
|
|
311
|
+
await setup_chain(db_wrapper, 10, chain_id=1)
|
|
312
|
+
|
|
313
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
314
|
+
|
|
315
|
+
with pytest.raises(KeyError) as _:
|
|
316
|
+
height_map.get_ses(uint32(10))
|
|
317
|
+
|
|
318
|
+
height_map.update_height(uint32(10), gen_block_hash(10), gen_ses(10))
|
|
319
|
+
|
|
320
|
+
assert height_map.get_ses(uint32(10)) == gen_ses(10)
|
|
321
|
+
assert height_map.get_hash(uint32(10)) == gen_block_hash(10)
|
|
322
|
+
|
|
323
|
+
@pytest.mark.anyio
|
|
324
|
+
async def test_height_to_ses(self, tmp_dir: Path, db_version: int) -> None:
|
|
325
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
326
|
+
await setup_db(db_wrapper)
|
|
327
|
+
await setup_chain(db_wrapper, 10, ses_every=2)
|
|
328
|
+
|
|
329
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
330
|
+
|
|
331
|
+
assert height_map.get_ses(uint32(0)) == gen_ses(0)
|
|
332
|
+
assert height_map.get_ses(uint32(2)) == gen_ses(2)
|
|
333
|
+
assert height_map.get_ses(uint32(4)) == gen_ses(4)
|
|
334
|
+
assert height_map.get_ses(uint32(6)) == gen_ses(6)
|
|
335
|
+
assert height_map.get_ses(uint32(8)) == gen_ses(8)
|
|
336
|
+
|
|
337
|
+
with pytest.raises(KeyError) as _:
|
|
338
|
+
height_map.get_ses(uint32(1))
|
|
339
|
+
with pytest.raises(KeyError) as _:
|
|
340
|
+
height_map.get_ses(uint32(3))
|
|
341
|
+
with pytest.raises(KeyError) as _:
|
|
342
|
+
height_map.get_ses(uint32(5))
|
|
343
|
+
with pytest.raises(KeyError) as _:
|
|
344
|
+
height_map.get_ses(uint32(7))
|
|
345
|
+
with pytest.raises(KeyError) as _:
|
|
346
|
+
height_map.get_ses(uint32(9))
|
|
347
|
+
|
|
348
|
+
@pytest.mark.anyio
|
|
349
|
+
async def test_rollback(self, tmp_dir: Path, db_version: int) -> None:
|
|
350
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
351
|
+
await setup_db(db_wrapper)
|
|
352
|
+
await setup_chain(db_wrapper, 10, ses_every=2)
|
|
353
|
+
|
|
354
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
355
|
+
|
|
356
|
+
assert height_map.get_ses(uint32(0)) == gen_ses(0)
|
|
357
|
+
assert height_map.get_ses(uint32(2)) == gen_ses(2)
|
|
358
|
+
assert height_map.get_ses(uint32(4)) == gen_ses(4)
|
|
359
|
+
assert height_map.get_ses(uint32(6)) == gen_ses(6)
|
|
360
|
+
assert height_map.get_ses(uint32(8)) == gen_ses(8)
|
|
361
|
+
|
|
362
|
+
assert height_map.get_hash(uint32(5)) == gen_block_hash(5)
|
|
363
|
+
|
|
364
|
+
height_map.rollback(5)
|
|
365
|
+
assert height_map.contains_height(uint32(0))
|
|
366
|
+
assert height_map.contains_height(uint32(1))
|
|
367
|
+
assert height_map.contains_height(uint32(2))
|
|
368
|
+
assert height_map.contains_height(uint32(3))
|
|
369
|
+
assert height_map.contains_height(uint32(4))
|
|
370
|
+
assert height_map.contains_height(uint32(5))
|
|
371
|
+
assert not height_map.contains_height(uint32(6))
|
|
372
|
+
assert not height_map.contains_height(uint32(7))
|
|
373
|
+
assert not height_map.contains_height(uint32(8))
|
|
374
|
+
assert height_map.get_hash(uint32(5)) == gen_block_hash(5)
|
|
375
|
+
|
|
376
|
+
assert height_map.get_ses(uint32(0)) == gen_ses(0)
|
|
377
|
+
assert height_map.get_ses(uint32(2)) == gen_ses(2)
|
|
378
|
+
assert height_map.get_ses(uint32(4)) == gen_ses(4)
|
|
379
|
+
with pytest.raises(KeyError) as _:
|
|
380
|
+
height_map.get_ses(uint32(6))
|
|
381
|
+
with pytest.raises(KeyError) as _:
|
|
382
|
+
height_map.get_ses(uint32(8))
|
|
383
|
+
|
|
384
|
+
@pytest.mark.anyio
|
|
385
|
+
async def test_rollback2(self, tmp_dir: Path, db_version: int) -> None:
|
|
386
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
387
|
+
await setup_db(db_wrapper)
|
|
388
|
+
await setup_chain(db_wrapper, 10, ses_every=2)
|
|
389
|
+
|
|
390
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
391
|
+
|
|
392
|
+
assert height_map.get_ses(uint32(0)) == gen_ses(0)
|
|
393
|
+
assert height_map.get_ses(uint32(2)) == gen_ses(2)
|
|
394
|
+
assert height_map.get_ses(uint32(4)) == gen_ses(4)
|
|
395
|
+
assert height_map.get_ses(uint32(6)) == gen_ses(6)
|
|
396
|
+
assert height_map.get_ses(uint32(8)) == gen_ses(8)
|
|
397
|
+
|
|
398
|
+
assert height_map.get_hash(uint32(6)) == gen_block_hash(6)
|
|
399
|
+
|
|
400
|
+
height_map.rollback(6)
|
|
401
|
+
assert height_map.contains_height(uint32(6))
|
|
402
|
+
assert not height_map.contains_height(uint32(7))
|
|
403
|
+
|
|
404
|
+
assert height_map.get_hash(uint32(6)) == gen_block_hash(6)
|
|
405
|
+
with pytest.raises(AssertionError) as _:
|
|
406
|
+
height_map.get_hash(uint32(7))
|
|
407
|
+
|
|
408
|
+
assert height_map.get_ses(uint32(0)) == gen_ses(0)
|
|
409
|
+
assert height_map.get_ses(uint32(2)) == gen_ses(2)
|
|
410
|
+
assert height_map.get_ses(uint32(4)) == gen_ses(4)
|
|
411
|
+
assert height_map.get_ses(uint32(6)) == gen_ses(6)
|
|
412
|
+
with pytest.raises(KeyError) as _:
|
|
413
|
+
height_map.get_ses(uint32(8))
|
|
414
|
+
|
|
415
|
+
@pytest.mark.anyio
|
|
416
|
+
async def test_cache_file_nothing_to_write(self, tmp_dir: Path, db_version: int) -> None:
|
|
417
|
+
# This is a test where the height-to-hash data is entirely used from
|
|
418
|
+
# the cache file and there is nothing to write in that file as a result.
|
|
419
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
420
|
+
await setup_db(db_wrapper)
|
|
421
|
+
await setup_chain(db_wrapper, 10000, ses_every=20)
|
|
422
|
+
await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
423
|
+
# To ensure we're actually loading from cache, and not the DB, clear
|
|
424
|
+
# the table.
|
|
425
|
+
async with db_wrapper.writer_maybe_transaction() as conn:
|
|
426
|
+
await conn.execute("DELETE FROM full_blocks")
|
|
427
|
+
await setup_chain(db_wrapper, 10000, ses_every=20, start_height=9970)
|
|
428
|
+
# At this point we should have a proper cache file
|
|
429
|
+
with open(tmp_dir / "height-to-hash", "rb") as f:
|
|
430
|
+
heights = bytearray(f.read())
|
|
431
|
+
assert len(heights) == (10000 + 1) * 32
|
|
432
|
+
await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
433
|
+
# Make sure we didn't alter the cache (nothing new to write)
|
|
434
|
+
with open(tmp_dir / "height-to-hash", "rb") as f:
|
|
435
|
+
# pytest doesn't behave very well comparing large buffers
|
|
436
|
+
# (when the test fails). Compare small portions at a time instead
|
|
437
|
+
new_heights = f.read()
|
|
438
|
+
assert len(new_heights) == len(heights)
|
|
439
|
+
for idx in range(0, len(heights), 32):
|
|
440
|
+
assert new_heights[idx : idx + 32] == heights[idx : idx + 32]
|
|
441
|
+
|
|
442
|
+
@pytest.mark.anyio
|
|
443
|
+
async def test_cache_file_replace_everything(self, tmp_dir: Path, db_version: int) -> None:
|
|
444
|
+
# This is a test where the height-to-hash is entirely unrelated to the
|
|
445
|
+
# database. Make sure it can be fully replaced
|
|
446
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
447
|
+
heights = bytearray(900 * 32)
|
|
448
|
+
for i in range(900):
|
|
449
|
+
idx = i * 32
|
|
450
|
+
heights[idx : idx + 32] = bytes([i % 256] * 32)
|
|
451
|
+
await write_file_async(tmp_dir / "height-to-hash", heights)
|
|
452
|
+
await setup_db(db_wrapper)
|
|
453
|
+
await setup_chain(db_wrapper, 10000, ses_every=20)
|
|
454
|
+
await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
455
|
+
# We replaced the whole cache at this point so all values should be different
|
|
456
|
+
with open(tmp_dir / "height-to-hash", "rb") as f:
|
|
457
|
+
new_heights = bytearray(f.read())
|
|
458
|
+
# Make sure we wrote the whole file
|
|
459
|
+
assert len(new_heights) == (10000 + 1) * 32
|
|
460
|
+
# Make sure none of the old values remain
|
|
461
|
+
for i in range(0, len(heights), 32):
|
|
462
|
+
assert new_heights[i : i + 32] != heights[i : i + 32]
|
|
463
|
+
|
|
464
|
+
@pytest.mark.anyio
|
|
465
|
+
async def test_cache_file_extend(self, tmp_dir: Path, db_version: int) -> None:
|
|
466
|
+
# Test the case where the cache has fewer blocks than the DB, and that
|
|
467
|
+
# we correctly load all the missing blocks from the DB to update the
|
|
468
|
+
# cache
|
|
469
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
470
|
+
await setup_db(db_wrapper)
|
|
471
|
+
await setup_chain(db_wrapper, 2000, ses_every=20)
|
|
472
|
+
await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
473
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
474
|
+
await setup_db(db_wrapper)
|
|
475
|
+
# Add 2000 blocks to the chain
|
|
476
|
+
await setup_chain(db_wrapper, 4000, ses_every=20)
|
|
477
|
+
# At this point we should have a proper cache with the old chain data
|
|
478
|
+
with open(tmp_dir / "height-to-hash", "rb") as f:
|
|
479
|
+
heights = f.read()
|
|
480
|
+
assert len(heights) == (2000 + 1) * 32
|
|
481
|
+
await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
482
|
+
# Make sure we properly wrote the additional data to the cache
|
|
483
|
+
with open(tmp_dir / "height-to-hash", "rb") as f:
|
|
484
|
+
new_heights = f.read()
|
|
485
|
+
assert len(new_heights) == (4000 + 1) * 32
|
|
486
|
+
# pytest doesn't behave very well comparing large buffers
|
|
487
|
+
# (when the test fails). Compare small portions at a time instead
|
|
488
|
+
for idx in range(0, len(heights), 32):
|
|
489
|
+
assert new_heights[idx : idx + 32] == heights[idx : idx + 32]
|
|
490
|
+
|
|
491
|
+
@pytest.mark.anyio
|
|
492
|
+
async def test_cache_file_truncate(self, tmp_dir: Path, db_version: int) -> None:
|
|
493
|
+
# Test the case where the cache has more blocks than the DB, the cache
|
|
494
|
+
# file will be truncated
|
|
495
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
496
|
+
await setup_db(db_wrapper)
|
|
497
|
+
await setup_chain(db_wrapper, 2000, ses_every=20)
|
|
498
|
+
bh = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
499
|
+
await bh.maybe_flush()
|
|
500
|
+
|
|
501
|
+
# extend the cache file
|
|
502
|
+
with open(tmp_dir / "height-to-hash", "r+b") as f:
|
|
503
|
+
f.truncate(32 * 4000)
|
|
504
|
+
assert os.path.getsize(tmp_dir / "height-to-hash") == 32 * 4000
|
|
505
|
+
|
|
506
|
+
bh = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
507
|
+
await bh.maybe_flush()
|
|
508
|
+
|
|
509
|
+
with open(tmp_dir / "height-to-hash", "rb") as f:
|
|
510
|
+
new_heights = f.read()
|
|
511
|
+
assert len(new_heights) == 4000 * 32
|
|
512
|
+
# pytest doesn't behave very well comparing large buffers
|
|
513
|
+
# (when the test fails). Compare small portions at a time instead
|
|
514
|
+
for idx in range(0, 2000):
|
|
515
|
+
assert new_heights[idx * 32 : idx * 32 + 32] == gen_block_hash(idx)
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
@pytest.mark.anyio
|
|
519
|
+
async def test_unsupported_version(tmp_dir: Path) -> None:
|
|
520
|
+
with pytest.raises(RuntimeError, match="BlockHeightMap does not support database schema v1"):
|
|
521
|
+
async with DBConnection(1) as db_wrapper:
|
|
522
|
+
await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
@pytest.mark.anyio
|
|
526
|
+
async def test_empty_chain(tmp_dir: Path, db_version: int) -> None:
|
|
527
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
528
|
+
await setup_db(db_wrapper)
|
|
529
|
+
|
|
530
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
531
|
+
|
|
532
|
+
with pytest.raises(KeyError) as _:
|
|
533
|
+
height_map.get_ses(uint32(0))
|
|
534
|
+
|
|
535
|
+
with pytest.raises(AssertionError) as _:
|
|
536
|
+
height_map.get_hash(uint32(0))
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
@pytest.mark.anyio
|
|
540
|
+
async def test_peak_only_chain(tmp_dir: Path, db_version: int) -> None:
|
|
541
|
+
async with DBConnection(db_version) as db_wrapper:
|
|
542
|
+
await setup_db(db_wrapper)
|
|
543
|
+
|
|
544
|
+
async with db_wrapper.writer_maybe_transaction() as conn:
|
|
545
|
+
cursor = await conn.execute(
|
|
546
|
+
"INSERT OR REPLACE INTO current_peak VALUES(?, ?)", (0, b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
|
|
547
|
+
)
|
|
548
|
+
await cursor.close()
|
|
549
|
+
|
|
550
|
+
height_map = await BlockHeightMap.create(tmp_dir, db_wrapper)
|
|
551
|
+
|
|
552
|
+
with pytest.raises(KeyError) as _:
|
|
553
|
+
height_map.get_ses(uint32(0))
|
|
554
|
+
|
|
555
|
+
with pytest.raises(AssertionError) as _:
|
|
556
|
+
height_map.get_hash(uint32(0))
|