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,1059 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import time
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from chia_rs import AugSchemeMPL
|
|
8
|
+
|
|
9
|
+
from chia.consensus.block_record import BlockRecord
|
|
10
|
+
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
11
|
+
from chia.consensus.constants import ConsensusConstants
|
|
12
|
+
from chia.consensus.deficit import calculate_deficit
|
|
13
|
+
from chia.consensus.difficulty_adjustment import can_finish_sub_and_full_epoch
|
|
14
|
+
from chia.consensus.get_block_challenge import final_eos_is_already_included, get_block_challenge
|
|
15
|
+
from chia.consensus.make_sub_epoch_summary import make_sub_epoch_summary
|
|
16
|
+
from chia.consensus.pot_iterations import (
|
|
17
|
+
calculate_ip_iters,
|
|
18
|
+
calculate_iterations_quality,
|
|
19
|
+
calculate_sp_interval_iters,
|
|
20
|
+
calculate_sp_iters,
|
|
21
|
+
is_overflow_block,
|
|
22
|
+
)
|
|
23
|
+
from chia.consensus.vdf_info_computation import get_signage_point_vdf_info
|
|
24
|
+
from chia.types.blockchain_format.classgroup import ClassgroupElement
|
|
25
|
+
from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
|
|
26
|
+
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
27
|
+
from chia.types.blockchain_format.slots import ChallengeChainSubSlot, RewardChainSubSlot, SubSlotProofs
|
|
28
|
+
from chia.types.blockchain_format.vdf import VDFInfo, VDFProof, validate_vdf
|
|
29
|
+
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
30
|
+
from chia.types.header_block import HeaderBlock
|
|
31
|
+
from chia.types.unfinished_header_block import UnfinishedHeaderBlock
|
|
32
|
+
from chia.types.validation_state import ValidationState
|
|
33
|
+
from chia.util.errors import Err, ValidationError
|
|
34
|
+
from chia.util.hash import std_hash
|
|
35
|
+
from chia.util.ints import uint8, uint32, uint64, uint128
|
|
36
|
+
|
|
37
|
+
log = logging.getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# noinspection PyCallByClass
|
|
41
|
+
def validate_unfinished_header_block(
|
|
42
|
+
constants: ConsensusConstants,
|
|
43
|
+
blocks: BlockRecordsProtocol,
|
|
44
|
+
header_block: UnfinishedHeaderBlock,
|
|
45
|
+
check_filter: bool,
|
|
46
|
+
expected_vs: ValidationState,
|
|
47
|
+
skip_overflow_last_ss_validation: bool = False,
|
|
48
|
+
skip_vdf_is_valid: bool = False,
|
|
49
|
+
check_sub_epoch_summary: bool = True,
|
|
50
|
+
) -> tuple[Optional[uint64], Optional[ValidationError]]:
|
|
51
|
+
"""
|
|
52
|
+
Validates an unfinished header block. This is a block without the infusion VDFs (unfinished)
|
|
53
|
+
and without transactions and transaction info (header). Returns (required_iters, error).
|
|
54
|
+
|
|
55
|
+
This method is meant to validate only the unfinished part of the block. However, the finished_sub_slots
|
|
56
|
+
refers to all sub-slots that were finishes from the previous block's infusion point, up to this blocks
|
|
57
|
+
infusion point. Therefore, in the case where this is an overflow block, and the last sub-slot is not yet
|
|
58
|
+
released, header_block.finished_sub_slots will be missing one sub-slot. In this case,
|
|
59
|
+
skip_overflow_last_ss_validation must be set to True. This will skip validation of end of slots, sub-epochs,
|
|
60
|
+
and lead to other small tweaks in validation.
|
|
61
|
+
"""
|
|
62
|
+
# 1. Check that the previous block exists in the blockchain, or that it is correct
|
|
63
|
+
|
|
64
|
+
prev_b = blocks.try_block_record(header_block.prev_header_hash)
|
|
65
|
+
genesis_block = prev_b is None
|
|
66
|
+
if genesis_block and header_block.prev_header_hash != constants.GENESIS_CHALLENGE:
|
|
67
|
+
return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)
|
|
68
|
+
|
|
69
|
+
overflow = is_overflow_block(constants, header_block.reward_chain_block.signage_point_index)
|
|
70
|
+
if skip_overflow_last_ss_validation and overflow:
|
|
71
|
+
if final_eos_is_already_included(header_block, blocks, expected_vs.ssi):
|
|
72
|
+
skip_overflow_last_ss_validation = False
|
|
73
|
+
finished_sub_slots_since_prev = len(header_block.finished_sub_slots)
|
|
74
|
+
else:
|
|
75
|
+
finished_sub_slots_since_prev = len(header_block.finished_sub_slots) + 1
|
|
76
|
+
else:
|
|
77
|
+
finished_sub_slots_since_prev = len(header_block.finished_sub_slots)
|
|
78
|
+
|
|
79
|
+
new_sub_slot: bool = finished_sub_slots_since_prev > 0
|
|
80
|
+
|
|
81
|
+
can_finish_se: bool = False
|
|
82
|
+
can_finish_epoch: bool = False
|
|
83
|
+
if genesis_block:
|
|
84
|
+
height: uint32 = uint32(0)
|
|
85
|
+
assert expected_vs.difficulty == constants.DIFFICULTY_STARTING
|
|
86
|
+
assert expected_vs.ssi == constants.SUB_SLOT_ITERS_STARTING
|
|
87
|
+
else:
|
|
88
|
+
assert prev_b is not None
|
|
89
|
+
height = uint32(prev_b.height + 1)
|
|
90
|
+
if new_sub_slot:
|
|
91
|
+
can_finish_se, can_finish_epoch = can_finish_sub_and_full_epoch(
|
|
92
|
+
constants,
|
|
93
|
+
blocks,
|
|
94
|
+
prev_b.height,
|
|
95
|
+
prev_b.prev_hash,
|
|
96
|
+
prev_b.deficit,
|
|
97
|
+
prev_b.sub_epoch_summary_included is not None,
|
|
98
|
+
prev_ses_block=expected_vs.prev_ses_block,
|
|
99
|
+
)
|
|
100
|
+
else:
|
|
101
|
+
can_finish_se = False
|
|
102
|
+
can_finish_epoch = False
|
|
103
|
+
|
|
104
|
+
# 2. Check finished slots that have been crossed since prev_b
|
|
105
|
+
ses_hash: Optional[bytes32] = None
|
|
106
|
+
if new_sub_slot and not skip_overflow_last_ss_validation:
|
|
107
|
+
# Finished a slot(s) since previous block. The first sub-slot must have at least one block, and all
|
|
108
|
+
# subsequent sub-slots must be empty
|
|
109
|
+
for finished_sub_slot_n, sub_slot in enumerate(header_block.finished_sub_slots):
|
|
110
|
+
# Start of slot challenge is fetched from SP
|
|
111
|
+
challenge_hash: bytes32 = sub_slot.challenge_chain.challenge_chain_end_of_slot_vdf.challenge
|
|
112
|
+
|
|
113
|
+
if finished_sub_slot_n == 0:
|
|
114
|
+
if genesis_block:
|
|
115
|
+
# 2a. check sub-slot challenge hash for genesis block
|
|
116
|
+
if challenge_hash != constants.GENESIS_CHALLENGE:
|
|
117
|
+
return None, ValidationError(Err.INVALID_PREV_CHALLENGE_SLOT_HASH)
|
|
118
|
+
else:
|
|
119
|
+
assert prev_b is not None
|
|
120
|
+
curr: BlockRecord = prev_b
|
|
121
|
+
while not curr.first_in_sub_slot:
|
|
122
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
123
|
+
assert curr.finished_challenge_slot_hashes is not None
|
|
124
|
+
|
|
125
|
+
# 2b. check sub-slot challenge hash for non-genesis block
|
|
126
|
+
if not curr.finished_challenge_slot_hashes[-1] == challenge_hash:
|
|
127
|
+
print(curr.finished_challenge_slot_hashes[-1], challenge_hash)
|
|
128
|
+
return None, ValidationError(Err.INVALID_PREV_CHALLENGE_SLOT_HASH)
|
|
129
|
+
else:
|
|
130
|
+
# 2c. check sub-slot challenge hash for empty slot
|
|
131
|
+
if (
|
|
132
|
+
not header_block.finished_sub_slots[finished_sub_slot_n - 1].challenge_chain.get_hash()
|
|
133
|
+
== challenge_hash
|
|
134
|
+
):
|
|
135
|
+
return None, ValidationError(Err.INVALID_PREV_CHALLENGE_SLOT_HASH)
|
|
136
|
+
|
|
137
|
+
if genesis_block:
|
|
138
|
+
# 2d. Validate that genesis block has no ICC
|
|
139
|
+
if sub_slot.infused_challenge_chain is not None:
|
|
140
|
+
return None, ValidationError(Err.SHOULD_NOT_HAVE_ICC)
|
|
141
|
+
else:
|
|
142
|
+
assert prev_b is not None
|
|
143
|
+
icc_iters_committed: Optional[uint64] = None
|
|
144
|
+
icc_iters_proof: Optional[uint64] = None
|
|
145
|
+
icc_challenge_hash: Optional[bytes32] = None
|
|
146
|
+
icc_vdf_input = None
|
|
147
|
+
if prev_b.deficit < constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK:
|
|
148
|
+
# There should be no ICC chain if the last block's deficit is 16
|
|
149
|
+
# Prev sb's deficit is 0, 1, 2, 3, or 4
|
|
150
|
+
if finished_sub_slot_n == 0:
|
|
151
|
+
# This is the first sub slot after the last sb, which must have deficit 1-4, and thus an ICC
|
|
152
|
+
curr = prev_b
|
|
153
|
+
while not curr.is_challenge_block(constants) and not curr.first_in_sub_slot:
|
|
154
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
155
|
+
if curr.is_challenge_block(constants):
|
|
156
|
+
icc_challenge_hash = curr.challenge_block_info_hash
|
|
157
|
+
icc_iters_committed = uint64(prev_b.sub_slot_iters - curr.ip_iters(constants))
|
|
158
|
+
else:
|
|
159
|
+
assert curr.finished_infused_challenge_slot_hashes is not None
|
|
160
|
+
icc_challenge_hash = curr.finished_infused_challenge_slot_hashes[-1]
|
|
161
|
+
icc_iters_committed = prev_b.sub_slot_iters
|
|
162
|
+
icc_iters_proof = uint64(prev_b.sub_slot_iters - prev_b.ip_iters(constants))
|
|
163
|
+
if prev_b.is_challenge_block(constants):
|
|
164
|
+
icc_vdf_input = ClassgroupElement.get_default_element()
|
|
165
|
+
else:
|
|
166
|
+
icc_vdf_input = prev_b.infused_challenge_vdf_output
|
|
167
|
+
else:
|
|
168
|
+
# This is not the first sub slot after the last block, so we might not have an ICC
|
|
169
|
+
if (
|
|
170
|
+
header_block.finished_sub_slots[finished_sub_slot_n - 1].reward_chain.deficit
|
|
171
|
+
< constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK
|
|
172
|
+
):
|
|
173
|
+
finished_ss = header_block.finished_sub_slots[finished_sub_slot_n - 1]
|
|
174
|
+
assert finished_ss.infused_challenge_chain is not None
|
|
175
|
+
|
|
176
|
+
# Only sets the icc iff the previous sub slots deficit is 4 or less
|
|
177
|
+
icc_challenge_hash = finished_ss.infused_challenge_chain.get_hash()
|
|
178
|
+
icc_iters_committed = prev_b.sub_slot_iters
|
|
179
|
+
icc_iters_proof = icc_iters_committed
|
|
180
|
+
icc_vdf_input = ClassgroupElement.get_default_element()
|
|
181
|
+
|
|
182
|
+
# 2e. Validate that there is not icc iff icc_challenge hash is None
|
|
183
|
+
assert (sub_slot.infused_challenge_chain is None) == (icc_challenge_hash is None)
|
|
184
|
+
if sub_slot.infused_challenge_chain is not None:
|
|
185
|
+
assert icc_vdf_input is not None
|
|
186
|
+
assert icc_iters_proof is not None
|
|
187
|
+
assert icc_iters_committed is not None
|
|
188
|
+
assert icc_challenge_hash is not None
|
|
189
|
+
assert sub_slot.proofs.infused_challenge_chain_slot_proof is not None
|
|
190
|
+
# 2f. Check infused challenge chain sub-slot VDF
|
|
191
|
+
# Only validate from prev_b to optimize
|
|
192
|
+
target_vdf_info = VDFInfo(
|
|
193
|
+
icc_challenge_hash,
|
|
194
|
+
icc_iters_proof,
|
|
195
|
+
sub_slot.infused_challenge_chain.infused_challenge_chain_end_of_slot_vdf.output,
|
|
196
|
+
)
|
|
197
|
+
if (
|
|
198
|
+
sub_slot.infused_challenge_chain.infused_challenge_chain_end_of_slot_vdf
|
|
199
|
+
!= target_vdf_info.replace(number_of_iterations=icc_iters_committed)
|
|
200
|
+
):
|
|
201
|
+
return None, ValidationError(Err.INVALID_ICC_EOS_VDF)
|
|
202
|
+
if not skip_vdf_is_valid:
|
|
203
|
+
if (
|
|
204
|
+
not sub_slot.proofs.infused_challenge_chain_slot_proof.normalized_to_identity
|
|
205
|
+
and not validate_vdf(
|
|
206
|
+
sub_slot.proofs.infused_challenge_chain_slot_proof,
|
|
207
|
+
constants,
|
|
208
|
+
icc_vdf_input,
|
|
209
|
+
target_vdf_info,
|
|
210
|
+
None,
|
|
211
|
+
)
|
|
212
|
+
):
|
|
213
|
+
return None, ValidationError(Err.INVALID_ICC_EOS_VDF)
|
|
214
|
+
if (
|
|
215
|
+
sub_slot.proofs.infused_challenge_chain_slot_proof.normalized_to_identity
|
|
216
|
+
and not validate_vdf(
|
|
217
|
+
sub_slot.proofs.infused_challenge_chain_slot_proof,
|
|
218
|
+
constants,
|
|
219
|
+
ClassgroupElement.get_default_element(),
|
|
220
|
+
sub_slot.infused_challenge_chain.infused_challenge_chain_end_of_slot_vdf,
|
|
221
|
+
)
|
|
222
|
+
):
|
|
223
|
+
return None, ValidationError(Err.INVALID_ICC_EOS_VDF)
|
|
224
|
+
|
|
225
|
+
if sub_slot.reward_chain.deficit == constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK:
|
|
226
|
+
# 2g. Check infused challenge sub-slot hash in challenge chain, deficit 16
|
|
227
|
+
if (
|
|
228
|
+
sub_slot.infused_challenge_chain.get_hash()
|
|
229
|
+
!= sub_slot.challenge_chain.infused_challenge_chain_sub_slot_hash
|
|
230
|
+
):
|
|
231
|
+
return None, ValidationError(Err.INVALID_ICC_HASH_CC)
|
|
232
|
+
else:
|
|
233
|
+
# 2h. Check infused challenge sub-slot hash not included for other deficits
|
|
234
|
+
if sub_slot.challenge_chain.infused_challenge_chain_sub_slot_hash is not None:
|
|
235
|
+
return None, ValidationError(Err.INVALID_ICC_HASH_CC)
|
|
236
|
+
|
|
237
|
+
# 2i. Check infused challenge sub-slot hash in reward sub-slot
|
|
238
|
+
if (
|
|
239
|
+
sub_slot.infused_challenge_chain.get_hash()
|
|
240
|
+
!= sub_slot.reward_chain.infused_challenge_chain_sub_slot_hash
|
|
241
|
+
):
|
|
242
|
+
return None, ValidationError(Err.INVALID_ICC_HASH_RC)
|
|
243
|
+
else:
|
|
244
|
+
# 2j. If no icc, check that the cc doesn't include it
|
|
245
|
+
if sub_slot.challenge_chain.infused_challenge_chain_sub_slot_hash is not None:
|
|
246
|
+
return None, ValidationError(Err.INVALID_ICC_HASH_CC)
|
|
247
|
+
|
|
248
|
+
# 2k. If no icc, check that the cc doesn't include it
|
|
249
|
+
if sub_slot.reward_chain.infused_challenge_chain_sub_slot_hash is not None:
|
|
250
|
+
return None, ValidationError(Err.INVALID_ICC_HASH_RC)
|
|
251
|
+
|
|
252
|
+
if sub_slot.challenge_chain.subepoch_summary_hash is not None:
|
|
253
|
+
assert ses_hash is None # Only one of the slots can have it
|
|
254
|
+
ses_hash = sub_slot.challenge_chain.subepoch_summary_hash
|
|
255
|
+
|
|
256
|
+
# 2l. check sub-epoch summary hash is None for empty slots
|
|
257
|
+
if finished_sub_slot_n != 0:
|
|
258
|
+
if sub_slot.challenge_chain.subepoch_summary_hash is not None:
|
|
259
|
+
return None, ValidationError(Err.INVALID_SUB_EPOCH_SUMMARY_HASH)
|
|
260
|
+
|
|
261
|
+
if can_finish_epoch and sub_slot.challenge_chain.subepoch_summary_hash is not None:
|
|
262
|
+
# 2m. Check new difficulty and ssi
|
|
263
|
+
if sub_slot.challenge_chain.new_sub_slot_iters != expected_vs.ssi:
|
|
264
|
+
return None, ValidationError(Err.INVALID_NEW_SUB_SLOT_ITERS)
|
|
265
|
+
if sub_slot.challenge_chain.new_difficulty != expected_vs.difficulty:
|
|
266
|
+
return None, ValidationError(Err.INVALID_NEW_DIFFICULTY)
|
|
267
|
+
else:
|
|
268
|
+
# 2n. Check new difficulty and ssi are None if we don't finish epoch
|
|
269
|
+
if sub_slot.challenge_chain.new_sub_slot_iters is not None:
|
|
270
|
+
return None, ValidationError(Err.INVALID_NEW_SUB_SLOT_ITERS)
|
|
271
|
+
if sub_slot.challenge_chain.new_difficulty is not None:
|
|
272
|
+
return None, ValidationError(Err.INVALID_NEW_DIFFICULTY)
|
|
273
|
+
|
|
274
|
+
# 2o. Check challenge sub-slot hash in reward sub-slot
|
|
275
|
+
if sub_slot.challenge_chain.get_hash() != sub_slot.reward_chain.challenge_chain_sub_slot_hash:
|
|
276
|
+
return (
|
|
277
|
+
None,
|
|
278
|
+
ValidationError(
|
|
279
|
+
Err.INVALID_CHALLENGE_SLOT_HASH_RC,
|
|
280
|
+
"sub-slot hash in reward sub-slot mismatch",
|
|
281
|
+
),
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
eos_vdf_iters: uint64 = expected_vs.ssi
|
|
285
|
+
cc_start_element: ClassgroupElement = ClassgroupElement.get_default_element()
|
|
286
|
+
cc_eos_vdf_challenge: bytes32 = challenge_hash
|
|
287
|
+
if genesis_block:
|
|
288
|
+
if finished_sub_slot_n == 0:
|
|
289
|
+
# First block, one empty slot. prior_point is the initial challenge
|
|
290
|
+
rc_eos_vdf_challenge: bytes32 = constants.GENESIS_CHALLENGE
|
|
291
|
+
cc_eos_vdf_challenge = constants.GENESIS_CHALLENGE
|
|
292
|
+
else:
|
|
293
|
+
# First block, but have at least two empty slots
|
|
294
|
+
rc_eos_vdf_challenge = header_block.finished_sub_slots[
|
|
295
|
+
finished_sub_slot_n - 1
|
|
296
|
+
].reward_chain.get_hash()
|
|
297
|
+
else:
|
|
298
|
+
assert prev_b is not None
|
|
299
|
+
if finished_sub_slot_n == 0:
|
|
300
|
+
# No empty slots, so the starting point of VDF is the last reward block. Uses
|
|
301
|
+
# the same IPS as the previous block, since it's the same slot
|
|
302
|
+
rc_eos_vdf_challenge = prev_b.reward_infusion_new_challenge
|
|
303
|
+
eos_vdf_iters = uint64(prev_b.sub_slot_iters - prev_b.ip_iters(constants))
|
|
304
|
+
cc_start_element = prev_b.challenge_vdf_output
|
|
305
|
+
else:
|
|
306
|
+
# At least one empty slot, so use previous slot hash. IPS might change because it's a new slot
|
|
307
|
+
rc_eos_vdf_challenge = header_block.finished_sub_slots[
|
|
308
|
+
finished_sub_slot_n - 1
|
|
309
|
+
].reward_chain.get_hash()
|
|
310
|
+
|
|
311
|
+
# 2p. Check end of reward slot VDF
|
|
312
|
+
target_vdf_info = VDFInfo(
|
|
313
|
+
rc_eos_vdf_challenge,
|
|
314
|
+
eos_vdf_iters,
|
|
315
|
+
sub_slot.reward_chain.end_of_slot_vdf.output,
|
|
316
|
+
)
|
|
317
|
+
if not skip_vdf_is_valid and not validate_vdf(
|
|
318
|
+
sub_slot.proofs.reward_chain_slot_proof,
|
|
319
|
+
constants,
|
|
320
|
+
ClassgroupElement.get_default_element(),
|
|
321
|
+
sub_slot.reward_chain.end_of_slot_vdf,
|
|
322
|
+
target_vdf_info,
|
|
323
|
+
):
|
|
324
|
+
return None, ValidationError(Err.INVALID_RC_EOS_VDF)
|
|
325
|
+
|
|
326
|
+
# 2q. Check challenge chain sub-slot VDF
|
|
327
|
+
partial_cc_vdf_info = VDFInfo(
|
|
328
|
+
cc_eos_vdf_challenge,
|
|
329
|
+
eos_vdf_iters,
|
|
330
|
+
sub_slot.challenge_chain.challenge_chain_end_of_slot_vdf.output,
|
|
331
|
+
)
|
|
332
|
+
if genesis_block:
|
|
333
|
+
cc_eos_vdf_info_iters = constants.SUB_SLOT_ITERS_STARTING
|
|
334
|
+
else:
|
|
335
|
+
assert prev_b is not None
|
|
336
|
+
if finished_sub_slot_n == 0:
|
|
337
|
+
cc_eos_vdf_info_iters = prev_b.sub_slot_iters
|
|
338
|
+
else:
|
|
339
|
+
cc_eos_vdf_info_iters = expected_vs.ssi
|
|
340
|
+
# Check that the modified data is correct
|
|
341
|
+
if sub_slot.challenge_chain.challenge_chain_end_of_slot_vdf != partial_cc_vdf_info.replace(
|
|
342
|
+
number_of_iterations=cc_eos_vdf_info_iters
|
|
343
|
+
):
|
|
344
|
+
return None, ValidationError(Err.INVALID_CC_EOS_VDF, "wrong challenge chain end of slot vdf")
|
|
345
|
+
|
|
346
|
+
if not skip_vdf_is_valid:
|
|
347
|
+
# Pass in None for target info since we are only checking the proof from the temporary point,
|
|
348
|
+
# but the challenge_chain_end_of_slot_vdf actually starts from the start of slot (for light clients)
|
|
349
|
+
if not sub_slot.proofs.challenge_chain_slot_proof.normalized_to_identity and not validate_vdf(
|
|
350
|
+
sub_slot.proofs.challenge_chain_slot_proof, constants, cc_start_element, partial_cc_vdf_info, None
|
|
351
|
+
):
|
|
352
|
+
return None, ValidationError(Err.INVALID_CC_EOS_VDF)
|
|
353
|
+
if sub_slot.proofs.challenge_chain_slot_proof.normalized_to_identity and not validate_vdf(
|
|
354
|
+
sub_slot.proofs.challenge_chain_slot_proof,
|
|
355
|
+
constants,
|
|
356
|
+
ClassgroupElement.get_default_element(),
|
|
357
|
+
sub_slot.challenge_chain.challenge_chain_end_of_slot_vdf,
|
|
358
|
+
):
|
|
359
|
+
return None, ValidationError(Err.INVALID_CC_EOS_VDF)
|
|
360
|
+
|
|
361
|
+
if genesis_block:
|
|
362
|
+
# 2r. Check deficit (MIN_SUB.. deficit edge case for genesis block)
|
|
363
|
+
if sub_slot.reward_chain.deficit != constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK:
|
|
364
|
+
return (
|
|
365
|
+
None,
|
|
366
|
+
ValidationError(
|
|
367
|
+
Err.INVALID_DEFICIT,
|
|
368
|
+
f"genesis, expected deficit {constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK}",
|
|
369
|
+
),
|
|
370
|
+
)
|
|
371
|
+
else:
|
|
372
|
+
assert prev_b is not None
|
|
373
|
+
if prev_b.deficit == 0:
|
|
374
|
+
# 2s. If prev sb had deficit 0, resets deficit to MIN_BLOCK_PER_CHALLENGE_BLOCK
|
|
375
|
+
if sub_slot.reward_chain.deficit != constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK:
|
|
376
|
+
log.error(
|
|
377
|
+
constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK,
|
|
378
|
+
)
|
|
379
|
+
return (
|
|
380
|
+
None,
|
|
381
|
+
ValidationError(
|
|
382
|
+
Err.INVALID_DEFICIT,
|
|
383
|
+
f"expected deficit {constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK}, saw "
|
|
384
|
+
f"{sub_slot.reward_chain.deficit}",
|
|
385
|
+
),
|
|
386
|
+
)
|
|
387
|
+
else:
|
|
388
|
+
# 2t. Otherwise, deficit stays the same at the slot ends, cannot reset until 0
|
|
389
|
+
if sub_slot.reward_chain.deficit != prev_b.deficit:
|
|
390
|
+
return None, ValidationError(Err.INVALID_DEFICIT, "deficit is wrong at slot end")
|
|
391
|
+
|
|
392
|
+
# 3. Check sub-epoch summary
|
|
393
|
+
# Note that the subepoch summary is the summary of the previous subepoch (not the one that just finished)
|
|
394
|
+
if not skip_overflow_last_ss_validation:
|
|
395
|
+
if ses_hash is not None:
|
|
396
|
+
# 3a. Check that genesis block does not have sub-epoch summary
|
|
397
|
+
if genesis_block:
|
|
398
|
+
return (
|
|
399
|
+
None,
|
|
400
|
+
ValidationError(
|
|
401
|
+
Err.INVALID_SUB_EPOCH_SUMMARY_HASH,
|
|
402
|
+
"genesis with sub-epoch-summary hash",
|
|
403
|
+
),
|
|
404
|
+
)
|
|
405
|
+
assert prev_b is not None
|
|
406
|
+
|
|
407
|
+
# 3b. Check that we finished a slot and we finished a sub-epoch
|
|
408
|
+
if not new_sub_slot or not can_finish_se:
|
|
409
|
+
return (
|
|
410
|
+
None,
|
|
411
|
+
ValidationError(
|
|
412
|
+
Err.INVALID_SUB_EPOCH_SUMMARY_HASH,
|
|
413
|
+
f"new sub-slot: {new_sub_slot} finishes sub-epoch {can_finish_se}",
|
|
414
|
+
),
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
# 3c. Check the actual sub-epoch is correct
|
|
418
|
+
if check_sub_epoch_summary:
|
|
419
|
+
expected_sub_epoch_summary = make_sub_epoch_summary(
|
|
420
|
+
constants,
|
|
421
|
+
blocks,
|
|
422
|
+
height,
|
|
423
|
+
blocks.block_record(prev_b.prev_hash),
|
|
424
|
+
expected_vs.difficulty if can_finish_epoch else None,
|
|
425
|
+
expected_vs.ssi if can_finish_epoch else None,
|
|
426
|
+
expected_vs.prev_ses_block,
|
|
427
|
+
)
|
|
428
|
+
expected_hash = expected_sub_epoch_summary.get_hash()
|
|
429
|
+
if expected_hash != ses_hash:
|
|
430
|
+
log.error(f"{expected_sub_epoch_summary}")
|
|
431
|
+
return (
|
|
432
|
+
None,
|
|
433
|
+
ValidationError(
|
|
434
|
+
Err.INVALID_SUB_EPOCH_SUMMARY,
|
|
435
|
+
f"expected ses hash: {expected_hash} got {ses_hash} ",
|
|
436
|
+
),
|
|
437
|
+
)
|
|
438
|
+
elif new_sub_slot and not genesis_block:
|
|
439
|
+
# 3d. Check that we don't have to include a sub-epoch summary
|
|
440
|
+
if can_finish_se or can_finish_epoch:
|
|
441
|
+
return (
|
|
442
|
+
None,
|
|
443
|
+
ValidationError(
|
|
444
|
+
Err.INVALID_SUB_EPOCH_SUMMARY,
|
|
445
|
+
"block finishes sub-epoch but ses-hash is None",
|
|
446
|
+
),
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
# 4. Check if the number of blocks is less than the max
|
|
450
|
+
if not new_sub_slot and not genesis_block:
|
|
451
|
+
assert prev_b is not None
|
|
452
|
+
num_blocks = 2 # This includes the current block and the prev block
|
|
453
|
+
curr = prev_b
|
|
454
|
+
while not curr.first_in_sub_slot:
|
|
455
|
+
num_blocks += 1
|
|
456
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
457
|
+
if num_blocks > constants.MAX_SUB_SLOT_BLOCKS:
|
|
458
|
+
return None, ValidationError(Err.TOO_MANY_BLOCKS)
|
|
459
|
+
|
|
460
|
+
# If block state is correct, we should always find a challenge here
|
|
461
|
+
# This computes what the challenge should be for this block
|
|
462
|
+
|
|
463
|
+
challenge = get_block_challenge(
|
|
464
|
+
constants,
|
|
465
|
+
header_block,
|
|
466
|
+
blocks,
|
|
467
|
+
genesis_block,
|
|
468
|
+
overflow,
|
|
469
|
+
skip_overflow_last_ss_validation,
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
# 5a. Check proof of space
|
|
473
|
+
if challenge != header_block.reward_chain_block.pos_ss_cc_challenge_hash:
|
|
474
|
+
log.error(f"Finished slots: {header_block.finished_sub_slots}")
|
|
475
|
+
log.error(
|
|
476
|
+
f"Data: {genesis_block} {overflow} {skip_overflow_last_ss_validation} {header_block.total_iters} "
|
|
477
|
+
f"{header_block.reward_chain_block.signage_point_index}"
|
|
478
|
+
f"Prev: {prev_b}"
|
|
479
|
+
)
|
|
480
|
+
log.error(f"Challenge {challenge} provided {header_block.reward_chain_block.pos_ss_cc_challenge_hash}")
|
|
481
|
+
return None, ValidationError(Err.INVALID_CC_CHALLENGE)
|
|
482
|
+
|
|
483
|
+
# 5b. Check proof of space
|
|
484
|
+
if header_block.reward_chain_block.challenge_chain_sp_vdf is None:
|
|
485
|
+
# Edge case of first sp (start of slot), where sp_iters == 0
|
|
486
|
+
cc_sp_hash: bytes32 = challenge
|
|
487
|
+
else:
|
|
488
|
+
cc_sp_hash = header_block.reward_chain_block.challenge_chain_sp_vdf.output.get_hash()
|
|
489
|
+
|
|
490
|
+
q_str: Optional[bytes32] = verify_and_get_quality_string(
|
|
491
|
+
header_block.reward_chain_block.proof_of_space, constants, challenge, cc_sp_hash, height=height
|
|
492
|
+
)
|
|
493
|
+
if q_str is None:
|
|
494
|
+
return None, ValidationError(Err.INVALID_POSPACE)
|
|
495
|
+
|
|
496
|
+
# 6. check signage point index
|
|
497
|
+
# no need to check negative values as this is uint 8
|
|
498
|
+
if header_block.reward_chain_block.signage_point_index >= constants.NUM_SPS_SUB_SLOT:
|
|
499
|
+
return None, ValidationError(Err.INVALID_SP_INDEX)
|
|
500
|
+
|
|
501
|
+
# Note that required iters might be from the previous slot (if we are in an overflow block)
|
|
502
|
+
required_iters: uint64 = calculate_iterations_quality(
|
|
503
|
+
constants.DIFFICULTY_CONSTANT_FACTOR,
|
|
504
|
+
q_str,
|
|
505
|
+
header_block.reward_chain_block.proof_of_space.size,
|
|
506
|
+
expected_vs.difficulty,
|
|
507
|
+
cc_sp_hash,
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
# 7. check required iters
|
|
511
|
+
if required_iters >= calculate_sp_interval_iters(constants, expected_vs.ssi):
|
|
512
|
+
return None, ValidationError(Err.INVALID_REQUIRED_ITERS)
|
|
513
|
+
|
|
514
|
+
# 8a. check signage point index 0 has no cc sp
|
|
515
|
+
if (header_block.reward_chain_block.signage_point_index == 0) != (
|
|
516
|
+
header_block.reward_chain_block.challenge_chain_sp_vdf is None
|
|
517
|
+
):
|
|
518
|
+
return None, ValidationError(Err.INVALID_SP_INDEX)
|
|
519
|
+
|
|
520
|
+
# 8b. check signage point index 0 has no rc sp
|
|
521
|
+
if (header_block.reward_chain_block.signage_point_index == 0) != (
|
|
522
|
+
header_block.reward_chain_block.reward_chain_sp_vdf is None
|
|
523
|
+
):
|
|
524
|
+
return None, ValidationError(Err.INVALID_SP_INDEX)
|
|
525
|
+
|
|
526
|
+
sp_iters: uint64 = calculate_sp_iters(
|
|
527
|
+
constants,
|
|
528
|
+
expected_vs.ssi,
|
|
529
|
+
header_block.reward_chain_block.signage_point_index,
|
|
530
|
+
)
|
|
531
|
+
|
|
532
|
+
ip_iters: uint64 = calculate_ip_iters(
|
|
533
|
+
constants,
|
|
534
|
+
expected_vs.ssi,
|
|
535
|
+
header_block.reward_chain_block.signage_point_index,
|
|
536
|
+
required_iters,
|
|
537
|
+
)
|
|
538
|
+
if header_block.reward_chain_block.challenge_chain_sp_vdf is None:
|
|
539
|
+
# Blocks with very low required iters are not overflow blocks
|
|
540
|
+
assert not overflow
|
|
541
|
+
|
|
542
|
+
# 9. Check no overflows in the first sub-slot of a new epoch
|
|
543
|
+
# (although they are OK in the second sub-slot), this is important
|
|
544
|
+
if overflow and can_finish_epoch:
|
|
545
|
+
if finished_sub_slots_since_prev < 2:
|
|
546
|
+
return None, ValidationError(Err.NO_OVERFLOWS_IN_FIRST_SUB_SLOT_NEW_EPOCH)
|
|
547
|
+
|
|
548
|
+
# 10. Check total iters
|
|
549
|
+
if genesis_block:
|
|
550
|
+
total_iters: uint128 = uint128(expected_vs.ssi * finished_sub_slots_since_prev)
|
|
551
|
+
else:
|
|
552
|
+
assert prev_b is not None
|
|
553
|
+
if new_sub_slot:
|
|
554
|
+
total_iters = prev_b.total_iters
|
|
555
|
+
# Add the rest of the slot of prev_b
|
|
556
|
+
total_iters = uint128(total_iters + prev_b.sub_slot_iters - prev_b.ip_iters(constants))
|
|
557
|
+
# Add other empty slots
|
|
558
|
+
total_iters = uint128(total_iters + (expected_vs.ssi * (finished_sub_slots_since_prev - 1)))
|
|
559
|
+
else:
|
|
560
|
+
# Slot iters is guaranteed to be the same for header_block and prev_b
|
|
561
|
+
# This takes the beginning of the slot, and adds ip_iters
|
|
562
|
+
total_iters = uint128(prev_b.total_iters - prev_b.ip_iters(constants))
|
|
563
|
+
total_iters = uint128(total_iters + ip_iters)
|
|
564
|
+
if total_iters != header_block.reward_chain_block.total_iters:
|
|
565
|
+
return (
|
|
566
|
+
None,
|
|
567
|
+
ValidationError(
|
|
568
|
+
Err.INVALID_TOTAL_ITERS,
|
|
569
|
+
f"expected {total_iters} got {header_block.reward_chain_block.total_iters}",
|
|
570
|
+
),
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
sp_total_iters: uint128 = uint128(total_iters - ip_iters + sp_iters - (expected_vs.ssi if overflow else 0))
|
|
574
|
+
if overflow and skip_overflow_last_ss_validation:
|
|
575
|
+
dummy_vdf_info = VDFInfo(
|
|
576
|
+
bytes32.zeros,
|
|
577
|
+
uint64(1),
|
|
578
|
+
ClassgroupElement.get_default_element(),
|
|
579
|
+
)
|
|
580
|
+
dummy_sub_slot = EndOfSubSlotBundle(
|
|
581
|
+
ChallengeChainSubSlot(dummy_vdf_info, None, None, None, None),
|
|
582
|
+
None,
|
|
583
|
+
RewardChainSubSlot(dummy_vdf_info, bytes32.zeros, None, uint8(0)),
|
|
584
|
+
SubSlotProofs(VDFProof(uint8(0), b"", False), None, VDFProof(uint8(0), b"", False)),
|
|
585
|
+
)
|
|
586
|
+
sub_slots_to_pass_in = [*header_block.finished_sub_slots, dummy_sub_slot]
|
|
587
|
+
else:
|
|
588
|
+
sub_slots_to_pass_in = header_block.finished_sub_slots
|
|
589
|
+
(
|
|
590
|
+
cc_vdf_challenge,
|
|
591
|
+
rc_vdf_challenge,
|
|
592
|
+
cc_vdf_input,
|
|
593
|
+
rc_vdf_input,
|
|
594
|
+
cc_vdf_iters,
|
|
595
|
+
rc_vdf_iters,
|
|
596
|
+
) = get_signage_point_vdf_info(
|
|
597
|
+
constants,
|
|
598
|
+
sub_slots_to_pass_in,
|
|
599
|
+
overflow,
|
|
600
|
+
prev_b,
|
|
601
|
+
blocks,
|
|
602
|
+
sp_total_iters,
|
|
603
|
+
sp_iters,
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
# 11. Check reward chain sp proof
|
|
607
|
+
if sp_iters != 0:
|
|
608
|
+
assert (
|
|
609
|
+
header_block.reward_chain_block.reward_chain_sp_vdf is not None
|
|
610
|
+
and header_block.reward_chain_sp_proof is not None
|
|
611
|
+
)
|
|
612
|
+
target_vdf_info = VDFInfo(
|
|
613
|
+
rc_vdf_challenge,
|
|
614
|
+
rc_vdf_iters,
|
|
615
|
+
header_block.reward_chain_block.reward_chain_sp_vdf.output,
|
|
616
|
+
)
|
|
617
|
+
if not skip_vdf_is_valid and not validate_vdf(
|
|
618
|
+
header_block.reward_chain_sp_proof,
|
|
619
|
+
constants,
|
|
620
|
+
rc_vdf_input,
|
|
621
|
+
header_block.reward_chain_block.reward_chain_sp_vdf,
|
|
622
|
+
target_vdf_info,
|
|
623
|
+
):
|
|
624
|
+
return None, ValidationError(Err.INVALID_RC_SP_VDF)
|
|
625
|
+
rc_sp_hash = header_block.reward_chain_block.reward_chain_sp_vdf.output.get_hash()
|
|
626
|
+
else:
|
|
627
|
+
# Edge case of first sp (start of slot), where sp_iters == 0
|
|
628
|
+
assert overflow is not None
|
|
629
|
+
if header_block.reward_chain_block.reward_chain_sp_vdf is not None:
|
|
630
|
+
return None, ValidationError(Err.INVALID_RC_SP_VDF)
|
|
631
|
+
if new_sub_slot:
|
|
632
|
+
rc_sp_hash = header_block.finished_sub_slots[-1].reward_chain.get_hash()
|
|
633
|
+
else:
|
|
634
|
+
if genesis_block:
|
|
635
|
+
rc_sp_hash = constants.GENESIS_CHALLENGE
|
|
636
|
+
else:
|
|
637
|
+
assert prev_b is not None
|
|
638
|
+
curr = prev_b
|
|
639
|
+
while not curr.first_in_sub_slot:
|
|
640
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
641
|
+
assert curr.finished_reward_slot_hashes is not None
|
|
642
|
+
rc_sp_hash = curr.finished_reward_slot_hashes[-1]
|
|
643
|
+
|
|
644
|
+
# 12. Check reward chain sp signature
|
|
645
|
+
if not AugSchemeMPL.verify(
|
|
646
|
+
header_block.reward_chain_block.proof_of_space.plot_public_key,
|
|
647
|
+
rc_sp_hash,
|
|
648
|
+
header_block.reward_chain_block.reward_chain_sp_signature,
|
|
649
|
+
):
|
|
650
|
+
return None, ValidationError(Err.INVALID_RC_SIGNATURE)
|
|
651
|
+
|
|
652
|
+
# 13. Check cc sp vdf
|
|
653
|
+
if sp_iters != 0:
|
|
654
|
+
assert header_block.reward_chain_block.challenge_chain_sp_vdf is not None
|
|
655
|
+
assert header_block.challenge_chain_sp_proof is not None
|
|
656
|
+
target_vdf_info = VDFInfo(
|
|
657
|
+
cc_vdf_challenge,
|
|
658
|
+
cc_vdf_iters,
|
|
659
|
+
header_block.reward_chain_block.challenge_chain_sp_vdf.output,
|
|
660
|
+
)
|
|
661
|
+
|
|
662
|
+
if header_block.reward_chain_block.challenge_chain_sp_vdf != target_vdf_info.replace(
|
|
663
|
+
number_of_iterations=sp_iters
|
|
664
|
+
):
|
|
665
|
+
return None, ValidationError(Err.INVALID_CC_SP_VDF)
|
|
666
|
+
if not skip_vdf_is_valid:
|
|
667
|
+
if not header_block.challenge_chain_sp_proof.normalized_to_identity and not validate_vdf(
|
|
668
|
+
header_block.challenge_chain_sp_proof, constants, cc_vdf_input, target_vdf_info, None
|
|
669
|
+
):
|
|
670
|
+
return None, ValidationError(Err.INVALID_CC_SP_VDF)
|
|
671
|
+
if header_block.challenge_chain_sp_proof.normalized_to_identity and not validate_vdf(
|
|
672
|
+
header_block.challenge_chain_sp_proof,
|
|
673
|
+
constants,
|
|
674
|
+
ClassgroupElement.get_default_element(),
|
|
675
|
+
header_block.reward_chain_block.challenge_chain_sp_vdf,
|
|
676
|
+
):
|
|
677
|
+
return None, ValidationError(Err.INVALID_CC_SP_VDF)
|
|
678
|
+
else:
|
|
679
|
+
assert overflow is not None
|
|
680
|
+
if header_block.reward_chain_block.challenge_chain_sp_vdf is not None:
|
|
681
|
+
return None, ValidationError(Err.INVALID_CC_SP_VDF)
|
|
682
|
+
|
|
683
|
+
# 14. Check cc sp sig
|
|
684
|
+
if not AugSchemeMPL.verify(
|
|
685
|
+
header_block.reward_chain_block.proof_of_space.plot_public_key,
|
|
686
|
+
cc_sp_hash,
|
|
687
|
+
header_block.reward_chain_block.challenge_chain_sp_signature,
|
|
688
|
+
):
|
|
689
|
+
return None, ValidationError(Err.INVALID_CC_SIGNATURE, "invalid cc sp sig")
|
|
690
|
+
|
|
691
|
+
# 15. Check is_transaction_block
|
|
692
|
+
if genesis_block:
|
|
693
|
+
if header_block.foliage.foliage_transaction_block_hash is None:
|
|
694
|
+
return None, ValidationError(Err.INVALID_IS_TRANSACTION_BLOCK, "invalid genesis")
|
|
695
|
+
else:
|
|
696
|
+
assert prev_b is not None
|
|
697
|
+
# Finds the previous block
|
|
698
|
+
curr = prev_b
|
|
699
|
+
while not curr.is_transaction_block:
|
|
700
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
701
|
+
|
|
702
|
+
# The first block to have an sp > the last tx block's infusion iters, is a tx block
|
|
703
|
+
if overflow:
|
|
704
|
+
our_sp_total_iters: uint128 = uint128(total_iters - ip_iters + sp_iters - expected_vs.ssi)
|
|
705
|
+
else:
|
|
706
|
+
our_sp_total_iters = uint128(total_iters - ip_iters + sp_iters)
|
|
707
|
+
if (our_sp_total_iters > curr.total_iters) != (header_block.foliage.foliage_transaction_block_hash is not None):
|
|
708
|
+
return None, ValidationError(Err.INVALID_IS_TRANSACTION_BLOCK)
|
|
709
|
+
if (our_sp_total_iters > curr.total_iters) != (
|
|
710
|
+
header_block.foliage.foliage_transaction_block_signature is not None
|
|
711
|
+
):
|
|
712
|
+
return None, ValidationError(Err.INVALID_IS_TRANSACTION_BLOCK)
|
|
713
|
+
|
|
714
|
+
# 16. Check foliage block signature by plot key
|
|
715
|
+
if not AugSchemeMPL.verify(
|
|
716
|
+
header_block.reward_chain_block.proof_of_space.plot_public_key,
|
|
717
|
+
header_block.foliage.foliage_block_data.get_hash(),
|
|
718
|
+
header_block.foliage.foliage_block_data_signature,
|
|
719
|
+
):
|
|
720
|
+
return None, ValidationError(Err.INVALID_PLOT_SIGNATURE)
|
|
721
|
+
|
|
722
|
+
# 17. Check foliage block signature by plot key
|
|
723
|
+
if header_block.foliage.foliage_transaction_block_hash is not None:
|
|
724
|
+
assert header_block.foliage.foliage_transaction_block_signature is not None
|
|
725
|
+
if not AugSchemeMPL.verify(
|
|
726
|
+
header_block.reward_chain_block.proof_of_space.plot_public_key,
|
|
727
|
+
header_block.foliage.foliage_transaction_block_hash,
|
|
728
|
+
header_block.foliage.foliage_transaction_block_signature,
|
|
729
|
+
):
|
|
730
|
+
return None, ValidationError(Err.INVALID_PLOT_SIGNATURE)
|
|
731
|
+
|
|
732
|
+
# 18. Check unfinished reward chain block hash
|
|
733
|
+
if (
|
|
734
|
+
header_block.reward_chain_block.get_hash()
|
|
735
|
+
!= header_block.foliage.foliage_block_data.unfinished_reward_block_hash
|
|
736
|
+
):
|
|
737
|
+
return None, ValidationError(Err.INVALID_URSB_HASH)
|
|
738
|
+
|
|
739
|
+
# 19. Check pool target max height
|
|
740
|
+
if (
|
|
741
|
+
header_block.foliage.foliage_block_data.pool_target.max_height != 0
|
|
742
|
+
and header_block.foliage.foliage_block_data.pool_target.max_height < height
|
|
743
|
+
):
|
|
744
|
+
return None, ValidationError(Err.OLD_POOL_TARGET)
|
|
745
|
+
|
|
746
|
+
# 20a. Check pre-farm puzzle hashes for genesis block.
|
|
747
|
+
if genesis_block:
|
|
748
|
+
if (
|
|
749
|
+
header_block.foliage.foliage_block_data.pool_target.puzzle_hash
|
|
750
|
+
!= constants.GENESIS_PRE_FARM_POOL_PUZZLE_HASH
|
|
751
|
+
):
|
|
752
|
+
log.error(f"Pool target {header_block.foliage.foliage_block_data.pool_target} hb {header_block}")
|
|
753
|
+
return None, ValidationError(Err.INVALID_PREFARM)
|
|
754
|
+
if (
|
|
755
|
+
header_block.foliage.foliage_block_data.farmer_reward_puzzle_hash
|
|
756
|
+
!= constants.GENESIS_PRE_FARM_FARMER_PUZZLE_HASH
|
|
757
|
+
):
|
|
758
|
+
return None, ValidationError(Err.INVALID_PREFARM)
|
|
759
|
+
else:
|
|
760
|
+
# 20b. If pospace has a pool pk, heck pool target signature. Should not check this for genesis block.
|
|
761
|
+
if header_block.reward_chain_block.proof_of_space.pool_public_key is not None:
|
|
762
|
+
assert header_block.reward_chain_block.proof_of_space.pool_contract_puzzle_hash is None
|
|
763
|
+
assert header_block.foliage.foliage_block_data.pool_signature is not None
|
|
764
|
+
if not AugSchemeMPL.verify(
|
|
765
|
+
header_block.reward_chain_block.proof_of_space.pool_public_key,
|
|
766
|
+
bytes(header_block.foliage.foliage_block_data.pool_target),
|
|
767
|
+
header_block.foliage.foliage_block_data.pool_signature,
|
|
768
|
+
):
|
|
769
|
+
return None, ValidationError(Err.INVALID_POOL_SIGNATURE)
|
|
770
|
+
else:
|
|
771
|
+
# 20c. Otherwise, the plot is associated with a contract puzzle hash, not a public key
|
|
772
|
+
assert header_block.reward_chain_block.proof_of_space.pool_contract_puzzle_hash is not None
|
|
773
|
+
if (
|
|
774
|
+
header_block.foliage.foliage_block_data.pool_target.puzzle_hash
|
|
775
|
+
!= header_block.reward_chain_block.proof_of_space.pool_contract_puzzle_hash
|
|
776
|
+
):
|
|
777
|
+
return None, ValidationError(Err.INVALID_POOL_TARGET)
|
|
778
|
+
|
|
779
|
+
# 21. Check extension data if applicable. None for mainnet.
|
|
780
|
+
# 22. Check if foliage block is present
|
|
781
|
+
if (header_block.foliage.foliage_transaction_block_hash is not None) != (
|
|
782
|
+
header_block.foliage_transaction_block is not None
|
|
783
|
+
):
|
|
784
|
+
return None, ValidationError(Err.INVALID_FOLIAGE_BLOCK_PRESENCE)
|
|
785
|
+
|
|
786
|
+
if (header_block.foliage.foliage_transaction_block_signature is not None) != (
|
|
787
|
+
header_block.foliage_transaction_block is not None
|
|
788
|
+
):
|
|
789
|
+
return None, ValidationError(Err.INVALID_FOLIAGE_BLOCK_PRESENCE)
|
|
790
|
+
|
|
791
|
+
if header_block.foliage_transaction_block is not None:
|
|
792
|
+
# 23. Check foliage block hash
|
|
793
|
+
if header_block.foliage_transaction_block.get_hash() != header_block.foliage.foliage_transaction_block_hash:
|
|
794
|
+
return None, ValidationError(Err.INVALID_FOLIAGE_BLOCK_HASH)
|
|
795
|
+
|
|
796
|
+
if genesis_block:
|
|
797
|
+
# 24a. Check prev block hash for genesis
|
|
798
|
+
if header_block.foliage_transaction_block.prev_transaction_block_hash != constants.GENESIS_CHALLENGE:
|
|
799
|
+
return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)
|
|
800
|
+
else:
|
|
801
|
+
assert prev_b is not None
|
|
802
|
+
# 24b. Check prev block hash for non-genesis
|
|
803
|
+
curr_b: BlockRecord = prev_b
|
|
804
|
+
while not curr_b.is_transaction_block:
|
|
805
|
+
curr_b = blocks.block_record(curr_b.prev_hash)
|
|
806
|
+
if not header_block.foliage_transaction_block.prev_transaction_block_hash == curr_b.header_hash:
|
|
807
|
+
log.error(
|
|
808
|
+
f"Prev BH: {header_block.foliage_transaction_block.prev_transaction_block_hash} "
|
|
809
|
+
f"{curr_b.header_hash} curr sb: {curr_b}"
|
|
810
|
+
)
|
|
811
|
+
return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)
|
|
812
|
+
|
|
813
|
+
# 25. The filter hash in the Foliage Block must be the hash of the filter
|
|
814
|
+
if check_filter:
|
|
815
|
+
if header_block.foliage_transaction_block.filter_hash != std_hash(header_block.transactions_filter):
|
|
816
|
+
return None, ValidationError(Err.INVALID_TRANSACTIONS_FILTER_HASH)
|
|
817
|
+
|
|
818
|
+
# 26a. The timestamp in Foliage Block must not be over 5 minutes in the future
|
|
819
|
+
if header_block.foliage_transaction_block.timestamp > int(time.time() + constants.MAX_FUTURE_TIME2):
|
|
820
|
+
return None, ValidationError(Err.TIMESTAMP_TOO_FAR_IN_FUTURE)
|
|
821
|
+
|
|
822
|
+
if prev_b is not None:
|
|
823
|
+
# 26b. The timestamp must be greater than the previous transaction block timestamp
|
|
824
|
+
prev_transaction_b = blocks.block_record(header_block.foliage_transaction_block.prev_transaction_block_hash)
|
|
825
|
+
assert prev_transaction_b.timestamp is not None
|
|
826
|
+
if header_block.foliage_transaction_block.timestamp <= prev_transaction_b.timestamp:
|
|
827
|
+
return None, ValidationError(Err.TIMESTAMP_TOO_FAR_IN_PAST)
|
|
828
|
+
return required_iters, None # Valid unfinished header block
|
|
829
|
+
|
|
830
|
+
|
|
831
|
+
def validate_finished_header_block(
|
|
832
|
+
constants: ConsensusConstants,
|
|
833
|
+
blocks: BlockRecordsProtocol,
|
|
834
|
+
header_block: HeaderBlock,
|
|
835
|
+
check_filter: bool,
|
|
836
|
+
expected_vs: ValidationState,
|
|
837
|
+
check_sub_epoch_summary: bool = True,
|
|
838
|
+
) -> tuple[Optional[uint64], Optional[ValidationError]]:
|
|
839
|
+
"""
|
|
840
|
+
Fully validates the header of a block. A header block is the same as a full block, but
|
|
841
|
+
without transactions and transaction info. Returns (required_iters, error).
|
|
842
|
+
"""
|
|
843
|
+
unfinished_header_block = UnfinishedHeaderBlock(
|
|
844
|
+
header_block.finished_sub_slots,
|
|
845
|
+
header_block.reward_chain_block.get_unfinished(),
|
|
846
|
+
header_block.challenge_chain_sp_proof,
|
|
847
|
+
header_block.reward_chain_sp_proof,
|
|
848
|
+
header_block.foliage,
|
|
849
|
+
header_block.foliage_transaction_block,
|
|
850
|
+
header_block.transactions_filter,
|
|
851
|
+
)
|
|
852
|
+
|
|
853
|
+
required_iters, validate_unfinished_err = validate_unfinished_header_block(
|
|
854
|
+
constants,
|
|
855
|
+
blocks,
|
|
856
|
+
unfinished_header_block,
|
|
857
|
+
check_filter,
|
|
858
|
+
expected_vs,
|
|
859
|
+
False,
|
|
860
|
+
check_sub_epoch_summary=check_sub_epoch_summary,
|
|
861
|
+
)
|
|
862
|
+
|
|
863
|
+
genesis_block = False
|
|
864
|
+
if validate_unfinished_err is not None:
|
|
865
|
+
return None, validate_unfinished_err
|
|
866
|
+
|
|
867
|
+
assert required_iters is not None
|
|
868
|
+
|
|
869
|
+
if header_block.height == 0:
|
|
870
|
+
prev_b: Optional[BlockRecord] = None
|
|
871
|
+
genesis_block = True
|
|
872
|
+
else:
|
|
873
|
+
prev_b = blocks.block_record(header_block.prev_header_hash)
|
|
874
|
+
new_sub_slot: bool = len(header_block.finished_sub_slots) > 0
|
|
875
|
+
|
|
876
|
+
ip_iters: uint64 = calculate_ip_iters(
|
|
877
|
+
constants,
|
|
878
|
+
expected_vs.ssi,
|
|
879
|
+
header_block.reward_chain_block.signage_point_index,
|
|
880
|
+
required_iters,
|
|
881
|
+
)
|
|
882
|
+
if not genesis_block:
|
|
883
|
+
assert prev_b is not None
|
|
884
|
+
# 27. Check block height
|
|
885
|
+
if header_block.height != prev_b.height + 1:
|
|
886
|
+
return None, ValidationError(Err.INVALID_HEIGHT)
|
|
887
|
+
|
|
888
|
+
# 28. Check weight
|
|
889
|
+
if header_block.weight != prev_b.weight + expected_vs.difficulty:
|
|
890
|
+
log.error(f"INVALID WEIGHT: {header_block} {prev_b} {expected_vs.difficulty}")
|
|
891
|
+
return None, ValidationError(Err.INVALID_WEIGHT)
|
|
892
|
+
else:
|
|
893
|
+
# 27b. Check genesis block height, weight, and prev block hash
|
|
894
|
+
if header_block.height != uint32(0):
|
|
895
|
+
return None, ValidationError(Err.INVALID_HEIGHT)
|
|
896
|
+
if header_block.weight != uint128(constants.DIFFICULTY_STARTING):
|
|
897
|
+
return None, ValidationError(Err.INVALID_WEIGHT)
|
|
898
|
+
if header_block.prev_header_hash != constants.GENESIS_CHALLENGE:
|
|
899
|
+
return None, ValidationError(Err.INVALID_PREV_BLOCK_HASH)
|
|
900
|
+
|
|
901
|
+
# RC vdf challenge is taken from more recent of (slot start, prev_block)
|
|
902
|
+
if genesis_block:
|
|
903
|
+
cc_vdf_output = ClassgroupElement.get_default_element()
|
|
904
|
+
ip_vdf_iters = ip_iters
|
|
905
|
+
if new_sub_slot:
|
|
906
|
+
rc_vdf_challenge = header_block.finished_sub_slots[-1].reward_chain.get_hash()
|
|
907
|
+
else:
|
|
908
|
+
rc_vdf_challenge = constants.GENESIS_CHALLENGE
|
|
909
|
+
else:
|
|
910
|
+
assert prev_b is not None
|
|
911
|
+
if new_sub_slot:
|
|
912
|
+
# slot start is more recent
|
|
913
|
+
rc_vdf_challenge = header_block.finished_sub_slots[-1].reward_chain.get_hash()
|
|
914
|
+
ip_vdf_iters = ip_iters
|
|
915
|
+
cc_vdf_output = ClassgroupElement.get_default_element()
|
|
916
|
+
|
|
917
|
+
else:
|
|
918
|
+
# Prev sb is more recent
|
|
919
|
+
rc_vdf_challenge = prev_b.reward_infusion_new_challenge
|
|
920
|
+
ip_vdf_iters = uint64(header_block.reward_chain_block.total_iters - prev_b.total_iters)
|
|
921
|
+
cc_vdf_output = prev_b.challenge_vdf_output
|
|
922
|
+
|
|
923
|
+
# 29. Check challenge chain infusion point VDF
|
|
924
|
+
if new_sub_slot:
|
|
925
|
+
cc_vdf_challenge = header_block.finished_sub_slots[-1].challenge_chain.get_hash()
|
|
926
|
+
else:
|
|
927
|
+
# Not first block in slot
|
|
928
|
+
if genesis_block:
|
|
929
|
+
# genesis block
|
|
930
|
+
cc_vdf_challenge = constants.GENESIS_CHALLENGE
|
|
931
|
+
else:
|
|
932
|
+
assert prev_b is not None
|
|
933
|
+
# Not genesis block, go back to first block in slot
|
|
934
|
+
curr = prev_b
|
|
935
|
+
while curr.finished_challenge_slot_hashes is None:
|
|
936
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
937
|
+
cc_vdf_challenge = curr.finished_challenge_slot_hashes[-1]
|
|
938
|
+
|
|
939
|
+
cc_target_vdf_info = VDFInfo(
|
|
940
|
+
cc_vdf_challenge,
|
|
941
|
+
ip_vdf_iters,
|
|
942
|
+
header_block.reward_chain_block.challenge_chain_ip_vdf.output,
|
|
943
|
+
)
|
|
944
|
+
if header_block.reward_chain_block.challenge_chain_ip_vdf != cc_target_vdf_info.replace(
|
|
945
|
+
number_of_iterations=ip_iters
|
|
946
|
+
):
|
|
947
|
+
expected = cc_target_vdf_info.replace(number_of_iterations=ip_iters)
|
|
948
|
+
log.error(f"{header_block.reward_chain_block.challenge_chain_ip_vdf}. expected {expected}")
|
|
949
|
+
log.error(f"Block: {header_block}")
|
|
950
|
+
return None, ValidationError(Err.INVALID_CC_IP_VDF)
|
|
951
|
+
if not header_block.challenge_chain_ip_proof.normalized_to_identity and not validate_vdf(
|
|
952
|
+
header_block.challenge_chain_ip_proof,
|
|
953
|
+
constants,
|
|
954
|
+
cc_vdf_output,
|
|
955
|
+
cc_target_vdf_info,
|
|
956
|
+
None,
|
|
957
|
+
):
|
|
958
|
+
log.error(f"Did not validate, output {cc_vdf_output}")
|
|
959
|
+
log.error(f"Block: {header_block}")
|
|
960
|
+
return None, ValidationError(Err.INVALID_CC_IP_VDF)
|
|
961
|
+
if header_block.challenge_chain_ip_proof.normalized_to_identity and not validate_vdf(
|
|
962
|
+
header_block.challenge_chain_ip_proof,
|
|
963
|
+
constants,
|
|
964
|
+
ClassgroupElement.get_default_element(),
|
|
965
|
+
header_block.reward_chain_block.challenge_chain_ip_vdf,
|
|
966
|
+
):
|
|
967
|
+
return None, ValidationError(Err.INVALID_CC_IP_VDF)
|
|
968
|
+
|
|
969
|
+
# 30. Check reward chain infusion point VDF
|
|
970
|
+
rc_target_vdf_info = VDFInfo(
|
|
971
|
+
rc_vdf_challenge,
|
|
972
|
+
ip_vdf_iters,
|
|
973
|
+
header_block.reward_chain_block.reward_chain_ip_vdf.output,
|
|
974
|
+
)
|
|
975
|
+
if not validate_vdf(
|
|
976
|
+
header_block.reward_chain_ip_proof,
|
|
977
|
+
constants,
|
|
978
|
+
ClassgroupElement.get_default_element(),
|
|
979
|
+
header_block.reward_chain_block.reward_chain_ip_vdf,
|
|
980
|
+
rc_target_vdf_info,
|
|
981
|
+
):
|
|
982
|
+
return None, ValidationError(Err.INVALID_RC_IP_VDF)
|
|
983
|
+
|
|
984
|
+
# 31. Check infused challenge chain infusion point VDF
|
|
985
|
+
if not genesis_block:
|
|
986
|
+
overflow = is_overflow_block(constants, header_block.reward_chain_block.signage_point_index)
|
|
987
|
+
deficit = calculate_deficit(
|
|
988
|
+
constants,
|
|
989
|
+
header_block.height,
|
|
990
|
+
prev_b,
|
|
991
|
+
overflow,
|
|
992
|
+
len(header_block.finished_sub_slots),
|
|
993
|
+
)
|
|
994
|
+
|
|
995
|
+
if header_block.reward_chain_block.infused_challenge_chain_ip_vdf is None:
|
|
996
|
+
# If we don't have an ICC chain, deficit must be 4 or 5
|
|
997
|
+
if deficit < constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK - 1:
|
|
998
|
+
return None, ValidationError(Err.INVALID_ICC_VDF)
|
|
999
|
+
else:
|
|
1000
|
+
assert header_block.infused_challenge_chain_ip_proof is not None
|
|
1001
|
+
# If we have an ICC chain, deficit must be 0, 1, 2 or 3
|
|
1002
|
+
if deficit >= constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK - 1:
|
|
1003
|
+
return (
|
|
1004
|
+
None,
|
|
1005
|
+
ValidationError(
|
|
1006
|
+
Err.INVALID_ICC_VDF,
|
|
1007
|
+
f"icc vdf and deficit is bigger or equal to {constants.MIN_BLOCKS_PER_CHALLENGE_BLOCK - 1}",
|
|
1008
|
+
),
|
|
1009
|
+
)
|
|
1010
|
+
if new_sub_slot:
|
|
1011
|
+
last_ss = header_block.finished_sub_slots[-1]
|
|
1012
|
+
assert last_ss.infused_challenge_chain is not None
|
|
1013
|
+
icc_vdf_challenge: bytes32 = last_ss.infused_challenge_chain.get_hash()
|
|
1014
|
+
icc_vdf_input: Optional[ClassgroupElement] = ClassgroupElement.get_default_element()
|
|
1015
|
+
else:
|
|
1016
|
+
assert prev_b is not None
|
|
1017
|
+
if prev_b.is_challenge_block(constants):
|
|
1018
|
+
icc_vdf_input = ClassgroupElement.get_default_element()
|
|
1019
|
+
else:
|
|
1020
|
+
icc_vdf_input = prev_b.infused_challenge_vdf_output
|
|
1021
|
+
curr = prev_b
|
|
1022
|
+
while curr.finished_infused_challenge_slot_hashes is None and not curr.is_challenge_block(constants):
|
|
1023
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
1024
|
+
|
|
1025
|
+
if curr.is_challenge_block(constants):
|
|
1026
|
+
icc_vdf_challenge = curr.challenge_block_info_hash
|
|
1027
|
+
else:
|
|
1028
|
+
assert curr.finished_infused_challenge_slot_hashes is not None
|
|
1029
|
+
icc_vdf_challenge = curr.finished_infused_challenge_slot_hashes[-1]
|
|
1030
|
+
|
|
1031
|
+
icc_target_vdf_info = VDFInfo(
|
|
1032
|
+
icc_vdf_challenge,
|
|
1033
|
+
ip_vdf_iters,
|
|
1034
|
+
header_block.reward_chain_block.infused_challenge_chain_ip_vdf.output,
|
|
1035
|
+
)
|
|
1036
|
+
|
|
1037
|
+
if icc_vdf_input is None or not validate_vdf(
|
|
1038
|
+
header_block.infused_challenge_chain_ip_proof,
|
|
1039
|
+
constants,
|
|
1040
|
+
icc_vdf_input,
|
|
1041
|
+
header_block.reward_chain_block.infused_challenge_chain_ip_vdf,
|
|
1042
|
+
icc_target_vdf_info,
|
|
1043
|
+
):
|
|
1044
|
+
return None, ValidationError(Err.INVALID_ICC_VDF, "invalid icc proof")
|
|
1045
|
+
else:
|
|
1046
|
+
if header_block.infused_challenge_chain_ip_proof is not None:
|
|
1047
|
+
return None, ValidationError(Err.INVALID_ICC_VDF)
|
|
1048
|
+
|
|
1049
|
+
# 32. Check reward block hash
|
|
1050
|
+
if header_block.foliage.reward_block_hash != header_block.reward_chain_block.get_hash():
|
|
1051
|
+
return None, ValidationError(Err.INVALID_REWARD_BLOCK_HASH)
|
|
1052
|
+
|
|
1053
|
+
# 33. Check reward block is_transaction_block
|
|
1054
|
+
if (
|
|
1055
|
+
header_block.foliage.foliage_transaction_block_hash is not None
|
|
1056
|
+
) != header_block.reward_chain_block.is_transaction_block:
|
|
1057
|
+
return None, ValidationError(Err.INVALID_FOLIAGE_BLOCK_PRESENCE)
|
|
1058
|
+
|
|
1059
|
+
return required_iters, None
|