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,412 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from chia.consensus.block_record import BlockRecord
|
|
6
|
+
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
7
|
+
from chia.consensus.constants import ConsensusConstants
|
|
8
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
9
|
+
from chia.util.ints import uint8, uint32, uint64, uint128
|
|
10
|
+
from chia.util.significant_bits import count_significant_bits, truncate_to_significant_bits
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _get_blocks_at_height(
|
|
14
|
+
blocks: BlockRecordsProtocol,
|
|
15
|
+
prev_b: BlockRecord,
|
|
16
|
+
target_height: uint32,
|
|
17
|
+
max_num_blocks: uint32 = uint32(1),
|
|
18
|
+
) -> list[BlockRecord]:
|
|
19
|
+
"""
|
|
20
|
+
Return a consecutive list of BlockRecords starting at target_height, returning a maximum of
|
|
21
|
+
max_num_blocks. Assumes all block records are present. Does a slot linear search, if the blocks are not
|
|
22
|
+
in the path of the peak. Can only fetch ancestors of prev_b.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
blocks: dict from header hash to BlockRecord.
|
|
26
|
+
prev_b: prev_b (to start backwards search).
|
|
27
|
+
target_height: target block to start
|
|
28
|
+
max_num_blocks: max number of blocks to fetch (although less might be fetched)
|
|
29
|
+
|
|
30
|
+
"""
|
|
31
|
+
if blocks.contains_height(prev_b.height):
|
|
32
|
+
header_hash = blocks.height_to_hash(prev_b.height)
|
|
33
|
+
if header_hash == prev_b.header_hash:
|
|
34
|
+
# Efficient fetching, since we are fetching ancestor blocks within the heaviest chain. We can directly
|
|
35
|
+
# use the height_to_block_record method
|
|
36
|
+
block_list: list[BlockRecord] = []
|
|
37
|
+
for h in range(target_height, target_height + max_num_blocks):
|
|
38
|
+
assert blocks.contains_height(uint32(h))
|
|
39
|
+
block_list.append(blocks.height_to_block_record(uint32(h)))
|
|
40
|
+
return block_list
|
|
41
|
+
|
|
42
|
+
# Slow fetching, goes back one by one, since we are in a fork
|
|
43
|
+
curr_b: BlockRecord = prev_b
|
|
44
|
+
target_blocks = []
|
|
45
|
+
while curr_b.height >= target_height:
|
|
46
|
+
if curr_b.height < target_height + max_num_blocks:
|
|
47
|
+
target_blocks.append(curr_b)
|
|
48
|
+
if curr_b.height == 0:
|
|
49
|
+
break
|
|
50
|
+
curr_b = blocks.block_record(curr_b.prev_hash)
|
|
51
|
+
return list(reversed(target_blocks))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _get_second_to_last_transaction_block_in_previous_epoch(
|
|
55
|
+
constants: ConsensusConstants,
|
|
56
|
+
blocks: BlockRecordsProtocol,
|
|
57
|
+
last_b: BlockRecord,
|
|
58
|
+
) -> BlockRecord:
|
|
59
|
+
"""
|
|
60
|
+
Retrieves the second to last transaction block in the previous epoch.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
constants: consensus constants being used for this chain
|
|
64
|
+
blocks: dict from header hash to block of all relevant blocks
|
|
65
|
+
last_b: last-block in the current epoch, or last block we have seen, if potentially finishing epoch soon
|
|
66
|
+
|
|
67
|
+
prev epoch surpassed prev epoch started epoch sur. epoch started
|
|
68
|
+
v v v v
|
|
69
|
+
|.B...B....B. B....B...|......B....B.....B...B.|.B.B.B..|..B...B.B.B...|.B.B.B. B.|........
|
|
70
|
+
PREV EPOCH CURR EPOCH NEW EPOCH
|
|
71
|
+
|
|
72
|
+
The blocks selected for the timestamps are the second to last transaction blocks in each epoch.
|
|
73
|
+
Block at height 0 is an exception. Note that H mod EPOCH_BLOCKS where H is the height of the first block in the
|
|
74
|
+
epoch, must be >= 0, and < 128.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
# This height is guaranteed to be in the next epoch (even when last_b is not actually the last block)
|
|
78
|
+
height_in_next_epoch = (
|
|
79
|
+
last_b.height + 2 * constants.MAX_SUB_SLOT_BLOCKS + constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK + 5
|
|
80
|
+
)
|
|
81
|
+
height_epoch_surpass: uint32 = uint32(height_in_next_epoch - (height_in_next_epoch % constants.EPOCH_BLOCKS))
|
|
82
|
+
height_prev_epoch_surpass: uint32 = uint32(height_epoch_surpass - constants.EPOCH_BLOCKS)
|
|
83
|
+
|
|
84
|
+
assert height_prev_epoch_surpass % constants.EPOCH_BLOCKS == height_prev_epoch_surpass % constants.EPOCH_BLOCKS == 0
|
|
85
|
+
|
|
86
|
+
# Sanity check, don't go too far past epoch barrier
|
|
87
|
+
assert (height_in_next_epoch - height_epoch_surpass) < (5 * constants.MAX_SUB_SLOT_BLOCKS)
|
|
88
|
+
|
|
89
|
+
if height_prev_epoch_surpass == 0:
|
|
90
|
+
# The genesis block is an edge case, where we measure from the first block in epoch (height 0), as opposed to
|
|
91
|
+
# a block in the previous epoch, which would be height < 0
|
|
92
|
+
return _get_blocks_at_height(blocks, last_b, uint32(0))[0]
|
|
93
|
+
|
|
94
|
+
# The target block must be in this range. Either the surpass block must be a transaction block, or something
|
|
95
|
+
# in it's sub slot must be a transaction block. If that is the only transaction block in the sub-slot, the last
|
|
96
|
+
# block in the previous sub-slot from that must also be a transaction block (therefore -1 is used).
|
|
97
|
+
# The max height for the new epoch to start is surpass + 2*MAX_SUB_SLOT_BLOCKS + MIN_BLOCKS_PER_CHALLENGE_BLOCK - 3,
|
|
98
|
+
# since we might have a deficit > 0 when surpass is hit. The +3 is added just in case
|
|
99
|
+
fetched_blocks = _get_blocks_at_height(
|
|
100
|
+
blocks,
|
|
101
|
+
last_b,
|
|
102
|
+
uint32(height_prev_epoch_surpass - constants.MAX_SUB_SLOT_BLOCKS - 1),
|
|
103
|
+
uint32(3 * constants.MAX_SUB_SLOT_BLOCKS + constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK + 3),
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# We want to find the last block in the slot at which we surpass the height.
|
|
107
|
+
# The last block in epoch will be before this.
|
|
108
|
+
fetched_index: int = constants.MAX_SUB_SLOT_BLOCKS
|
|
109
|
+
curr_b: BlockRecord = fetched_blocks[fetched_index]
|
|
110
|
+
fetched_index += 1
|
|
111
|
+
assert curr_b.height == height_prev_epoch_surpass - 1
|
|
112
|
+
next_b: BlockRecord = fetched_blocks[fetched_index]
|
|
113
|
+
assert next_b.height == height_prev_epoch_surpass
|
|
114
|
+
|
|
115
|
+
# Wait until the slot finishes with a challenge chain infusion at start of slot
|
|
116
|
+
# Note that there are no overflow blocks at the start of new epochs
|
|
117
|
+
while next_b.sub_epoch_summary_included is None:
|
|
118
|
+
curr_b = next_b
|
|
119
|
+
next_b = fetched_blocks[fetched_index]
|
|
120
|
+
fetched_index += 1
|
|
121
|
+
|
|
122
|
+
# Backtrack to find the second to last tx block
|
|
123
|
+
found_tx_block = 1 if curr_b.is_transaction_block else 0
|
|
124
|
+
while found_tx_block < 2:
|
|
125
|
+
curr_b = blocks.block_record(curr_b.prev_hash)
|
|
126
|
+
if curr_b.is_transaction_block:
|
|
127
|
+
found_tx_block += 1
|
|
128
|
+
|
|
129
|
+
return curr_b
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def height_can_be_first_in_epoch(constants: ConsensusConstants, height: uint32) -> bool:
|
|
133
|
+
return (height - (height % constants.SUB_EPOCH_BLOCKS)) % constants.EPOCH_BLOCKS == 0
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def can_finish_sub_and_full_epoch(
|
|
137
|
+
constants: ConsensusConstants,
|
|
138
|
+
blocks: BlockRecordsProtocol,
|
|
139
|
+
height: uint32,
|
|
140
|
+
prev_header_hash: Optional[bytes32],
|
|
141
|
+
deficit: uint8,
|
|
142
|
+
block_at_height_included_ses: bool,
|
|
143
|
+
prev_ses_block: Optional[BlockRecord] = None,
|
|
144
|
+
) -> tuple[bool, bool]:
|
|
145
|
+
"""
|
|
146
|
+
Returns a bool tuple
|
|
147
|
+
first bool is true if the next sub-slot after height will form part of a new sub-epoch. Therefore
|
|
148
|
+
block height is the last block, and height + 1 is in a new sub-epoch.
|
|
149
|
+
second bool is true if the next sub-slot after height will form part of a new sub-epoch and epoch.
|
|
150
|
+
Therefore, block height is the last block, and height + 1 is in a new epoch.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
constants: consensus constants being used for this chain
|
|
154
|
+
blocks: dictionary from header hash to SBR of all included SBR
|
|
155
|
+
height: block height of the (potentially) last block in the sub-epoch
|
|
156
|
+
prev_header_hash: prev_header hash of the block at height, assuming not genesis
|
|
157
|
+
deficit: deficit of block at height height
|
|
158
|
+
block_at_height_included_ses: whether or not the block at height height already included a SES
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
if height < constants.SUB_EPOCH_BLOCKS - 1:
|
|
162
|
+
return False, False
|
|
163
|
+
|
|
164
|
+
assert prev_header_hash is not None
|
|
165
|
+
|
|
166
|
+
if deficit > 0:
|
|
167
|
+
return False, False
|
|
168
|
+
|
|
169
|
+
if block_at_height_included_ses:
|
|
170
|
+
# If we just included a sub_epoch_summary, we cannot include one again
|
|
171
|
+
return False, False
|
|
172
|
+
|
|
173
|
+
# This does not check the two edge cases where (height + 1) % constants.SUB_EPOCH_BLOCKS is 0 or 1
|
|
174
|
+
# If it's 0, height+1 is the first place that a sub-epoch can be included
|
|
175
|
+
# If it's 1, we just checked whether 0 included it in the previous check
|
|
176
|
+
if (height + 1) % constants.SUB_EPOCH_BLOCKS > 1:
|
|
177
|
+
if prev_ses_block is not None:
|
|
178
|
+
if height - height % constants.SUB_EPOCH_BLOCKS <= prev_ses_block.height:
|
|
179
|
+
return False, False
|
|
180
|
+
else:
|
|
181
|
+
curr: BlockRecord = blocks.block_record(prev_header_hash)
|
|
182
|
+
while curr.height % constants.SUB_EPOCH_BLOCKS > 0:
|
|
183
|
+
if curr.sub_epoch_summary_included is not None:
|
|
184
|
+
return False, False
|
|
185
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
186
|
+
|
|
187
|
+
if curr.sub_epoch_summary_included is not None:
|
|
188
|
+
return False, False
|
|
189
|
+
|
|
190
|
+
# For checking new epoch, make sure the epoch blocks are aligned
|
|
191
|
+
return True, height_can_be_first_in_epoch(constants, uint32(height + 1))
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _get_next_sub_slot_iters(
|
|
195
|
+
constants: ConsensusConstants,
|
|
196
|
+
blocks: BlockRecordsProtocol,
|
|
197
|
+
prev_header_hash: bytes32,
|
|
198
|
+
height: uint32,
|
|
199
|
+
curr_sub_slot_iters: uint64,
|
|
200
|
+
deficit: uint8,
|
|
201
|
+
block_at_height_included_ses: bool,
|
|
202
|
+
new_slot: bool,
|
|
203
|
+
signage_point_total_iters: uint128,
|
|
204
|
+
skip_epoch_check: bool = False,
|
|
205
|
+
) -> uint64:
|
|
206
|
+
"""
|
|
207
|
+
Returns the slot iterations required for the next block after the one at height, where new_slot is true
|
|
208
|
+
iff the next block will be in the next slot. WARNING: assumes that the block at height is not the first block
|
|
209
|
+
in a sub-epoch.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
constants: consensus constants being used for this chain
|
|
213
|
+
blocks: dictionary from header hash to SBR of all included SBR
|
|
214
|
+
prev_header_hash: header hash of the previous block
|
|
215
|
+
height: the block height of the block to look at
|
|
216
|
+
curr_sub_slot_iters: sub-slot iters at the infusion point of the block at height
|
|
217
|
+
deficit: deficit of block at height height
|
|
218
|
+
new_slot: whether or not there is a new slot after height
|
|
219
|
+
signage_point_total_iters: signage point iters of the block at height
|
|
220
|
+
skip_epoch_check: don't check correct epoch
|
|
221
|
+
"""
|
|
222
|
+
next_height: uint32 = uint32(height + 1)
|
|
223
|
+
|
|
224
|
+
if next_height < constants.EPOCH_BLOCKS:
|
|
225
|
+
return uint64(constants.SUB_SLOT_ITERS_STARTING)
|
|
226
|
+
|
|
227
|
+
if not blocks.contains_block(prev_header_hash):
|
|
228
|
+
raise ValueError(f"Header hash {prev_header_hash} not in blocks")
|
|
229
|
+
|
|
230
|
+
prev_b: BlockRecord = blocks.block_record(prev_header_hash)
|
|
231
|
+
|
|
232
|
+
# If we are in the same epoch, return same ssi
|
|
233
|
+
if not skip_epoch_check:
|
|
234
|
+
_, can_finish_epoch = can_finish_sub_and_full_epoch(
|
|
235
|
+
constants, blocks, height, prev_header_hash, deficit, block_at_height_included_ses
|
|
236
|
+
)
|
|
237
|
+
if not new_slot or not can_finish_epoch:
|
|
238
|
+
return curr_sub_slot_iters
|
|
239
|
+
|
|
240
|
+
last_block_prev: BlockRecord = _get_second_to_last_transaction_block_in_previous_epoch(constants, blocks, prev_b)
|
|
241
|
+
|
|
242
|
+
# This gets the last transaction block before this block's signage point. Assuming the block at height height
|
|
243
|
+
# is the last block infused in the epoch: If this block ends up being a
|
|
244
|
+
# transaction block, then last_block_curr will be the second to last tx block in the epoch. If this block
|
|
245
|
+
# is not a transaction block, that means there was exactly one other tx block included in between our signage
|
|
246
|
+
# point and infusion point, and therefore last_block_curr is the second to last as well.
|
|
247
|
+
last_block_curr = prev_b
|
|
248
|
+
while last_block_curr.total_iters > signage_point_total_iters or not last_block_curr.is_transaction_block:
|
|
249
|
+
last_block_curr = blocks.block_record(last_block_curr.prev_hash)
|
|
250
|
+
assert last_block_curr.timestamp is not None and last_block_prev.timestamp is not None
|
|
251
|
+
|
|
252
|
+
# This is computed as the iterations per second in last epoch, times the target number of seconds per slot
|
|
253
|
+
new_ssi_precise: uint64 = uint64(
|
|
254
|
+
constants.SUB_SLOT_TIME_TARGET
|
|
255
|
+
* (last_block_curr.total_iters - last_block_prev.total_iters)
|
|
256
|
+
// (last_block_curr.timestamp - last_block_prev.timestamp)
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
# Only change by a max factor as a sanity check
|
|
260
|
+
max_ssi = uint64(constants.DIFFICULTY_CHANGE_MAX_FACTOR * last_block_curr.sub_slot_iters)
|
|
261
|
+
min_ssi = uint64(last_block_curr.sub_slot_iters // constants.DIFFICULTY_CHANGE_MAX_FACTOR)
|
|
262
|
+
if new_ssi_precise >= last_block_curr.sub_slot_iters:
|
|
263
|
+
new_ssi_precise = uint64(min(new_ssi_precise, max_ssi))
|
|
264
|
+
else:
|
|
265
|
+
new_ssi_precise = uint64(max([constants.NUM_SPS_SUB_SLOT, new_ssi_precise, min_ssi]))
|
|
266
|
+
|
|
267
|
+
new_ssi = truncate_to_significant_bits(new_ssi_precise, constants.SIGNIFICANT_BITS)
|
|
268
|
+
new_ssi = uint64(new_ssi - new_ssi % constants.NUM_SPS_SUB_SLOT) # Must divide the sub slot
|
|
269
|
+
assert count_significant_bits(new_ssi) <= constants.SIGNIFICANT_BITS
|
|
270
|
+
return new_ssi
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def _get_next_difficulty(
|
|
274
|
+
constants: ConsensusConstants,
|
|
275
|
+
blocks: BlockRecordsProtocol,
|
|
276
|
+
prev_header_hash: bytes32,
|
|
277
|
+
height: uint32,
|
|
278
|
+
current_difficulty: uint64,
|
|
279
|
+
deficit: uint8,
|
|
280
|
+
block_at_height_included_ses: bool,
|
|
281
|
+
new_slot: bool,
|
|
282
|
+
signage_point_total_iters: uint128,
|
|
283
|
+
skip_epoch_check: bool = False,
|
|
284
|
+
) -> uint64:
|
|
285
|
+
"""
|
|
286
|
+
Returns the difficulty of the next block that extends onto block.
|
|
287
|
+
Used to calculate the number of iterations. WARNING: assumes that the block at height is not the first block
|
|
288
|
+
in a sub-epoch.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
constants: consensus constants being used for this chain
|
|
292
|
+
blocks: dictionary from header hash to SBR of all included SBR
|
|
293
|
+
prev_header_hash: header hash of the previous block
|
|
294
|
+
height: the block height of the block to look at
|
|
295
|
+
deficit: deficit of block at height height
|
|
296
|
+
current_difficulty: difficulty at the infusion point of the block at height
|
|
297
|
+
new_slot: whether or not there is a new slot after height
|
|
298
|
+
signage_point_total_iters: signage point iters of the block at height
|
|
299
|
+
skip_epoch_check: don't check correct epoch
|
|
300
|
+
"""
|
|
301
|
+
next_height: uint32 = uint32(height + 1)
|
|
302
|
+
|
|
303
|
+
if next_height < (constants.EPOCH_BLOCKS - 3 * constants.MAX_SUB_SLOT_BLOCKS):
|
|
304
|
+
# We are in the first epoch
|
|
305
|
+
return uint64(constants.DIFFICULTY_STARTING)
|
|
306
|
+
|
|
307
|
+
if not blocks.contains_block(prev_header_hash):
|
|
308
|
+
raise ValueError(f"Header hash {prev_header_hash} not in blocks")
|
|
309
|
+
|
|
310
|
+
prev_b: BlockRecord = blocks.block_record(prev_header_hash)
|
|
311
|
+
|
|
312
|
+
# If we are in the same slot as previous block, return same difficulty
|
|
313
|
+
if not skip_epoch_check:
|
|
314
|
+
_, can_finish_epoch = can_finish_sub_and_full_epoch(
|
|
315
|
+
constants, blocks, height, prev_header_hash, deficit, block_at_height_included_ses
|
|
316
|
+
)
|
|
317
|
+
if not new_slot or not can_finish_epoch:
|
|
318
|
+
return current_difficulty
|
|
319
|
+
|
|
320
|
+
last_block_prev: BlockRecord = _get_second_to_last_transaction_block_in_previous_epoch(constants, blocks, prev_b)
|
|
321
|
+
|
|
322
|
+
# This gets the last transaction block before this block's signage point. Assuming the block at height height
|
|
323
|
+
# is the last block infused in the epoch: If this block ends up being a
|
|
324
|
+
# transaction block, then last_block_curr will be the second to last tx block in the epoch. If this block
|
|
325
|
+
# is not a transaction block, that means there was exactly one other tx block included in between our signage
|
|
326
|
+
# point and infusion point, and therefore last_block_curr is the second to last as well.
|
|
327
|
+
last_block_curr = prev_b
|
|
328
|
+
while last_block_curr.total_iters > signage_point_total_iters or not last_block_curr.is_transaction_block:
|
|
329
|
+
last_block_curr = blocks.block_record(last_block_curr.prev_hash)
|
|
330
|
+
|
|
331
|
+
assert last_block_curr.timestamp is not None
|
|
332
|
+
assert last_block_prev.timestamp is not None
|
|
333
|
+
actual_epoch_time: uint64 = uint64(last_block_curr.timestamp - last_block_prev.timestamp)
|
|
334
|
+
|
|
335
|
+
old_difficulty = uint64(prev_b.weight - blocks.block_record(prev_b.prev_hash).weight)
|
|
336
|
+
|
|
337
|
+
# Terms are rearranged so there is only one division.
|
|
338
|
+
new_difficulty_precise = uint64(
|
|
339
|
+
(last_block_curr.weight - last_block_prev.weight)
|
|
340
|
+
* constants.SUB_SLOT_TIME_TARGET
|
|
341
|
+
// (constants.SLOT_BLOCKS_TARGET * actual_epoch_time)
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
# Only change by a max factor, to prevent attacks, as in greenpaper, and must be at least 1
|
|
345
|
+
max_diff = uint64(constants.DIFFICULTY_CHANGE_MAX_FACTOR * old_difficulty)
|
|
346
|
+
min_diff = uint64(old_difficulty // constants.DIFFICULTY_CHANGE_MAX_FACTOR)
|
|
347
|
+
|
|
348
|
+
if new_difficulty_precise >= old_difficulty:
|
|
349
|
+
new_difficulty_precise = uint64(min(new_difficulty_precise, max_diff))
|
|
350
|
+
else:
|
|
351
|
+
new_difficulty_precise = uint64(max([uint64(1), new_difficulty_precise, min_diff]))
|
|
352
|
+
new_difficulty = truncate_to_significant_bits(new_difficulty_precise, constants.SIGNIFICANT_BITS)
|
|
353
|
+
assert count_significant_bits(new_difficulty) <= constants.SIGNIFICANT_BITS
|
|
354
|
+
return uint64(new_difficulty)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def get_next_sub_slot_iters_and_difficulty(
|
|
358
|
+
constants: ConsensusConstants,
|
|
359
|
+
is_first_in_sub_slot: bool,
|
|
360
|
+
prev_b: Optional[BlockRecord],
|
|
361
|
+
blocks: BlockRecordsProtocol,
|
|
362
|
+
) -> tuple[uint64, uint64]:
|
|
363
|
+
"""
|
|
364
|
+
Retrieves the current sub_slot iters and difficulty of the next block after prev_b.
|
|
365
|
+
|
|
366
|
+
Args:
|
|
367
|
+
constants: consensus constants being used for this chain
|
|
368
|
+
is_first_in_sub_slot: Whether the next block is the first in the sub slot
|
|
369
|
+
prev_b: the previous block (last block in the epoch)
|
|
370
|
+
blocks: dictionary from header hash to SBR of all included SBR
|
|
371
|
+
|
|
372
|
+
"""
|
|
373
|
+
|
|
374
|
+
# genesis
|
|
375
|
+
if prev_b is None:
|
|
376
|
+
return constants.SUB_SLOT_ITERS_STARTING, constants.DIFFICULTY_STARTING
|
|
377
|
+
|
|
378
|
+
if prev_b.height != 0:
|
|
379
|
+
prev_difficulty: uint64 = uint64(prev_b.weight - blocks.block_record(prev_b.prev_hash).weight)
|
|
380
|
+
else:
|
|
381
|
+
# prev block is genesis
|
|
382
|
+
prev_difficulty = uint64(prev_b.weight)
|
|
383
|
+
|
|
384
|
+
if prev_b.sub_epoch_summary_included is not None:
|
|
385
|
+
return prev_b.sub_slot_iters, prev_difficulty
|
|
386
|
+
|
|
387
|
+
sp_total_iters = prev_b.sp_total_iters(constants)
|
|
388
|
+
difficulty: uint64 = _get_next_difficulty(
|
|
389
|
+
constants,
|
|
390
|
+
blocks,
|
|
391
|
+
prev_b.prev_hash,
|
|
392
|
+
prev_b.height,
|
|
393
|
+
prev_difficulty,
|
|
394
|
+
prev_b.deficit,
|
|
395
|
+
False, # Already checked above
|
|
396
|
+
is_first_in_sub_slot,
|
|
397
|
+
sp_total_iters,
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
sub_slot_iters: uint64 = _get_next_sub_slot_iters(
|
|
401
|
+
constants,
|
|
402
|
+
blocks,
|
|
403
|
+
prev_b.prev_hash,
|
|
404
|
+
prev_b.height,
|
|
405
|
+
prev_b.sub_slot_iters,
|
|
406
|
+
prev_b.deficit,
|
|
407
|
+
False, # Already checked above
|
|
408
|
+
is_first_in_sub_slot,
|
|
409
|
+
sp_total_iters,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
return sub_slot_iters, difficulty
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Union
|
|
4
|
+
|
|
5
|
+
from chia.consensus.block_record import BlockRecord
|
|
6
|
+
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
7
|
+
from chia.consensus.constants import ConsensusConstants
|
|
8
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
9
|
+
from chia.types.header_block import HeaderBlock
|
|
10
|
+
from chia.util.ints import uint32
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def find_fork_point_in_chain(
|
|
14
|
+
blocks: BlockRecordsProtocol,
|
|
15
|
+
block_1: Union[BlockRecord, HeaderBlock],
|
|
16
|
+
block_2: Union[BlockRecord, HeaderBlock],
|
|
17
|
+
) -> int:
|
|
18
|
+
"""Tries to find height where new chain (block_2) diverged from block_1 (assuming prev blocks
|
|
19
|
+
are all included in chain)
|
|
20
|
+
Returns -1 if chains have no common ancestor
|
|
21
|
+
* assumes the fork point is loaded in blocks
|
|
22
|
+
"""
|
|
23
|
+
height_1 = int(block_1.height)
|
|
24
|
+
height_2 = int(block_2.height)
|
|
25
|
+
bh_1 = block_1.header_hash
|
|
26
|
+
bh_2 = block_2.header_hash
|
|
27
|
+
|
|
28
|
+
# special case for first level, since we actually already know the previous
|
|
29
|
+
# hash
|
|
30
|
+
if height_1 > height_2:
|
|
31
|
+
bh_1 = block_1.prev_hash
|
|
32
|
+
height_1 -= 1
|
|
33
|
+
elif height_2 > height_1:
|
|
34
|
+
bh_2 = block_2.prev_hash
|
|
35
|
+
height_2 -= 1
|
|
36
|
+
|
|
37
|
+
while height_1 > height_2:
|
|
38
|
+
[bh_1] = await blocks.prev_block_hash([bh_1])
|
|
39
|
+
height_1 -= 1
|
|
40
|
+
|
|
41
|
+
while height_2 > height_1:
|
|
42
|
+
[bh_2] = await blocks.prev_block_hash([bh_2])
|
|
43
|
+
height_2 -= 1
|
|
44
|
+
|
|
45
|
+
assert height_1 == height_2
|
|
46
|
+
|
|
47
|
+
height = height_2
|
|
48
|
+
while height > 0:
|
|
49
|
+
if bh_1 == bh_2:
|
|
50
|
+
return height
|
|
51
|
+
[bh_1, bh_2] = await blocks.prev_block_hash([bh_1, bh_2])
|
|
52
|
+
height -= 1
|
|
53
|
+
|
|
54
|
+
if bh_2 != bh_1:
|
|
55
|
+
# All blocks are different
|
|
56
|
+
return -1
|
|
57
|
+
|
|
58
|
+
# First block is the same
|
|
59
|
+
return 0
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
async def lookup_fork_chain(
|
|
63
|
+
blocks: BlockRecordsProtocol,
|
|
64
|
+
block_1: tuple[int, bytes32],
|
|
65
|
+
block_2: tuple[int, bytes32],
|
|
66
|
+
constants: ConsensusConstants,
|
|
67
|
+
) -> tuple[dict[uint32, bytes32], bytes32]:
|
|
68
|
+
"""
|
|
69
|
+
Tries to find height where new chain (block_2) diverged from block_1.
|
|
70
|
+
The inputs are (height, header-hash)-tuples.
|
|
71
|
+
Returns two values:
|
|
72
|
+
1. The height to hash map of block_2's chain down to, but not
|
|
73
|
+
including, the fork height
|
|
74
|
+
2. The header hash of the block at the fork height
|
|
75
|
+
Note that height -1 is valid. There is never a block at that height, but
|
|
76
|
+
there is a block hash (GENESIS_CHALLENGE).
|
|
77
|
+
We never include the fork point in the returned height to hash map, so its
|
|
78
|
+
key is unsigned
|
|
79
|
+
"""
|
|
80
|
+
height_1 = block_1[0]
|
|
81
|
+
bh_1 = block_1[1]
|
|
82
|
+
height_2 = block_2[0]
|
|
83
|
+
bh_2 = block_2[1]
|
|
84
|
+
|
|
85
|
+
ret: dict[uint32, bytes32] = {}
|
|
86
|
+
|
|
87
|
+
while height_1 > height_2:
|
|
88
|
+
[bh_1] = await blocks.prev_block_hash([bh_1])
|
|
89
|
+
height_1 -= 1
|
|
90
|
+
|
|
91
|
+
while height_2 > height_1:
|
|
92
|
+
ret[uint32(height_2)] = bh_2
|
|
93
|
+
[bh_2] = await blocks.prev_block_hash([bh_2])
|
|
94
|
+
height_2 -= 1
|
|
95
|
+
|
|
96
|
+
assert height_1 == height_2
|
|
97
|
+
|
|
98
|
+
height = height_2
|
|
99
|
+
while height > 0:
|
|
100
|
+
if bh_1 == bh_2:
|
|
101
|
+
return (ret, bh_2)
|
|
102
|
+
ret[uint32(height)] = bh_2
|
|
103
|
+
[bh_1, bh_2] = await blocks.prev_block_hash([bh_1, bh_2])
|
|
104
|
+
height -= 1
|
|
105
|
+
|
|
106
|
+
if bh_1 == bh_2:
|
|
107
|
+
return (ret, bh_2)
|
|
108
|
+
|
|
109
|
+
# this means the fork point is -1, and its hash is the GENESIS_CHALLENGE
|
|
110
|
+
ret[uint32(0)] = bh_2
|
|
111
|
+
return (ret, constants.GENESIS_CHALLENGE)
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Optional, Union
|
|
4
|
+
|
|
5
|
+
from chia.consensus.block_record import BlockRecord
|
|
6
|
+
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
7
|
+
from chia.consensus.constants import ConsensusConstants
|
|
8
|
+
from chia.consensus.deficit import calculate_deficit
|
|
9
|
+
from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
|
|
10
|
+
from chia.consensus.make_sub_epoch_summary import make_sub_epoch_summary
|
|
11
|
+
from chia.consensus.pot_iterations import is_overflow_block
|
|
12
|
+
from chia.types.blockchain_format.classgroup import ClassgroupElement
|
|
13
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
14
|
+
from chia.types.blockchain_format.slots import ChallengeBlockInfo
|
|
15
|
+
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
16
|
+
from chia.types.full_block import FullBlock
|
|
17
|
+
from chia.types.header_block import HeaderBlock
|
|
18
|
+
from chia.util.errors import Err
|
|
19
|
+
from chia.util.ints import uint8, uint32, uint64
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def block_to_block_record(
|
|
23
|
+
constants: ConsensusConstants,
|
|
24
|
+
blocks: BlockRecordsProtocol,
|
|
25
|
+
required_iters: uint64,
|
|
26
|
+
block: Union[FullBlock, HeaderBlock],
|
|
27
|
+
sub_slot_iters: uint64,
|
|
28
|
+
prev_ses_block: Optional[BlockRecord] = None,
|
|
29
|
+
) -> BlockRecord:
|
|
30
|
+
prev_b = blocks.try_block_record(block.prev_header_hash)
|
|
31
|
+
if block.height > 0:
|
|
32
|
+
assert prev_b is not None
|
|
33
|
+
if sub_slot_iters is None:
|
|
34
|
+
sub_slot_iters, _ = get_next_sub_slot_iters_and_difficulty(
|
|
35
|
+
constants, len(block.finished_sub_slots) > 0, prev_b, blocks
|
|
36
|
+
)
|
|
37
|
+
overflow = is_overflow_block(constants, block.reward_chain_block.signage_point_index)
|
|
38
|
+
deficit = calculate_deficit(
|
|
39
|
+
constants,
|
|
40
|
+
block.height,
|
|
41
|
+
prev_b,
|
|
42
|
+
overflow,
|
|
43
|
+
len(block.finished_sub_slots),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
found_ses_hash: Optional[bytes32] = None
|
|
47
|
+
ses: Optional[SubEpochSummary] = None
|
|
48
|
+
if len(block.finished_sub_slots) > 0:
|
|
49
|
+
for sub_slot in block.finished_sub_slots:
|
|
50
|
+
if sub_slot.challenge_chain.subepoch_summary_hash is not None:
|
|
51
|
+
found_ses_hash = sub_slot.challenge_chain.subepoch_summary_hash
|
|
52
|
+
if found_ses_hash:
|
|
53
|
+
assert prev_b is not None
|
|
54
|
+
assert len(block.finished_sub_slots) > 0
|
|
55
|
+
ses = make_sub_epoch_summary(
|
|
56
|
+
constants,
|
|
57
|
+
blocks,
|
|
58
|
+
block.height,
|
|
59
|
+
blocks.block_record(prev_b.prev_hash),
|
|
60
|
+
block.finished_sub_slots[0].challenge_chain.new_difficulty,
|
|
61
|
+
block.finished_sub_slots[0].challenge_chain.new_sub_slot_iters,
|
|
62
|
+
prev_ses_block,
|
|
63
|
+
)
|
|
64
|
+
if ses.get_hash() != found_ses_hash:
|
|
65
|
+
raise ValueError(Err.INVALID_SUB_EPOCH_SUMMARY)
|
|
66
|
+
|
|
67
|
+
prev_transaction_block_height = uint32(0)
|
|
68
|
+
curr: Optional[BlockRecord] = blocks.try_block_record(block.prev_header_hash)
|
|
69
|
+
while curr is not None and not curr.is_transaction_block:
|
|
70
|
+
curr = blocks.try_block_record(curr.prev_hash)
|
|
71
|
+
|
|
72
|
+
if curr is not None and curr.is_transaction_block:
|
|
73
|
+
prev_transaction_block_height = curr.height
|
|
74
|
+
|
|
75
|
+
return header_block_to_sub_block_record(
|
|
76
|
+
constants,
|
|
77
|
+
required_iters,
|
|
78
|
+
block,
|
|
79
|
+
sub_slot_iters,
|
|
80
|
+
overflow,
|
|
81
|
+
deficit,
|
|
82
|
+
prev_transaction_block_height,
|
|
83
|
+
ses,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def header_block_to_sub_block_record(
|
|
88
|
+
constants: ConsensusConstants,
|
|
89
|
+
required_iters: uint64,
|
|
90
|
+
block: Union[FullBlock, HeaderBlock],
|
|
91
|
+
sub_slot_iters: uint64,
|
|
92
|
+
overflow: bool,
|
|
93
|
+
deficit: uint8,
|
|
94
|
+
prev_transaction_block_height: uint32,
|
|
95
|
+
ses: Optional[SubEpochSummary],
|
|
96
|
+
) -> BlockRecord:
|
|
97
|
+
reward_claims_incorporated = (
|
|
98
|
+
block.transactions_info.reward_claims_incorporated if block.transactions_info is not None else None
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
cbi = ChallengeBlockInfo(
|
|
102
|
+
block.reward_chain_block.proof_of_space,
|
|
103
|
+
block.reward_chain_block.challenge_chain_sp_vdf,
|
|
104
|
+
block.reward_chain_block.challenge_chain_sp_signature,
|
|
105
|
+
block.reward_chain_block.challenge_chain_ip_vdf,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
if block.reward_chain_block.infused_challenge_chain_ip_vdf is not None:
|
|
109
|
+
icc_output: Optional[ClassgroupElement] = block.reward_chain_block.infused_challenge_chain_ip_vdf.output
|
|
110
|
+
else:
|
|
111
|
+
icc_output = None
|
|
112
|
+
|
|
113
|
+
if len(block.finished_sub_slots) > 0:
|
|
114
|
+
finished_challenge_slot_hashes: Optional[list[bytes32]] = [
|
|
115
|
+
sub_slot.challenge_chain.get_hash() for sub_slot in block.finished_sub_slots
|
|
116
|
+
]
|
|
117
|
+
finished_reward_slot_hashes: Optional[list[bytes32]] = [
|
|
118
|
+
sub_slot.reward_chain.get_hash() for sub_slot in block.finished_sub_slots
|
|
119
|
+
]
|
|
120
|
+
finished_infused_challenge_slot_hashes: Optional[list[bytes32]] = [
|
|
121
|
+
sub_slot.infused_challenge_chain.get_hash()
|
|
122
|
+
for sub_slot in block.finished_sub_slots
|
|
123
|
+
if sub_slot.infused_challenge_chain is not None
|
|
124
|
+
]
|
|
125
|
+
elif block.height == 0:
|
|
126
|
+
finished_challenge_slot_hashes = [constants.GENESIS_CHALLENGE]
|
|
127
|
+
finished_reward_slot_hashes = [constants.GENESIS_CHALLENGE]
|
|
128
|
+
finished_infused_challenge_slot_hashes = None
|
|
129
|
+
else:
|
|
130
|
+
finished_challenge_slot_hashes = None
|
|
131
|
+
finished_reward_slot_hashes = None
|
|
132
|
+
finished_infused_challenge_slot_hashes = None
|
|
133
|
+
prev_transaction_block_hash = (
|
|
134
|
+
block.foliage_transaction_block.prev_transaction_block_hash
|
|
135
|
+
if block.foliage_transaction_block is not None
|
|
136
|
+
else None
|
|
137
|
+
)
|
|
138
|
+
timestamp = block.foliage_transaction_block.timestamp if block.foliage_transaction_block is not None else None
|
|
139
|
+
fees = block.transactions_info.fees if block.transactions_info is not None else None
|
|
140
|
+
|
|
141
|
+
return BlockRecord(
|
|
142
|
+
block.header_hash,
|
|
143
|
+
block.prev_header_hash,
|
|
144
|
+
block.height,
|
|
145
|
+
block.weight,
|
|
146
|
+
block.total_iters,
|
|
147
|
+
block.reward_chain_block.signage_point_index,
|
|
148
|
+
block.reward_chain_block.challenge_chain_ip_vdf.output,
|
|
149
|
+
icc_output,
|
|
150
|
+
block.reward_chain_block.get_hash(),
|
|
151
|
+
cbi.get_hash(),
|
|
152
|
+
sub_slot_iters,
|
|
153
|
+
block.foliage.foliage_block_data.pool_target.puzzle_hash,
|
|
154
|
+
block.foliage.foliage_block_data.farmer_reward_puzzle_hash,
|
|
155
|
+
required_iters,
|
|
156
|
+
deficit,
|
|
157
|
+
overflow,
|
|
158
|
+
prev_transaction_block_height,
|
|
159
|
+
timestamp,
|
|
160
|
+
prev_transaction_block_hash,
|
|
161
|
+
fees,
|
|
162
|
+
reward_claims_incorporated,
|
|
163
|
+
finished_challenge_slot_hashes,
|
|
164
|
+
finished_infused_challenge_slot_hashes,
|
|
165
|
+
finished_reward_slot_hashes,
|
|
166
|
+
ses,
|
|
167
|
+
)
|