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,576 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
import logging
|
|
5
|
+
import sqlite3
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
import typing_extensions
|
|
9
|
+
import zstd
|
|
10
|
+
|
|
11
|
+
from chia.consensus.block_record import BlockRecord
|
|
12
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
13
|
+
from chia.types.full_block import FullBlock
|
|
14
|
+
from chia.types.weight_proof import SubEpochChallengeSegment, SubEpochSegments
|
|
15
|
+
from chia.util.db_wrapper import DBWrapper2, execute_fetchone
|
|
16
|
+
from chia.util.errors import Err
|
|
17
|
+
from chia.util.full_block_utils import GeneratorBlockInfo, block_info_from_block, generator_from_block
|
|
18
|
+
from chia.util.ints import uint32
|
|
19
|
+
from chia.util.lru_cache import LRUCache
|
|
20
|
+
|
|
21
|
+
log = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def decompress(block_bytes: bytes) -> FullBlock:
|
|
25
|
+
return FullBlock.from_bytes(zstd.decompress(block_bytes))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def compress(block: FullBlock) -> bytes:
|
|
29
|
+
ret: bytes = zstd.compress(bytes(block))
|
|
30
|
+
return ret
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def decompress_blob(block_bytes: bytes) -> bytes:
|
|
34
|
+
ret: bytes = zstd.decompress(block_bytes)
|
|
35
|
+
return ret
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@typing_extensions.final
|
|
39
|
+
@dataclasses.dataclass
|
|
40
|
+
class BlockStore:
|
|
41
|
+
block_cache: LRUCache[bytes32, FullBlock]
|
|
42
|
+
db_wrapper: DBWrapper2
|
|
43
|
+
ses_challenge_cache: LRUCache[bytes32, list[SubEpochChallengeSegment]]
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
async def create(cls, db_wrapper: DBWrapper2, *, use_cache: bool = True) -> BlockStore:
|
|
47
|
+
if db_wrapper.db_version != 2:
|
|
48
|
+
raise RuntimeError(f"BlockStore does not support database schema v{db_wrapper.db_version}")
|
|
49
|
+
|
|
50
|
+
if use_cache:
|
|
51
|
+
self = cls(LRUCache(1000), db_wrapper, LRUCache(50))
|
|
52
|
+
else:
|
|
53
|
+
self = cls(LRUCache(0), db_wrapper, LRUCache(0))
|
|
54
|
+
|
|
55
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
56
|
+
log.info("DB: Creating block store tables and indexes.")
|
|
57
|
+
# TODO: most data in block is duplicated in block_record. The only
|
|
58
|
+
# reason for this is that our parsing of a FullBlock is so slow,
|
|
59
|
+
# it's faster to store duplicate data to parse less when we just
|
|
60
|
+
# need the BlockRecord. Once we fix the parsing (and data structure)
|
|
61
|
+
# of FullBlock, this can use less space
|
|
62
|
+
await conn.execute(
|
|
63
|
+
"CREATE TABLE IF NOT EXISTS full_blocks("
|
|
64
|
+
"header_hash blob PRIMARY KEY,"
|
|
65
|
+
"prev_hash blob,"
|
|
66
|
+
"height bigint,"
|
|
67
|
+
"sub_epoch_summary blob,"
|
|
68
|
+
"is_fully_compactified tinyint,"
|
|
69
|
+
"in_main_chain tinyint,"
|
|
70
|
+
"block blob,"
|
|
71
|
+
"block_record blob)"
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# This is a single-row table containing the hash of the current
|
|
75
|
+
# peak. The "key" field is there to make update statements simple
|
|
76
|
+
await conn.execute("CREATE TABLE IF NOT EXISTS current_peak(key int PRIMARY KEY, hash blob)")
|
|
77
|
+
|
|
78
|
+
# If any of these indices are altered, they should also be altered
|
|
79
|
+
# in the chia/cmds/db_upgrade.py file
|
|
80
|
+
log.info("DB: Creating index height")
|
|
81
|
+
await conn.execute("CREATE INDEX IF NOT EXISTS height on full_blocks(height)")
|
|
82
|
+
|
|
83
|
+
# Sub epoch segments for weight proofs
|
|
84
|
+
await conn.execute(
|
|
85
|
+
"CREATE TABLE IF NOT EXISTS sub_epoch_segments_v3("
|
|
86
|
+
"ses_block_hash blob PRIMARY KEY,"
|
|
87
|
+
"challenge_segments blob)"
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# If any of these indices are altered, they should also be altered
|
|
91
|
+
# in the chia/cmds/db_upgrade.py file
|
|
92
|
+
log.info("DB: Creating index is_fully_compactified")
|
|
93
|
+
await conn.execute(
|
|
94
|
+
"CREATE INDEX IF NOT EXISTS is_fully_compactified ON"
|
|
95
|
+
" full_blocks(is_fully_compactified, in_main_chain) WHERE in_main_chain=1"
|
|
96
|
+
)
|
|
97
|
+
log.info("DB: Creating index main_chain")
|
|
98
|
+
await conn.execute(
|
|
99
|
+
"CREATE INDEX IF NOT EXISTS main_chain ON full_blocks(height, in_main_chain) WHERE in_main_chain=1"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
return self
|
|
103
|
+
|
|
104
|
+
async def rollback(self, height: int) -> None:
|
|
105
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
106
|
+
await conn.execute("UPDATE full_blocks SET in_main_chain=0 WHERE height>? AND in_main_chain=1", (height,))
|
|
107
|
+
|
|
108
|
+
async def set_in_chain(self, header_hashes: list[tuple[bytes32]]) -> None:
|
|
109
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
110
|
+
async with await conn.executemany(
|
|
111
|
+
"UPDATE full_blocks SET in_main_chain=1 WHERE header_hash=?", header_hashes
|
|
112
|
+
) as cursor:
|
|
113
|
+
if cursor.rowcount != len(header_hashes):
|
|
114
|
+
raise RuntimeError(f"The blockchain database is corrupt. All of {header_hashes} should exist")
|
|
115
|
+
|
|
116
|
+
async def replace_proof(self, header_hash: bytes32, block: FullBlock) -> None:
|
|
117
|
+
assert header_hash == block.header_hash
|
|
118
|
+
|
|
119
|
+
block_bytes: bytes = compress(block)
|
|
120
|
+
|
|
121
|
+
self.block_cache.put(header_hash, block)
|
|
122
|
+
|
|
123
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
124
|
+
await conn.execute(
|
|
125
|
+
"UPDATE full_blocks SET block=?,is_fully_compactified=? WHERE header_hash=?",
|
|
126
|
+
(
|
|
127
|
+
block_bytes,
|
|
128
|
+
int(block.is_fully_compactified()),
|
|
129
|
+
header_hash,
|
|
130
|
+
),
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
async def add_full_block(self, header_hash: bytes32, block: FullBlock, block_record: BlockRecord) -> None:
|
|
134
|
+
self.block_cache.put(header_hash, block)
|
|
135
|
+
|
|
136
|
+
ses: Optional[bytes] = (
|
|
137
|
+
None if block_record.sub_epoch_summary_included is None else bytes(block_record.sub_epoch_summary_included)
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
141
|
+
await conn.execute(
|
|
142
|
+
"INSERT OR IGNORE INTO full_blocks "
|
|
143
|
+
"(header_hash, "
|
|
144
|
+
"prev_hash, "
|
|
145
|
+
"height, "
|
|
146
|
+
"sub_epoch_summary, "
|
|
147
|
+
"is_fully_compactified, "
|
|
148
|
+
"in_main_chain, "
|
|
149
|
+
"block, "
|
|
150
|
+
"block_record) "
|
|
151
|
+
"VALUES(?, ?, ?, ?, ?, ?, ?, ?)",
|
|
152
|
+
(
|
|
153
|
+
header_hash,
|
|
154
|
+
block.prev_header_hash,
|
|
155
|
+
block.height,
|
|
156
|
+
ses,
|
|
157
|
+
int(block.is_fully_compactified()),
|
|
158
|
+
False, # in_main_chain
|
|
159
|
+
compress(block),
|
|
160
|
+
bytes(block_record),
|
|
161
|
+
),
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
async def persist_sub_epoch_challenge_segments(
|
|
165
|
+
self, ses_block_hash: bytes32, segments: list[SubEpochChallengeSegment]
|
|
166
|
+
) -> None:
|
|
167
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
168
|
+
await conn.execute(
|
|
169
|
+
"INSERT OR REPLACE INTO sub_epoch_segments_v3 VALUES(?, ?)",
|
|
170
|
+
(ses_block_hash, bytes(SubEpochSegments(segments))),
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
async def get_sub_epoch_challenge_segments(
|
|
174
|
+
self,
|
|
175
|
+
ses_block_hash: bytes32,
|
|
176
|
+
) -> Optional[list[SubEpochChallengeSegment]]:
|
|
177
|
+
cached: Optional[list[SubEpochChallengeSegment]] = self.ses_challenge_cache.get(ses_block_hash)
|
|
178
|
+
if cached is not None:
|
|
179
|
+
return cached
|
|
180
|
+
|
|
181
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
182
|
+
async with conn.execute(
|
|
183
|
+
"SELECT challenge_segments from sub_epoch_segments_v3 WHERE ses_block_hash=?",
|
|
184
|
+
(ses_block_hash,),
|
|
185
|
+
) as cursor:
|
|
186
|
+
row = await cursor.fetchone()
|
|
187
|
+
|
|
188
|
+
if row is not None:
|
|
189
|
+
challenge_segments: list[SubEpochChallengeSegment] = SubEpochSegments.from_bytes(row[0]).challenge_segments
|
|
190
|
+
self.ses_challenge_cache.put(ses_block_hash, challenge_segments)
|
|
191
|
+
return challenge_segments
|
|
192
|
+
return None
|
|
193
|
+
|
|
194
|
+
def rollback_cache_block(self, header_hash: bytes32) -> None:
|
|
195
|
+
try:
|
|
196
|
+
self.block_cache.remove(header_hash)
|
|
197
|
+
except KeyError:
|
|
198
|
+
# this is best effort. When rolling back, we may not have added the
|
|
199
|
+
# block to the cache yet
|
|
200
|
+
pass
|
|
201
|
+
|
|
202
|
+
async def get_full_block(self, header_hash: bytes32) -> Optional[FullBlock]:
|
|
203
|
+
cached: Optional[FullBlock] = self.block_cache.get(header_hash)
|
|
204
|
+
if cached is not None:
|
|
205
|
+
return cached
|
|
206
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
207
|
+
async with conn.execute("SELECT block from full_blocks WHERE header_hash=?", (header_hash,)) as cursor:
|
|
208
|
+
row = await cursor.fetchone()
|
|
209
|
+
if row is not None:
|
|
210
|
+
block = decompress(row[0])
|
|
211
|
+
self.block_cache.put(header_hash, block)
|
|
212
|
+
return block
|
|
213
|
+
return None
|
|
214
|
+
|
|
215
|
+
async def get_full_block_bytes(self, header_hash: bytes32) -> Optional[bytes]:
|
|
216
|
+
cached = self.block_cache.get(header_hash)
|
|
217
|
+
if cached is not None:
|
|
218
|
+
return bytes(cached)
|
|
219
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
220
|
+
async with conn.execute("SELECT block from full_blocks WHERE header_hash=?", (header_hash,)) as cursor:
|
|
221
|
+
row = await cursor.fetchone()
|
|
222
|
+
if row is not None:
|
|
223
|
+
ret: bytes = zstd.decompress(row[0])
|
|
224
|
+
return ret
|
|
225
|
+
|
|
226
|
+
return None
|
|
227
|
+
|
|
228
|
+
async def get_full_blocks_at(self, heights: list[uint32]) -> list[FullBlock]:
|
|
229
|
+
"""
|
|
230
|
+
Returns all blocks at the given heights, including orphans.
|
|
231
|
+
"""
|
|
232
|
+
if len(heights) == 0:
|
|
233
|
+
return []
|
|
234
|
+
|
|
235
|
+
formatted_str = f'SELECT block from full_blocks WHERE height in ({"?," * (len(heights) - 1)}?)'
|
|
236
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
237
|
+
async with conn.execute(formatted_str, heights) as cursor:
|
|
238
|
+
ret: list[FullBlock] = []
|
|
239
|
+
for row in await cursor.fetchall():
|
|
240
|
+
ret.append(decompress(row[0]))
|
|
241
|
+
return ret
|
|
242
|
+
|
|
243
|
+
async def get_block_info(self, header_hash: bytes32) -> Optional[GeneratorBlockInfo]:
|
|
244
|
+
cached = self.block_cache.get(header_hash)
|
|
245
|
+
if cached is not None:
|
|
246
|
+
return GeneratorBlockInfo(
|
|
247
|
+
cached.foliage.prev_block_hash, cached.transactions_generator, cached.transactions_generator_ref_list
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
formatted_str = "SELECT block, height from full_blocks WHERE header_hash=?"
|
|
251
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
252
|
+
row = await execute_fetchone(conn, formatted_str, (header_hash,))
|
|
253
|
+
if row is None:
|
|
254
|
+
return None
|
|
255
|
+
block_bytes = zstd.decompress(row[0])
|
|
256
|
+
|
|
257
|
+
try:
|
|
258
|
+
return block_info_from_block(block_bytes)
|
|
259
|
+
except Exception as e:
|
|
260
|
+
log.exception(f"cheap parser failed for block at height {row[1]}: {e}")
|
|
261
|
+
# this is defensive, on the off-chance that
|
|
262
|
+
# block_info_from_block() fails, fall back to the reliable
|
|
263
|
+
# definition of parsing a block
|
|
264
|
+
b = FullBlock.from_bytes(block_bytes)
|
|
265
|
+
return GeneratorBlockInfo(
|
|
266
|
+
b.foliage.prev_block_hash, b.transactions_generator, b.transactions_generator_ref_list
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
async def get_generator(self, header_hash: bytes32) -> Optional[bytes]:
|
|
270
|
+
cached = self.block_cache.get(header_hash)
|
|
271
|
+
if cached is not None:
|
|
272
|
+
return None if cached.transactions_generator is None else bytes(cached.transactions_generator)
|
|
273
|
+
|
|
274
|
+
formatted_str = "SELECT block, height from full_blocks WHERE header_hash=?"
|
|
275
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
276
|
+
row = await execute_fetchone(conn, formatted_str, (header_hash,))
|
|
277
|
+
if row is None:
|
|
278
|
+
return None
|
|
279
|
+
block_bytes = zstd.decompress(row[0])
|
|
280
|
+
|
|
281
|
+
try:
|
|
282
|
+
return generator_from_block(block_bytes)
|
|
283
|
+
except Exception as e: # pragma: no cover
|
|
284
|
+
log.error(f"cheap parser failed for block at height {row[1]}: {e}")
|
|
285
|
+
# this is defensive, on the off-chance that
|
|
286
|
+
# generator_from_block() fails, fall back to the reliable
|
|
287
|
+
# definition of parsing a block
|
|
288
|
+
b = FullBlock.from_bytes(block_bytes)
|
|
289
|
+
return None if b.transactions_generator is None else bytes(b.transactions_generator)
|
|
290
|
+
|
|
291
|
+
async def get_generators_at(self, heights: set[uint32]) -> dict[uint32, bytes]:
|
|
292
|
+
if len(heights) == 0:
|
|
293
|
+
return {}
|
|
294
|
+
|
|
295
|
+
generators: dict[uint32, bytes] = {}
|
|
296
|
+
formatted_str = (
|
|
297
|
+
f"SELECT block, height from full_blocks "
|
|
298
|
+
f'WHERE in_main_chain=1 AND height in ({"?," * (len(heights) - 1)}?)'
|
|
299
|
+
)
|
|
300
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
301
|
+
async with conn.execute(formatted_str, list(heights)) as cursor:
|
|
302
|
+
async for row in cursor:
|
|
303
|
+
block_bytes = zstd.decompress(row[0])
|
|
304
|
+
|
|
305
|
+
try:
|
|
306
|
+
gen = generator_from_block(block_bytes)
|
|
307
|
+
except Exception as e: # pragma: no cover
|
|
308
|
+
log.error(f"cheap parser failed for block at height {row[1]}: {e}")
|
|
309
|
+
# this is defensive, on the off-chance that
|
|
310
|
+
# generator_from_block() fails, fall back to the reliable
|
|
311
|
+
# definition of parsing a block
|
|
312
|
+
b = FullBlock.from_bytes(block_bytes)
|
|
313
|
+
gen = None if b.transactions_generator is None else bytes(b.transactions_generator)
|
|
314
|
+
if gen is None:
|
|
315
|
+
raise ValueError(Err.GENERATOR_REF_HAS_NO_GENERATOR)
|
|
316
|
+
generators[uint32(row[1])] = gen
|
|
317
|
+
|
|
318
|
+
if len(generators) != len(heights):
|
|
319
|
+
raise KeyError(Err.GENERATOR_REF_HAS_NO_GENERATOR)
|
|
320
|
+
|
|
321
|
+
return generators
|
|
322
|
+
|
|
323
|
+
async def get_block_records_by_hash(self, header_hashes: list[bytes32]) -> list[BlockRecord]:
|
|
324
|
+
"""
|
|
325
|
+
Returns a list of Block Records, ordered by the same order in which header_hashes are passed in.
|
|
326
|
+
Throws an exception if the blocks are not present
|
|
327
|
+
"""
|
|
328
|
+
if len(header_hashes) == 0:
|
|
329
|
+
return []
|
|
330
|
+
|
|
331
|
+
all_blocks: dict[bytes32, BlockRecord] = {}
|
|
332
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
333
|
+
async with conn.execute(
|
|
334
|
+
"SELECT header_hash,block_record "
|
|
335
|
+
"FROM full_blocks "
|
|
336
|
+
f'WHERE header_hash in ({"?," * (len(header_hashes) - 1)}?)',
|
|
337
|
+
header_hashes,
|
|
338
|
+
) as cursor:
|
|
339
|
+
for row in await cursor.fetchall():
|
|
340
|
+
block_rec = BlockRecord.from_bytes(row[1])
|
|
341
|
+
all_blocks[block_rec.header_hash] = block_rec
|
|
342
|
+
|
|
343
|
+
ret: list[BlockRecord] = []
|
|
344
|
+
for hh in header_hashes:
|
|
345
|
+
if hh not in all_blocks:
|
|
346
|
+
raise ValueError(f"Header hash {hh} not in the blockchain")
|
|
347
|
+
ret.append(all_blocks[hh])
|
|
348
|
+
return ret
|
|
349
|
+
|
|
350
|
+
async def get_prev_hash(self, header_hash: bytes32) -> bytes32:
|
|
351
|
+
"""
|
|
352
|
+
Returns the header hash preceeding the input header hash.
|
|
353
|
+
Throws an exception if the block is not present
|
|
354
|
+
"""
|
|
355
|
+
cached = self.block_cache.get(header_hash)
|
|
356
|
+
if cached is not None:
|
|
357
|
+
return cached.prev_header_hash
|
|
358
|
+
|
|
359
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
360
|
+
async with conn.execute(
|
|
361
|
+
"SELECT prev_hash FROM full_blocks WHERE header_hash=?",
|
|
362
|
+
(header_hash,),
|
|
363
|
+
) as cursor:
|
|
364
|
+
row = await cursor.fetchone()
|
|
365
|
+
if row is None:
|
|
366
|
+
raise KeyError("missing block in chain")
|
|
367
|
+
return bytes32(row[0])
|
|
368
|
+
|
|
369
|
+
async def get_block_bytes_by_hash(self, header_hashes: list[bytes32]) -> list[bytes]:
|
|
370
|
+
"""
|
|
371
|
+
Returns a list of Full Blocks block blobs, ordered by the same order in which header_hashes are passed in.
|
|
372
|
+
Throws an exception if the blocks are not present
|
|
373
|
+
"""
|
|
374
|
+
|
|
375
|
+
if len(header_hashes) == 0:
|
|
376
|
+
return []
|
|
377
|
+
|
|
378
|
+
assert len(header_hashes) < self.db_wrapper.host_parameter_limit
|
|
379
|
+
formatted_str = (
|
|
380
|
+
f'SELECT header_hash, block from full_blocks WHERE header_hash in ({"?," * (len(header_hashes) - 1)}?)'
|
|
381
|
+
)
|
|
382
|
+
all_blocks: dict[bytes32, bytes] = {}
|
|
383
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
384
|
+
async with conn.execute(formatted_str, header_hashes) as cursor:
|
|
385
|
+
for row in await cursor.fetchall():
|
|
386
|
+
header_hash = bytes32(row[0])
|
|
387
|
+
all_blocks[header_hash] = decompress_blob(row[1])
|
|
388
|
+
|
|
389
|
+
ret: list[bytes] = []
|
|
390
|
+
for hh in header_hashes:
|
|
391
|
+
block = all_blocks.get(hh)
|
|
392
|
+
if block is not None:
|
|
393
|
+
ret.append(block)
|
|
394
|
+
else:
|
|
395
|
+
raise ValueError(f"Header hash {hh} not in the blockchain")
|
|
396
|
+
return ret
|
|
397
|
+
|
|
398
|
+
async def get_blocks_by_hash(self, header_hashes: list[bytes32]) -> list[FullBlock]:
|
|
399
|
+
"""
|
|
400
|
+
Returns a list of Full Blocks blocks, ordered by the same order in which header_hashes are passed in.
|
|
401
|
+
Throws an exception if the blocks are not present
|
|
402
|
+
"""
|
|
403
|
+
|
|
404
|
+
if len(header_hashes) == 0:
|
|
405
|
+
return []
|
|
406
|
+
|
|
407
|
+
formatted_str = (
|
|
408
|
+
f'SELECT header_hash, block from full_blocks WHERE header_hash in ({"?," * (len(header_hashes) - 1)}?)'
|
|
409
|
+
)
|
|
410
|
+
all_blocks: dict[bytes32, FullBlock] = {}
|
|
411
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
412
|
+
async with conn.execute(formatted_str, header_hashes) as cursor:
|
|
413
|
+
for row in await cursor.fetchall():
|
|
414
|
+
header_hash = bytes32(row[0])
|
|
415
|
+
full_block: FullBlock = decompress(row[1])
|
|
416
|
+
all_blocks[header_hash] = full_block
|
|
417
|
+
self.block_cache.put(header_hash, full_block)
|
|
418
|
+
ret: list[FullBlock] = []
|
|
419
|
+
for hh in header_hashes:
|
|
420
|
+
if hh not in all_blocks:
|
|
421
|
+
raise ValueError(f"Header hash {hh} not in the blockchain")
|
|
422
|
+
ret.append(all_blocks[hh])
|
|
423
|
+
return ret
|
|
424
|
+
|
|
425
|
+
async def get_block_record(self, header_hash: bytes32) -> Optional[BlockRecord]:
|
|
426
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
427
|
+
async with conn.execute(
|
|
428
|
+
"SELECT block_record FROM full_blocks WHERE header_hash=?",
|
|
429
|
+
(header_hash,),
|
|
430
|
+
) as cursor:
|
|
431
|
+
row = await cursor.fetchone()
|
|
432
|
+
if row is None:
|
|
433
|
+
return None
|
|
434
|
+
block_record = BlockRecord.from_bytes(row[0])
|
|
435
|
+
|
|
436
|
+
return block_record
|
|
437
|
+
|
|
438
|
+
async def get_block_records_in_range(
|
|
439
|
+
self,
|
|
440
|
+
start: int,
|
|
441
|
+
stop: int,
|
|
442
|
+
) -> dict[bytes32, BlockRecord]:
|
|
443
|
+
"""
|
|
444
|
+
Returns a dictionary with all blocks in range between start and stop
|
|
445
|
+
if present. Only blocks part of the main chain/current peak are returned.
|
|
446
|
+
i.e. No orphan blocks
|
|
447
|
+
"""
|
|
448
|
+
|
|
449
|
+
ret: dict[bytes32, BlockRecord] = {}
|
|
450
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
451
|
+
async with conn.execute(
|
|
452
|
+
"SELECT header_hash,block_record FROM full_blocks "
|
|
453
|
+
"WHERE height >= ? AND height <= ? AND in_main_chain=1",
|
|
454
|
+
(start, stop),
|
|
455
|
+
) as cursor:
|
|
456
|
+
for row in await cursor.fetchall():
|
|
457
|
+
header_hash = bytes32(row[0])
|
|
458
|
+
block_record = BlockRecord.from_bytes(row[1])
|
|
459
|
+
ret[header_hash] = block_record
|
|
460
|
+
|
|
461
|
+
return ret
|
|
462
|
+
|
|
463
|
+
async def get_block_bytes_in_range(
|
|
464
|
+
self,
|
|
465
|
+
start: int,
|
|
466
|
+
stop: int,
|
|
467
|
+
) -> list[bytes]:
|
|
468
|
+
"""
|
|
469
|
+
Returns a list with all full blocks in range between start and stop
|
|
470
|
+
if present. Only includes blocks in the main chain, in the current peak.
|
|
471
|
+
No orphan blocks.
|
|
472
|
+
"""
|
|
473
|
+
|
|
474
|
+
assert self.db_wrapper.db_version == 2
|
|
475
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
476
|
+
async with conn.execute(
|
|
477
|
+
"SELECT block FROM full_blocks WHERE height >= ? AND height <= ? AND in_main_chain=1",
|
|
478
|
+
(start, stop),
|
|
479
|
+
) as cursor:
|
|
480
|
+
rows: list[sqlite3.Row] = list(await cursor.fetchall())
|
|
481
|
+
if len(rows) != (stop - start) + 1:
|
|
482
|
+
raise ValueError(f"Some blocks in range {start}-{stop} were not found.")
|
|
483
|
+
return [decompress_blob(row[0]) for row in rows]
|
|
484
|
+
|
|
485
|
+
async def get_peak(self) -> Optional[tuple[bytes32, uint32]]:
|
|
486
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
487
|
+
async with conn.execute("SELECT hash FROM current_peak WHERE key = 0") as cursor:
|
|
488
|
+
peak_row = await cursor.fetchone()
|
|
489
|
+
if peak_row is None:
|
|
490
|
+
return None
|
|
491
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
492
|
+
async with conn.execute("SELECT height FROM full_blocks WHERE header_hash=?", (peak_row[0],)) as cursor:
|
|
493
|
+
peak_height = await cursor.fetchone()
|
|
494
|
+
if peak_height is None:
|
|
495
|
+
return None
|
|
496
|
+
return bytes32(peak_row[0]), uint32(peak_height[0])
|
|
497
|
+
|
|
498
|
+
async def get_block_records_close_to_peak(
|
|
499
|
+
self, blocks_n: int
|
|
500
|
+
) -> tuple[dict[bytes32, BlockRecord], Optional[bytes32]]:
|
|
501
|
+
"""
|
|
502
|
+
Returns a dictionary with all blocks that have height >= peak height - blocks_n, as well as the
|
|
503
|
+
peak header hash. Only blocks that are part of the main chain/current peak are included.
|
|
504
|
+
"""
|
|
505
|
+
|
|
506
|
+
peak = await self.get_peak()
|
|
507
|
+
if peak is None:
|
|
508
|
+
return {}, None
|
|
509
|
+
|
|
510
|
+
ret: dict[bytes32, BlockRecord] = {}
|
|
511
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
512
|
+
async with conn.execute(
|
|
513
|
+
"SELECT header_hash, block_record FROM full_blocks WHERE height >= ? AND in_main_chain=1",
|
|
514
|
+
(peak[1] - blocks_n,),
|
|
515
|
+
) as cursor:
|
|
516
|
+
for row in await cursor.fetchall():
|
|
517
|
+
header_hash = bytes32(row[0])
|
|
518
|
+
ret[header_hash] = BlockRecord.from_bytes(row[1])
|
|
519
|
+
|
|
520
|
+
return ret, peak[0]
|
|
521
|
+
|
|
522
|
+
async def set_peak(self, header_hash: bytes32) -> None:
|
|
523
|
+
# We need to be in a sqlite transaction here.
|
|
524
|
+
# Note: we do not commit this to the database yet, as we need to also change the coin store
|
|
525
|
+
|
|
526
|
+
# Note: we use the key field as 0 just to ensure all inserts replace the existing row
|
|
527
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
528
|
+
await conn.execute("INSERT OR REPLACE INTO current_peak VALUES(?, ?)", (0, header_hash))
|
|
529
|
+
|
|
530
|
+
async def is_fully_compactified(self, header_hash: bytes32) -> Optional[bool]:
|
|
531
|
+
async with self.db_wrapper.writer_maybe_transaction() as conn:
|
|
532
|
+
async with conn.execute(
|
|
533
|
+
"SELECT is_fully_compactified from full_blocks WHERE header_hash=?", (header_hash,)
|
|
534
|
+
) as cursor:
|
|
535
|
+
row = await cursor.fetchone()
|
|
536
|
+
if row is None:
|
|
537
|
+
return None
|
|
538
|
+
return bool(row[0])
|
|
539
|
+
|
|
540
|
+
async def get_random_not_compactified(self, number: int) -> list[int]:
|
|
541
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
542
|
+
async with conn.execute(
|
|
543
|
+
f"SELECT height FROM full_blocks WHERE in_main_chain=1 AND is_fully_compactified=0 "
|
|
544
|
+
f"ORDER BY RANDOM() LIMIT {number}"
|
|
545
|
+
) as cursor:
|
|
546
|
+
rows = await cursor.fetchall()
|
|
547
|
+
|
|
548
|
+
heights = [int(row[0]) for row in rows]
|
|
549
|
+
|
|
550
|
+
return heights
|
|
551
|
+
|
|
552
|
+
async def count_compactified_blocks(self) -> int:
|
|
553
|
+
# DB V2 has an index on is_fully_compactified only for blocks in the main chain
|
|
554
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
555
|
+
async with conn.execute(
|
|
556
|
+
"select count(*) from full_blocks where is_fully_compactified=1 and in_main_chain=1"
|
|
557
|
+
) as cursor:
|
|
558
|
+
row = await cursor.fetchone()
|
|
559
|
+
|
|
560
|
+
assert row is not None
|
|
561
|
+
|
|
562
|
+
[count] = row
|
|
563
|
+
return int(count)
|
|
564
|
+
|
|
565
|
+
async def count_uncompactified_blocks(self) -> int:
|
|
566
|
+
# DB V2 has an index on is_fully_compactified only for blocks in the main chain
|
|
567
|
+
async with self.db_wrapper.reader_no_transaction() as conn:
|
|
568
|
+
async with conn.execute(
|
|
569
|
+
"select count(*) from full_blocks where is_fully_compactified=0 and in_main_chain=1"
|
|
570
|
+
) as cursor:
|
|
571
|
+
row = await cursor.fetchone()
|
|
572
|
+
|
|
573
|
+
assert row is not None
|
|
574
|
+
|
|
575
|
+
[count] = row
|
|
576
|
+
return int(count)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from chia_rs import solution_generator, solution_generator_backrefs
|
|
4
|
+
|
|
5
|
+
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
6
|
+
from chia.types.generator_types import BlockGenerator
|
|
7
|
+
from chia.types.spend_bundle import SpendBundle
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def simple_solution_generator(bundle: SpendBundle) -> BlockGenerator:
|
|
11
|
+
spends = [(cs.coin, bytes(cs.puzzle_reveal), bytes(cs.solution)) for cs in bundle.coin_spends]
|
|
12
|
+
block_program = solution_generator(spends)
|
|
13
|
+
return BlockGenerator(SerializedProgram.from_bytes(block_program), [])
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def simple_solution_generator_backrefs(bundle: SpendBundle) -> BlockGenerator:
|
|
17
|
+
spends = [(cs.coin, bytes(cs.puzzle_reveal), bytes(cs.solution)) for cs in bundle.coin_spends]
|
|
18
|
+
block_program = solution_generator_backrefs(spends)
|
|
19
|
+
return BlockGenerator(SerializedProgram.from_bytes(block_program), [])
|