chia-blockchain 2.5.0rc1__py3-none-any.whl → 2.5.1__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/_tests/README.md +1 -1
- chia/_tests/blockchain/blockchain_test_utils.py +24 -26
- chia/_tests/blockchain/test_augmented_chain.py +6 -8
- chia/_tests/blockchain/test_blockchain.py +409 -307
- chia/_tests/blockchain/test_blockchain_transactions.py +56 -75
- chia/_tests/blockchain/test_build_chains.py +11 -13
- chia/_tests/blockchain/test_get_block_generator.py +8 -8
- chia/_tests/blockchain/test_lookup_fork_chain.py +3 -4
- chia/_tests/build-init-files.py +3 -4
- chia/_tests/build-job-matrix.py +9 -9
- chia/_tests/check_sql_statements.py +2 -3
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +7 -5
- chia/_tests/clvm/test_chialisp_deserialization.py +8 -8
- chia/_tests/clvm/test_condition_codes.py +2 -2
- chia/_tests/clvm/test_curry_and_treehash.py +2 -4
- chia/_tests/clvm/test_message_conditions.py +184 -0
- chia/_tests/clvm/test_puzzle_compression.py +1 -2
- chia/_tests/clvm/test_puzzle_drivers.py +3 -3
- chia/_tests/clvm/test_puzzles.py +13 -18
- chia/_tests/clvm/test_singletons.py +17 -17
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +42 -45
- chia/_tests/cmds/conftest.py +2 -2
- chia/_tests/cmds/test_click_types.py +21 -16
- chia/_tests/cmds/test_cmd_framework.py +255 -35
- chia/_tests/cmds/test_cmds_util.py +2 -2
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_dev_gh.py +131 -0
- chia/_tests/cmds/test_farm_cmd.py +1 -2
- chia/_tests/cmds/test_show.py +6 -6
- chia/_tests/cmds/test_tx_config_args.py +2 -1
- chia/_tests/cmds/wallet/test_dao.py +23 -23
- chia/_tests/cmds/wallet/test_did.py +29 -29
- chia/_tests/cmds/wallet/test_nft.py +24 -23
- chia/_tests/cmds/wallet/test_notifications.py +8 -8
- chia/_tests/cmds/wallet/test_tx_decorators.py +3 -3
- chia/_tests/cmds/wallet/test_vcs.py +97 -73
- chia/_tests/cmds/wallet/test_wallet.py +74 -75
- chia/_tests/cmds/wallet/test_wallet_check.py +5 -7
- chia/_tests/conftest.py +153 -38
- chia/_tests/connection_utils.py +7 -6
- chia/_tests/core/cmds/test_beta.py +3 -3
- chia/_tests/core/cmds/test_keys.py +6 -6
- chia/_tests/core/cmds/test_wallet.py +3 -3
- chia/_tests/core/consensus/test_block_creation.py +3 -5
- chia/_tests/core/custom_types/test_coin.py +1 -3
- chia/_tests/core/custom_types/test_spend_bundle.py +3 -4
- chia/_tests/core/daemon/test_daemon.py +58 -58
- chia/_tests/core/daemon/test_keychain_proxy.py +2 -1
- chia/_tests/core/data_layer/conftest.py +4 -3
- chia/_tests/core/data_layer/test_data_cli.py +1 -2
- chia/_tests/core/data_layer/test_data_layer.py +5 -5
- chia/_tests/core/data_layer/test_data_layer_util.py +8 -9
- chia/_tests/core/data_layer/test_data_rpc.py +75 -93
- chia/_tests/core/data_layer/test_data_store.py +38 -37
- chia/_tests/core/data_layer/test_data_store_schema.py +11 -11
- chia/_tests/core/data_layer/util.py +11 -10
- chia/_tests/core/farmer/test_farmer_api.py +6 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +5 -10
- chia/_tests/core/full_node/ram_db.py +2 -2
- chia/_tests/core/full_node/stores/test_block_store.py +113 -11
- chia/_tests/core/full_node/stores/test_coin_store.py +37 -28
- chia/_tests/core/full_node/stores/test_full_node_store.py +34 -30
- chia/_tests/core/full_node/stores/test_hint_store.py +3 -4
- chia/_tests/core/full_node/test_address_manager.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +1 -1
- chia/_tests/core/full_node/test_conditions.py +10 -12
- chia/_tests/core/full_node/test_full_node.py +2077 -1822
- chia/_tests/core/full_node/test_generator_tools.py +4 -4
- chia/_tests/core/full_node/test_hint_management.py +2 -2
- chia/_tests/core/full_node/test_performance.py +2 -5
- chia/_tests/core/full_node/test_subscriptions.py +4 -4
- chia/_tests/core/full_node/test_tx_processing_queue.py +5 -4
- chia/_tests/core/make_block_generator.py +5 -7
- chia/_tests/core/mempool/test_mempool.py +205 -208
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +5 -5
- chia/_tests/core/mempool/test_mempool_item_queries.py +2 -4
- chia/_tests/core/mempool/test_mempool_manager.py +109 -80
- chia/_tests/core/mempool/test_mempool_performance.py +3 -4
- chia/_tests/core/mempool/test_singleton_fast_forward.py +12 -12
- chia/_tests/core/server/flood.py +6 -4
- chia/_tests/core/server/serve.py +10 -7
- chia/_tests/core/server/test_api_protocol.py +21 -0
- chia/_tests/core/server/test_capabilities.py +3 -5
- chia/_tests/core/server/test_dos.py +15 -16
- chia/_tests/core/server/test_loop.py +14 -10
- chia/_tests/core/server/test_node_discovery.py +1 -2
- chia/_tests/core/server/test_rate_limits.py +156 -44
- chia/_tests/core/server/test_server.py +8 -7
- chia/_tests/core/services/test_services.py +59 -37
- chia/_tests/core/ssl/test_ssl.py +5 -3
- chia/_tests/core/test_cost_calculation.py +5 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_db_conversion.py +5 -4
- chia/_tests/core/test_db_validation.py +6 -5
- chia/_tests/core/test_farmer_harvester_rpc.py +8 -7
- chia/_tests/core/test_filter.py +3 -5
- chia/_tests/core/test_full_node_rpc.py +64 -90
- chia/_tests/core/test_merkle_set.py +10 -10
- chia/_tests/core/test_program.py +2 -4
- chia/_tests/core/test_rpc_util.py +1 -2
- chia/_tests/core/test_seeder.py +124 -12
- chia/_tests/core/util/test_block_cache.py +5 -5
- chia/_tests/core/util/test_cached_bls.py +3 -3
- chia/_tests/core/util/test_config.py +13 -13
- chia/_tests/core/util/test_files.py +2 -2
- chia/_tests/core/util/test_jsonify.py +9 -9
- chia/_tests/core/util/test_keychain.py +13 -5
- chia/_tests/core/util/test_keyring_wrapper.py +6 -5
- chia/_tests/core/util/test_log_exceptions.py +3 -3
- chia/_tests/core/util/test_streamable.py +38 -38
- chia/_tests/db/test_db_wrapper.py +13 -12
- chia/_tests/environments/common.py +2 -2
- chia/_tests/environments/full_node.py +2 -2
- chia/_tests/environments/wallet.py +109 -48
- chia/_tests/farmer_harvester/test_farmer.py +35 -35
- chia/_tests/farmer_harvester/test_farmer_harvester.py +17 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +73 -46
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +8 -8
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +47 -47
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +6 -7
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +11 -11
- chia/_tests/generator/test_compression.py +13 -30
- chia/_tests/generator/test_generator_types.py +3 -3
- chia/_tests/generator/test_rom.py +7 -9
- chia/_tests/plot_sync/test_delta.py +2 -3
- chia/_tests/plot_sync/test_plot_sync.py +25 -24
- chia/_tests/plot_sync/test_receiver.py +9 -9
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +27 -26
- chia/_tests/plot_sync/util.py +2 -1
- chia/_tests/plotting/test_plot_manager.py +54 -11
- chia/_tests/plotting/util.py +2 -3
- chia/_tests/pools/test_pool_cli_parsing.py +128 -0
- chia/_tests/pools/test_pool_cmdline.py +993 -15
- chia/_tests/pools/test_pool_config.py +3 -5
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +10 -11
- chia/_tests/pools/test_pool_rpc.py +203 -90
- chia/_tests/pools/test_pool_wallet.py +12 -8
- chia/_tests/pools/test_wallet_pool_store.py +3 -3
- chia/_tests/process_junit.py +16 -17
- chia/_tests/rpc/test_rpc_client.py +59 -2
- chia/_tests/rpc/test_rpc_server.py +183 -0
- chia/_tests/simulation/test_simulation.py +5 -5
- chia/_tests/simulation/test_simulator.py +8 -10
- chia/_tests/simulation/test_start_simulator.py +5 -4
- chia/_tests/timelord/test_new_peak.py +19 -19
- chia/_tests/tools/test_run_block.py +1 -2
- chia/_tests/tools/test_virtual_project.py +591 -0
- chia/_tests/util/benchmark_cost.py +9 -9
- chia/_tests/util/benchmarks.py +1 -2
- chia/_tests/util/blockchain.py +12 -11
- chia/_tests/util/blockchain_mock.py +15 -15
- chia/_tests/util/build_network_protocol_files.py +12 -12
- chia/_tests/util/db_connection.py +3 -2
- chia/_tests/util/full_sync.py +14 -6
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/generator_tools_testing.py +5 -7
- chia/_tests/util/get_name_puzzle_conditions.py +52 -0
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +59 -106
- chia/_tests/util/network_protocol_data.py +7 -9
- chia/_tests/util/protocol_messages_json.py +112 -111
- chia/_tests/util/rpc.py +3 -0
- chia/_tests/util/run_block.py +16 -16
- chia/_tests/util/setup_nodes.py +25 -23
- chia/{clvm → _tests/util}/spend_sim.py +59 -55
- chia/_tests/util/split_managers.py +12 -9
- chia/_tests/util/temp_file.py +1 -1
- chia/_tests/util/test_action_scope.py +2 -1
- chia/_tests/util/test_async_pool.py +8 -8
- chia/_tests/util/test_build_job_matrix.py +2 -3
- chia/_tests/util/test_condition_tools.py +4 -6
- chia/_tests/util/test_config.py +5 -5
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +19 -11
- chia/_tests/util/test_limited_semaphore.py +4 -3
- chia/_tests/util/test_logging_filter.py +2 -3
- chia/_tests/util/test_misc.py +29 -28
- chia/_tests/util/test_network.py +32 -31
- chia/_tests/util/test_network_protocol_files.py +2 -3
- chia/_tests/util/test_network_protocol_json.py +1 -0
- chia/_tests/util/test_network_protocol_test.py +18 -19
- chia/_tests/util/test_paginator.py +3 -4
- chia/_tests/util/test_pprint.py +1 -1
- chia/_tests/util/test_priority_mutex.py +18 -17
- chia/_tests/util/test_recursive_replace.py +2 -2
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/test_timing.py +1 -1
- chia/_tests/util/test_trusted_peer.py +2 -2
- chia/_tests/util/time_out_assert.py +43 -6
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +117 -29
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +15 -15
- chia/_tests/wallet/cat_wallet/test_trades.py +50 -28
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -5
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +6 -6
- chia/_tests/wallet/clawback/test_clawback_metadata.py +1 -2
- chia/_tests/wallet/conftest.py +135 -74
- chia/_tests/wallet/dao_wallet/test_dao_clvm.py +25 -17
- chia/_tests/wallet/dao_wallet/test_dao_wallets.py +75 -75
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +10 -12
- chia/_tests/wallet/db_wallet/test_dl_offers.py +6 -6
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +18 -18
- chia/_tests/wallet/did_wallet/test_did.py +1277 -474
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +12 -11
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +115 -105
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +6 -7
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +16 -16
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +3 -3
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +38 -12
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +1 -1
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +31 -33
- chia/_tests/wallet/rpc/test_wallet_rpc.py +218 -171
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +36 -37
- chia/_tests/wallet/sync/test_wallet_sync.py +241 -78
- chia/_tests/wallet/test_address_type.py +20 -20
- chia/_tests/wallet/test_clvm_streamable.py +5 -5
- chia/_tests/wallet/test_coin_management.py +354 -0
- chia/_tests/wallet/test_coin_selection.py +34 -35
- chia/_tests/wallet/test_conditions.py +28 -16
- chia/_tests/wallet/test_debug_spend_bundle.py +156 -14
- chia/_tests/wallet/test_new_wallet_protocol.py +29 -31
- chia/_tests/wallet/test_nft_store.py +1 -2
- chia/_tests/wallet/test_notifications.py +2 -2
- chia/_tests/wallet/test_offer_parsing_performance.py +1 -1
- chia/_tests/wallet/test_puzzle_store.py +2 -3
- chia/_tests/wallet/test_sign_coin_spends.py +3 -3
- chia/_tests/wallet/test_signer_protocol.py +33 -34
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +29 -29
- chia/_tests/wallet/test_taproot.py +1 -1
- chia/_tests/wallet/test_transaction_store.py +23 -19
- chia/_tests/wallet/test_util.py +36 -32
- chia/_tests/wallet/test_wallet.py +37 -37
- chia/_tests/wallet/test_wallet_action_scope.py +8 -8
- chia/_tests/wallet/test_wallet_blockchain.py +4 -6
- chia/_tests/wallet/test_wallet_coin_store.py +34 -34
- chia/_tests/wallet/test_wallet_node.py +69 -72
- chia/_tests/wallet/test_wallet_retry.py +3 -3
- chia/_tests/wallet/test_wallet_state_manager.py +12 -5
- chia/_tests/wallet/test_wallet_trade_store.py +2 -2
- chia/_tests/wallet/test_wallet_utils.py +5 -4
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -3
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +18 -18
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +69 -40
- chia/_tests/wallet/wallet_block_tools.py +27 -27
- chia/_tests/weight_proof/test_weight_proof.py +30 -30
- chia/apis.py +19 -0
- chia/cmds/beta.py +8 -7
- chia/cmds/beta_funcs.py +15 -11
- chia/cmds/check_wallet_db.py +29 -27
- chia/cmds/chia.py +17 -9
- chia/cmds/cmd_classes.py +87 -79
- chia/cmds/cmd_helpers.py +242 -0
- chia/cmds/cmds_util.py +56 -66
- chia/cmds/coin_funcs.py +168 -153
- chia/cmds/coins.py +156 -194
- chia/cmds/configure.py +4 -3
- chia/cmds/dao.py +89 -33
- chia/cmds/dao_funcs.py +55 -33
- chia/cmds/data.py +7 -6
- chia/cmds/data_funcs.py +26 -21
- chia/cmds/db.py +4 -3
- chia/cmds/db_backup_func.py +2 -2
- chia/cmds/db_upgrade_func.py +3 -3
- chia/cmds/db_validate_func.py +2 -2
- chia/cmds/dev.py +2 -0
- chia/cmds/farm.py +18 -5
- chia/cmds/farm_funcs.py +17 -24
- chia/cmds/gh.py +275 -0
- chia/cmds/init.py +4 -11
- chia/cmds/init_funcs.py +9 -9
- chia/cmds/installers.py +5 -3
- chia/cmds/keys.py +56 -39
- chia/cmds/keys_funcs.py +30 -31
- chia/cmds/netspace.py +6 -3
- chia/cmds/netspace_funcs.py +3 -2
- chia/cmds/param_types.py +16 -6
- chia/cmds/passphrase.py +8 -7
- chia/cmds/passphrase_funcs.py +7 -61
- chia/cmds/peer.py +2 -1
- chia/cmds/peer_funcs.py +5 -5
- chia/cmds/plotnft.py +207 -153
- chia/cmds/plotnft_funcs.py +205 -174
- chia/cmds/plots.py +14 -6
- chia/cmds/plotters.py +2 -1
- chia/cmds/rpc.py +48 -28
- chia/cmds/show.py +2 -1
- chia/cmds/show_funcs.py +7 -6
- chia/cmds/signer.py +50 -58
- chia/cmds/sim.py +22 -14
- chia/cmds/sim_funcs.py +11 -11
- chia/cmds/start.py +3 -3
- chia/cmds/start_funcs.py +9 -12
- chia/cmds/stop.py +4 -3
- chia/cmds/units.py +1 -3
- chia/cmds/wallet.py +252 -96
- chia/cmds/wallet_funcs.py +217 -143
- chia/consensus/block_body_validation.py +133 -86
- chia/consensus/block_creation.py +42 -21
- chia/consensus/block_header_validation.py +32 -37
- chia/consensus/block_record.py +1 -2
- chia/consensus/blockchain.py +167 -180
- chia/consensus/blockchain_interface.py +10 -10
- chia/consensus/constants.py +2 -2
- chia/consensus/default_constants.py +3 -4
- chia/consensus/difficulty_adjustment.py +5 -5
- chia/consensus/find_fork_point.py +5 -5
- chia/consensus/full_block_to_block_record.py +4 -4
- chia/consensus/get_block_challenge.py +2 -2
- chia/consensus/get_block_generator.py +4 -3
- chia/consensus/multiprocess_validation.py +207 -304
- chia/consensus/vdf_info_computation.py +3 -3
- chia/daemon/client.py +46 -27
- chia/daemon/keychain_proxy.py +10 -9
- chia/daemon/keychain_server.py +18 -18
- chia/daemon/server.py +103 -113
- chia/daemon/windows_signal.py +2 -2
- chia/data_layer/data_layer.py +64 -76
- chia/data_layer/data_layer_api.py +8 -0
- chia/data_layer/data_layer_errors.py +3 -3
- chia/data_layer/data_layer_server.py +2 -2
- chia/data_layer/data_layer_util.py +71 -71
- chia/data_layer/data_layer_wallet.py +63 -67
- chia/data_layer/data_store.py +72 -72
- chia/data_layer/dl_wallet_store.py +10 -10
- chia/data_layer/download_data.py +5 -5
- chia/data_layer/s3_plugin_service.py +9 -9
- chia/data_layer/util/benchmark.py +0 -1
- chia/data_layer/util/plugin.py +2 -3
- chia/farmer/farmer.py +46 -43
- chia/farmer/farmer_api.py +27 -21
- chia/full_node/block_height_map.py +6 -6
- chia/full_node/block_store.py +41 -35
- chia/full_node/coin_store.py +42 -41
- chia/full_node/fee_estimate.py +2 -2
- chia/full_node/fee_estimation.py +1 -2
- chia/full_node/fee_history.py +5 -6
- chia/full_node/fee_tracker.py +24 -24
- chia/full_node/full_node.py +574 -300
- chia/full_node/full_node_api.py +181 -130
- chia/full_node/full_node_store.py +43 -43
- chia/full_node/hint_management.py +4 -4
- chia/full_node/hint_store.py +9 -10
- chia/full_node/mempool.py +25 -19
- chia/full_node/mempool_check_conditions.py +11 -42
- chia/full_node/mempool_manager.py +48 -53
- chia/full_node/pending_tx_cache.py +9 -9
- chia/full_node/subscriptions.py +23 -24
- chia/full_node/sync_store.py +8 -7
- chia/full_node/tx_processing_queue.py +3 -3
- chia/full_node/util/__init__.py +0 -0
- chia/full_node/weight_proof.py +79 -78
- chia/harvester/harvester.py +9 -8
- chia/harvester/harvester_api.py +19 -13
- chia/introducer/introducer.py +7 -5
- chia/introducer/introducer_api.py +9 -3
- chia/legacy/keyring.py +6 -5
- chia/plot_sync/delta.py +8 -8
- chia/plot_sync/receiver.py +12 -11
- chia/plot_sync/sender.py +15 -12
- chia/plotters/bladebit.py +12 -12
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +8 -8
- chia/plotters/plotters.py +6 -6
- chia/plotters/plotters_util.py +6 -4
- chia/plotting/cache.py +8 -7
- chia/plotting/check_plots.py +8 -8
- chia/plotting/create_plots.py +6 -6
- chia/plotting/manager.py +22 -22
- chia/plotting/util.py +31 -19
- chia/pools/pool_config.py +7 -7
- chia/pools/pool_puzzles.py +16 -16
- chia/pools/pool_wallet.py +64 -57
- chia/pools/pool_wallet_info.py +3 -3
- chia/protocols/full_node_protocol.py +3 -3
- chia/protocols/harvester_protocol.py +12 -12
- chia/protocols/introducer_protocol.py +1 -2
- chia/protocols/protocol_message_types.py +4 -4
- chia/protocols/protocol_state_machine.py +2 -2
- chia/protocols/protocol_timing.py +1 -0
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +2 -2
- chia/protocols/wallet_protocol.py +33 -33
- chia/rpc/crawler_rpc_api.py +12 -7
- chia/rpc/data_layer_rpc_api.py +49 -44
- chia/rpc/data_layer_rpc_client.py +41 -41
- chia/rpc/data_layer_rpc_util.py +7 -11
- chia/rpc/farmer_rpc_api.py +32 -27
- chia/rpc/farmer_rpc_client.py +14 -14
- chia/rpc/full_node_rpc_api.py +53 -48
- chia/rpc/full_node_rpc_client.py +30 -30
- chia/rpc/harvester_rpc_api.py +16 -11
- chia/rpc/harvester_rpc_client.py +6 -6
- chia/rpc/rpc_client.py +34 -14
- chia/rpc/rpc_server.py +117 -43
- chia/rpc/timelord_rpc_api.py +9 -4
- chia/rpc/util.py +11 -211
- chia/rpc/wallet_request_types.py +276 -60
- chia/rpc/wallet_rpc_api.py +563 -399
- chia/rpc/wallet_rpc_client.py +220 -250
- chia/seeder/crawl_store.py +6 -8
- chia/seeder/crawler.py +23 -36
- chia/seeder/crawler_api.py +28 -22
- chia/seeder/dns_server.py +99 -50
- chia/seeder/start_crawler.py +13 -9
- chia/server/address_manager.py +19 -19
- chia/server/address_manager_store.py +17 -17
- chia/server/api_protocol.py +106 -1
- chia/server/capabilities.py +3 -3
- chia/server/chia_policy.py +17 -16
- chia/server/introducer_peers.py +3 -3
- chia/server/node_discovery.py +34 -38
- chia/server/rate_limit_numbers.py +26 -16
- chia/server/rate_limits.py +67 -27
- chia/server/server.py +52 -31
- chia/server/signal_handlers.py +6 -3
- chia/server/ssl_context.py +5 -5
- chia/server/start_data_layer.py +37 -23
- chia/server/start_farmer.py +28 -16
- chia/server/start_full_node.py +29 -23
- chia/server/start_harvester.py +28 -15
- chia/server/start_introducer.py +27 -15
- chia/server/start_service.py +17 -29
- chia/server/start_timelord.py +25 -18
- chia/server/start_wallet.py +22 -18
- chia/server/upnp.py +4 -3
- chia/server/ws_connection.py +68 -54
- chia/simulator/add_blocks_in_batches.py +54 -0
- chia/simulator/block_tools.py +65 -64
- chia/simulator/full_node_simulator.py +66 -74
- chia/simulator/setup_services.py +10 -9
- chia/simulator/simulator_full_node_rpc_api.py +12 -14
- chia/simulator/simulator_full_node_rpc_client.py +3 -5
- chia/simulator/simulator_test_tools.py +8 -7
- chia/simulator/socket.py +1 -4
- chia/simulator/ssl_certs.py +5 -5
- chia/simulator/ssl_certs_1.py +2 -4
- chia/simulator/ssl_certs_10.py +2 -4
- chia/simulator/ssl_certs_2.py +2 -4
- chia/simulator/ssl_certs_3.py +2 -4
- chia/simulator/ssl_certs_4.py +2 -4
- chia/simulator/ssl_certs_5.py +2 -4
- chia/simulator/ssl_certs_6.py +2 -4
- chia/simulator/ssl_certs_7.py +2 -4
- chia/simulator/ssl_certs_8.py +2 -4
- chia/simulator/ssl_certs_9.py +2 -4
- chia/simulator/start_simulator.py +14 -6
- chia/simulator/wallet_tools.py +21 -20
- chia/ssl/create_ssl.py +11 -11
- chia/timelord/iters_from_block.py +2 -2
- chia/timelord/timelord.py +57 -33
- chia/timelord/timelord_api.py +12 -6
- chia/timelord/timelord_launcher.py +10 -8
- chia/timelord/timelord_state.py +5 -5
- chia/types/block_protocol.py +2 -2
- chia/types/blockchain_format/coin.py +3 -3
- chia/types/blockchain_format/program.py +17 -18
- chia/types/blockchain_format/tree_hash.py +9 -9
- chia/types/coin_spend.py +8 -8
- chia/types/condition_with_args.py +1 -2
- chia/types/eligible_coin_spends.py +16 -15
- chia/types/generator_types.py +1 -2
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +7 -7
- chia/types/mempool_submission_status.py +2 -2
- chia/types/peer_info.py +1 -1
- chia/types/spend_bundle.py +1 -2
- chia/types/transaction_queue_entry.py +2 -2
- chia/types/unfinished_header_block.py +2 -2
- chia/types/validation_state.py +14 -0
- chia/types/weight_proof.py +5 -6
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +6 -4
- chia/util/augmented_chain.py +13 -9
- chia/util/batches.py +5 -2
- chia/util/bech32m.py +14 -11
- chia/util/beta_metrics.py +5 -4
- chia/util/block_cache.py +5 -5
- chia/util/byte_types.py +2 -0
- chia/util/check_fork_next_block.py +3 -2
- chia/util/chia_logging.py +41 -21
- chia/util/collection.py +3 -3
- chia/util/condition_tools.py +18 -18
- chia/util/config.py +26 -25
- chia/util/cpu.py +2 -0
- chia/util/db_synchronous.py +2 -0
- chia/util/db_version.py +2 -0
- chia/util/db_wrapper.py +13 -10
- chia/util/default_root.py +17 -0
- chia/util/dump_keyring.py +6 -6
- chia/util/errors.py +5 -3
- chia/util/file_keyring.py +22 -33
- chia/util/files.py +2 -0
- chia/util/full_block_utils.py +31 -7
- chia/util/generator_tools.py +18 -8
- chia/util/hash.py +3 -1
- chia/util/initial-config.yaml +19 -0
- chia/util/inline_executor.py +2 -0
- chia/util/ip_address.py +39 -0
- chia/util/json_util.py +0 -4
- chia/util/keychain.py +27 -24
- chia/util/keyring_wrapper.py +65 -4
- chia/util/limited_semaphore.py +3 -1
- chia/util/lock.py +4 -2
- chia/util/log_exceptions.py +5 -2
- chia/util/logging.py +3 -1
- chia/util/lru_cache.py +2 -0
- chia/util/math.py +4 -4
- chia/util/network.py +15 -73
- chia/util/paginator.py +3 -1
- chia/util/path.py +2 -0
- chia/util/permissions.py +3 -2
- chia/util/prev_transaction_block.py +1 -3
- chia/util/priority_mutex.py +6 -3
- chia/util/profiler.py +7 -4
- chia/util/recursive_replace.py +2 -0
- chia/util/safe_cancel_task.py +2 -0
- chia/util/service_groups.py +2 -2
- chia/util/setproctitle.py +2 -0
- chia/util/significant_bits.py +2 -0
- chia/util/ssl_check.py +11 -11
- chia/util/streamable.py +44 -56
- chia/util/task_referencer.py +59 -0
- chia/util/task_timing.py +22 -18
- chia/util/timing.py +4 -1
- chia/util/vdf_prover.py +2 -3
- chia/util/virtual_project_analysis.py +540 -0
- chia/util/ws_message.py +6 -6
- chia/wallet/cat_wallet/cat_info.py +3 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +3 -3
- chia/wallet/cat_wallet/cat_utils.py +5 -4
- chia/wallet/cat_wallet/cat_wallet.py +56 -70
- chia/wallet/cat_wallet/dao_cat_info.py +3 -3
- chia/wallet/cat_wallet/dao_cat_wallet.py +18 -18
- chia/wallet/cat_wallet/lineage_store.py +2 -2
- chia/wallet/coin_selection.py +15 -15
- chia/wallet/conditions.py +257 -71
- chia/wallet/dao_wallet/dao_info.py +4 -4
- chia/wallet/dao_wallet/dao_utils.py +43 -42
- chia/wallet/dao_wallet/dao_wallet.py +66 -68
- chia/wallet/db_wallet/db_wallet_puzzles.py +12 -8
- chia/wallet/derive_keys.py +11 -11
- chia/wallet/did_wallet/did_info.py +3 -3
- chia/wallet/did_wallet/did_wallet.py +56 -47
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -6
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/nft_info.py +4 -4
- chia/wallet/nft_wallet/nft_puzzles.py +16 -16
- chia/wallet/nft_wallet/nft_wallet.py +90 -89
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +2 -2
- chia/wallet/nft_wallet/transfer_program_puzzle.py +2 -2
- chia/wallet/nft_wallet/uncurry_nft.py +2 -2
- chia/wallet/notification_manager.py +5 -5
- chia/wallet/notification_store.py +6 -6
- chia/wallet/outer_puzzles.py +2 -2
- chia/wallet/payment.py +4 -5
- chia/wallet/puzzle_drivers.py +4 -4
- chia/wallet/puzzles/clawback/drivers.py +5 -5
- chia/wallet/puzzles/clawback/puzzle_decorator.py +7 -7
- chia/wallet/puzzles/load_clvm.py +2 -3
- chia/wallet/puzzles/p2_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_conditions.py +1 -2
- chia/wallet/puzzles/p2_delegated_puzzle.py +2 -3
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +3 -4
- chia/wallet/puzzles/p2_m_of_n_delegate_direct.py +1 -2
- chia/wallet/puzzles/p2_puzzle_hash.py +1 -2
- chia/wallet/puzzles/puzzle_utils.py +7 -7
- chia/wallet/puzzles/singleton_top_layer.py +6 -5
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +6 -5
- chia/wallet/puzzles/tails.py +34 -30
- chia/wallet/signer_protocol.py +7 -8
- chia/wallet/singleton.py +4 -4
- chia/wallet/trade_manager.py +155 -141
- chia/wallet/trade_record.py +5 -5
- chia/wallet/trading/offer.py +100 -101
- chia/wallet/trading/trade_store.py +14 -14
- chia/wallet/transaction_record.py +31 -16
- chia/wallet/util/address_type.py +4 -4
- chia/wallet/util/blind_signer_tl.py +8 -12
- chia/wallet/util/clvm_streamable.py +15 -15
- chia/wallet/util/compute_hints.py +5 -5
- chia/wallet/util/compute_memos.py +4 -6
- chia/wallet/util/curry_and_treehash.py +3 -2
- chia/wallet/util/debug_spend_bundle.py +6 -8
- chia/wallet/util/merkle_tree.py +10 -10
- chia/wallet/util/merkle_utils.py +10 -10
- chia/wallet/util/new_peak_queue.py +3 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/{util → wallet/util}/pprint.py +2 -3
- chia/wallet/util/puzzle_compression.py +3 -4
- chia/wallet/util/puzzle_decorator.py +10 -10
- chia/wallet/util/query_filter.py +9 -10
- chia/wallet/util/tx_config.py +12 -12
- chia/wallet/util/wallet_sync_utils.py +24 -21
- chia/wallet/util/wallet_types.py +9 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +28 -27
- chia/wallet/vc_wallet/cr_cat_wallet.py +42 -40
- chia/wallet/vc_wallet/cr_outer_puzzle.py +4 -4
- chia/wallet/vc_wallet/vc_drivers.py +16 -16
- chia/wallet/vc_wallet/vc_store.py +9 -9
- chia/wallet/vc_wallet/vc_wallet.py +35 -35
- chia/wallet/wallet.py +54 -54
- chia/wallet/wallet_action_scope.py +14 -13
- chia/wallet/wallet_blockchain.py +10 -10
- chia/wallet/wallet_coin_record.py +2 -2
- chia/wallet/wallet_coin_store.py +10 -10
- chia/wallet/wallet_info.py +1 -2
- chia/wallet/wallet_interested_store.py +5 -5
- chia/wallet/wallet_nft_store.py +6 -6
- chia/wallet/wallet_node.py +72 -76
- chia/wallet/wallet_node_api.py +33 -27
- chia/wallet/wallet_pool_store.py +1 -2
- chia/wallet/wallet_protocol.py +15 -15
- chia/wallet/wallet_puzzle_store.py +35 -4
- chia/wallet/wallet_retry_store.py +2 -2
- chia/wallet/wallet_singleton_store.py +10 -9
- chia/wallet/wallet_spend_bundle.py +4 -20
- chia/wallet/wallet_state_manager.py +223 -224
- chia/wallet/wallet_transaction_store.py +44 -18
- chia/wallet/wallet_user_store.py +2 -2
- chia/wallet/wallet_weight_proof_handler.py +2 -2
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/LICENSE +1 -1
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/METADATA +67 -72
- chia_blockchain-2.5.1.dist-info/RECORD +1042 -0
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/WHEEL +1 -1
- mozilla-ca/cacert.pem +32 -87
- chia/_tests/cmds/wallet/test_coins.py +0 -195
- chia/consensus/block_root_validation.py +0 -46
- chia/util/api_decorators.py +0 -89
- chia_blockchain-2.5.0rc1.dist-info/RECORD +0 -1028
- {chia_blockchain-2.5.0rc1.dist-info → chia_blockchain-2.5.1.dist-info}/entry_points.txt +0 -0
|
@@ -2,25 +2,24 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import collections
|
|
4
4
|
import logging
|
|
5
|
+
from collections.abc import Awaitable, Collection
|
|
5
6
|
from dataclasses import dataclass, field
|
|
6
|
-
from typing import
|
|
7
|
+
from typing import Callable, Optional, Union
|
|
7
8
|
|
|
8
|
-
from chia_rs import
|
|
9
|
+
from chia_rs import SpendBundleConditions, compute_merkle_set_root
|
|
9
10
|
from chiabip158 import PyBIP158
|
|
10
11
|
|
|
11
12
|
from chia.consensus.block_record import BlockRecord
|
|
12
13
|
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
|
13
|
-
from chia.consensus.block_root_validation import validate_block_merkle_roots
|
|
14
14
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
15
15
|
from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
|
|
16
16
|
from chia.consensus.constants import ConsensusConstants
|
|
17
17
|
from chia.full_node.mempool_check_conditions import mempool_check_time_locks
|
|
18
|
-
from chia.types.blockchain_format.coin import Coin
|
|
18
|
+
from chia.types.blockchain_format.coin import Coin, hash_coin_ids
|
|
19
19
|
from chia.types.blockchain_format.sized_bytes import bytes32
|
|
20
20
|
from chia.types.coin_record import CoinRecord
|
|
21
21
|
from chia.types.full_block import FullBlock
|
|
22
22
|
from chia.types.unfinished_block import UnfinishedBlock
|
|
23
|
-
from chia.util.condition_tools import pkm_pairs
|
|
24
23
|
from chia.util.errors import Err
|
|
25
24
|
from chia.util.hash import std_hash
|
|
26
25
|
from chia.util.ints import uint32, uint64
|
|
@@ -68,13 +67,13 @@ class ForkInfo:
|
|
|
68
67
|
# the header hash of the peak block of this fork
|
|
69
68
|
peak_hash: bytes32
|
|
70
69
|
# The additions include coinbase additions
|
|
71
|
-
additions_since_fork:
|
|
70
|
+
additions_since_fork: dict[bytes32, ForkAdd] = field(default_factory=dict)
|
|
72
71
|
# coin-id, ForkRem
|
|
73
|
-
removals_since_fork:
|
|
72
|
+
removals_since_fork: dict[bytes32, ForkRem] = field(default_factory=dict)
|
|
74
73
|
# the header hashes of the blocks, starting with the one-past fork_height
|
|
75
74
|
# i.e. the header hash of fork_height + 1 is stored in block_hashes[0]
|
|
76
75
|
# followed by fork_height + 2, and so on.
|
|
77
|
-
block_hashes:
|
|
76
|
+
block_hashes: list[bytes32] = field(default_factory=list)
|
|
78
77
|
|
|
79
78
|
def reset(self, fork_height: int, header_hash: bytes32) -> None:
|
|
80
79
|
self.fork_height = fork_height
|
|
@@ -110,6 +109,36 @@ class ForkInfo:
|
|
|
110
109
|
assert coin.name() not in self.additions_since_fork
|
|
111
110
|
self.additions_since_fork[coin.name()] = ForkAdd(coin, block.height, timestamp, None, True)
|
|
112
111
|
|
|
112
|
+
def include_block(
|
|
113
|
+
self,
|
|
114
|
+
additions: list[tuple[Coin, Optional[bytes]]],
|
|
115
|
+
removals: list[Coin],
|
|
116
|
+
block: FullBlock,
|
|
117
|
+
header_hash: bytes32,
|
|
118
|
+
) -> None:
|
|
119
|
+
height = block.height
|
|
120
|
+
|
|
121
|
+
assert self.peak_height == height - 1
|
|
122
|
+
|
|
123
|
+
assert len(self.block_hashes) == self.peak_height - self.fork_height
|
|
124
|
+
assert block.height == self.fork_height + 1 + len(self.block_hashes)
|
|
125
|
+
self.block_hashes.append(header_hash)
|
|
126
|
+
|
|
127
|
+
self.peak_height = int(block.height)
|
|
128
|
+
self.peak_hash = header_hash
|
|
129
|
+
|
|
130
|
+
if block.foliage_transaction_block is not None:
|
|
131
|
+
timestamp = block.foliage_transaction_block.timestamp
|
|
132
|
+
for spend in removals:
|
|
133
|
+
self.removals_since_fork[bytes32(spend.name())] = ForkRem(bytes32(spend.puzzle_hash), height)
|
|
134
|
+
for coin, hint in additions:
|
|
135
|
+
self.additions_since_fork[coin.name()] = ForkAdd(coin, height, timestamp, hint, False)
|
|
136
|
+
for coin in block.get_included_reward_coins():
|
|
137
|
+
assert block.foliage_transaction_block is not None
|
|
138
|
+
timestamp = block.foliage_transaction_block.timestamp
|
|
139
|
+
assert coin.name() not in self.additions_since_fork
|
|
140
|
+
self.additions_since_fork[coin.name()] = ForkAdd(coin, block.height, timestamp, None, True)
|
|
141
|
+
|
|
113
142
|
def rollback(self, header_hash: bytes32, height: int) -> None:
|
|
114
143
|
assert height <= self.peak_height
|
|
115
144
|
self.peak_height = height
|
|
@@ -118,25 +147,54 @@ class ForkInfo:
|
|
|
118
147
|
self.removals_since_fork = {k: v for k, v in self.removals_since_fork.items() if v.height <= height}
|
|
119
148
|
|
|
120
149
|
|
|
150
|
+
def validate_block_merkle_roots(
|
|
151
|
+
block_additions_root: bytes32,
|
|
152
|
+
block_removals_root: bytes32,
|
|
153
|
+
tx_additions: list[tuple[Coin, bytes32]],
|
|
154
|
+
tx_removals: list[bytes32],
|
|
155
|
+
) -> Optional[Err]:
|
|
156
|
+
# Create addition Merkle set
|
|
157
|
+
puzzlehash_coins_map: dict[bytes32, list[bytes32]] = {}
|
|
158
|
+
|
|
159
|
+
for coin, coin_name in tx_additions:
|
|
160
|
+
if coin.puzzle_hash in puzzlehash_coins_map:
|
|
161
|
+
puzzlehash_coins_map[coin.puzzle_hash].append(coin_name)
|
|
162
|
+
else:
|
|
163
|
+
puzzlehash_coins_map[coin.puzzle_hash] = [coin_name]
|
|
164
|
+
|
|
165
|
+
# Addition Merkle set contains puzzlehash and hash of all coins with that puzzlehash
|
|
166
|
+
additions_merkle_items: list[bytes32] = []
|
|
167
|
+
for puzzle, coin_ids in puzzlehash_coins_map.items():
|
|
168
|
+
additions_merkle_items.append(puzzle)
|
|
169
|
+
additions_merkle_items.append(hash_coin_ids(coin_ids))
|
|
170
|
+
|
|
171
|
+
additions_root = bytes32(compute_merkle_set_root(additions_merkle_items))
|
|
172
|
+
removals_root = bytes32(compute_merkle_set_root(tx_removals))
|
|
173
|
+
|
|
174
|
+
if block_additions_root != additions_root:
|
|
175
|
+
return Err.BAD_ADDITION_ROOT
|
|
176
|
+
if block_removals_root != removals_root:
|
|
177
|
+
return Err.BAD_REMOVAL_ROOT
|
|
178
|
+
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
|
|
121
182
|
async def validate_block_body(
|
|
122
183
|
constants: ConsensusConstants,
|
|
123
184
|
records: BlockRecordsProtocol,
|
|
124
|
-
get_coin_records: Callable[[Collection[bytes32]], Awaitable[
|
|
185
|
+
get_coin_records: Callable[[Collection[bytes32]], Awaitable[list[CoinRecord]]],
|
|
125
186
|
block: Union[FullBlock, UnfinishedBlock],
|
|
126
187
|
height: uint32,
|
|
127
188
|
conds: Optional[SpendBundleConditions],
|
|
128
189
|
fork_info: ForkInfo,
|
|
129
|
-
bls_cache: Optional[BLSCache],
|
|
130
190
|
*,
|
|
131
|
-
|
|
132
|
-
) ->
|
|
191
|
+
log_coins: bool = False,
|
|
192
|
+
) -> Optional[Err]:
|
|
133
193
|
"""
|
|
134
194
|
This assumes the header block has been completely validated.
|
|
135
195
|
Validates the transactions and body of the block.
|
|
136
|
-
Returns None
|
|
137
|
-
|
|
138
|
-
For the second value, returns a SpendBundleConditions only if validation
|
|
139
|
-
succeeded, and there are transactions. In other cases it returns None.
|
|
196
|
+
Returns None if everything validates correctly, or an Err if something does
|
|
197
|
+
not validate.
|
|
140
198
|
conds is the result of running the generator with the previous generators
|
|
141
199
|
refs. It must be set for transaction blocks and must be None for
|
|
142
200
|
non-transaction blocks.
|
|
@@ -158,7 +216,7 @@ async def validate_block_body(
|
|
|
158
216
|
or block.transactions_info is not None
|
|
159
217
|
or block.transactions_generator is not None
|
|
160
218
|
):
|
|
161
|
-
return Err.NOT_BLOCK_BUT_HAS_DATA
|
|
219
|
+
return Err.NOT_BLOCK_BUT_HAS_DATA
|
|
162
220
|
|
|
163
221
|
prev_tb: Optional[BlockRecord] = records.block_record(block.prev_header_hash)
|
|
164
222
|
assert prev_tb is not None
|
|
@@ -167,28 +225,30 @@ async def validate_block_body(
|
|
|
167
225
|
assert prev_tb is not None
|
|
168
226
|
assert prev_tb.timestamp is not None
|
|
169
227
|
if len(block.transactions_generator_ref_list) > 0:
|
|
170
|
-
return Err.NOT_BLOCK_BUT_HAS_DATA
|
|
228
|
+
return Err.NOT_BLOCK_BUT_HAS_DATA
|
|
171
229
|
|
|
172
230
|
assert fork_info.peak_height == height - 1
|
|
173
231
|
|
|
174
|
-
|
|
232
|
+
assert conds is None
|
|
233
|
+
# This means the block is valid
|
|
234
|
+
return None
|
|
175
235
|
|
|
176
236
|
# All checks below this point correspond to transaction blocks
|
|
177
237
|
# 2. For blocks, foliage block, transactions info must not be empty
|
|
178
238
|
if block.foliage_transaction_block is None or block.transactions_info is None:
|
|
179
|
-
return Err.IS_TRANSACTION_BLOCK_BUT_NO_DATA
|
|
239
|
+
return Err.IS_TRANSACTION_BLOCK_BUT_NO_DATA
|
|
180
240
|
assert block.foliage_transaction_block is not None
|
|
181
241
|
|
|
182
242
|
# keeps track of the reward coins that need to be incorporated
|
|
183
|
-
expected_reward_coins:
|
|
243
|
+
expected_reward_coins: set[Coin] = set()
|
|
184
244
|
|
|
185
245
|
# 3. The transaction info hash in the Foliage block must match the transaction info
|
|
186
246
|
if block.foliage_transaction_block.transactions_info_hash != std_hash(block.transactions_info):
|
|
187
|
-
return Err.INVALID_TRANSACTIONS_INFO_HASH
|
|
247
|
+
return Err.INVALID_TRANSACTIONS_INFO_HASH
|
|
188
248
|
|
|
189
249
|
# 4. The foliage block hash in the foliage block must match the foliage block
|
|
190
250
|
if block.foliage.foliage_transaction_block_hash != std_hash(block.foliage_transaction_block):
|
|
191
|
-
return Err.INVALID_FOLIAGE_BLOCK_HASH
|
|
251
|
+
return Err.INVALID_FOLIAGE_BLOCK_HASH
|
|
192
252
|
|
|
193
253
|
# 5. The reward claims must be valid for the previous blocks, and current block fees
|
|
194
254
|
# If height == 0, expected_reward_coins will be left empty
|
|
@@ -241,19 +301,19 @@ async def validate_block_body(
|
|
|
241
301
|
assert curr_b is not None
|
|
242
302
|
|
|
243
303
|
if set(block.transactions_info.reward_claims_incorporated) != expected_reward_coins:
|
|
244
|
-
return Err.INVALID_REWARD_COINS
|
|
304
|
+
return Err.INVALID_REWARD_COINS
|
|
245
305
|
|
|
246
306
|
if len(block.transactions_info.reward_claims_incorporated) != len(expected_reward_coins):
|
|
247
|
-
return Err.INVALID_REWARD_COINS
|
|
307
|
+
return Err.INVALID_REWARD_COINS
|
|
248
308
|
|
|
249
|
-
removals:
|
|
309
|
+
removals: list[bytes32] = []
|
|
250
310
|
|
|
251
311
|
# we store coins paired with their names in order to avoid computing the
|
|
252
312
|
# coin name multiple times, we store it next to the coin while validating
|
|
253
313
|
# the block
|
|
254
|
-
coinbase_additions:
|
|
255
|
-
additions:
|
|
256
|
-
removals_puzzle_dic:
|
|
314
|
+
coinbase_additions: list[tuple[Coin, bytes32]] = [(c, c.name()) for c in expected_reward_coins]
|
|
315
|
+
additions: list[tuple[Coin, bytes32]] = []
|
|
316
|
+
removals_puzzle_dic: dict[bytes32, bytes32] = {}
|
|
257
317
|
cost: uint64 = uint64(0)
|
|
258
318
|
|
|
259
319
|
# In header validation we check that timestamp is not more than 5 minutes into the future
|
|
@@ -264,10 +324,10 @@ async def validate_block_body(
|
|
|
264
324
|
# the generator for this block (or zeroes if no generator)
|
|
265
325
|
if block.transactions_generator is not None:
|
|
266
326
|
if std_hash(bytes(block.transactions_generator)) != block.transactions_info.generator_root:
|
|
267
|
-
return Err.INVALID_TRANSACTIONS_GENERATOR_HASH
|
|
327
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_HASH
|
|
268
328
|
else:
|
|
269
329
|
if block.transactions_info.generator_root != bytes([0] * 32):
|
|
270
|
-
return Err.INVALID_TRANSACTIONS_GENERATOR_HASH
|
|
330
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_HASH
|
|
271
331
|
|
|
272
332
|
# 8a. The generator_ref_list must be the hash of the serialized bytes of
|
|
273
333
|
# the generator ref list for this block (or 'one' bytes [0x01] if no generator)
|
|
@@ -275,20 +335,20 @@ async def validate_block_body(
|
|
|
275
335
|
# 8c. The generator ref list must not point to a height >= this block's height
|
|
276
336
|
if block.transactions_generator_ref_list in (None, []):
|
|
277
337
|
if block.transactions_info.generator_refs_root != bytes([1] * 32):
|
|
278
|
-
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
338
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
279
339
|
else:
|
|
280
340
|
# If we have a generator reference list, we must have a generator
|
|
281
341
|
if block.transactions_generator is None:
|
|
282
|
-
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
342
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
283
343
|
|
|
284
|
-
# The generator_refs_root must be the hash of the concatenation of the
|
|
344
|
+
# The generator_refs_root must be the hash of the concatenation of the list[uint32]
|
|
285
345
|
generator_refs_hash = std_hash(b"".join([i.stream_to_bytes() for i in block.transactions_generator_ref_list]))
|
|
286
346
|
if block.transactions_info.generator_refs_root != generator_refs_hash:
|
|
287
|
-
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
347
|
+
return Err.INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT
|
|
288
348
|
if len(block.transactions_generator_ref_list) > constants.MAX_GENERATOR_REF_LIST_SIZE:
|
|
289
|
-
return Err.TOO_MANY_GENERATOR_REFS
|
|
349
|
+
return Err.TOO_MANY_GENERATOR_REFS
|
|
290
350
|
if any([index >= height for index in block.transactions_generator_ref_list]):
|
|
291
|
-
return Err.FUTURE_GENERATOR_REFS
|
|
351
|
+
return Err.FUTURE_GENERATOR_REFS
|
|
292
352
|
|
|
293
353
|
if block.transactions_generator is not None:
|
|
294
354
|
# Get List of names removed, puzzles hashes for removed coins and conditions created
|
|
@@ -301,10 +361,11 @@ async def validate_block_body(
|
|
|
301
361
|
f"percent full: {round(100 * (cost / constants.MAX_BLOCK_COST_CLVM), 2)}%"
|
|
302
362
|
)
|
|
303
363
|
if cost > constants.MAX_BLOCK_COST_CLVM:
|
|
304
|
-
return Err.BLOCK_COST_EXCEEDS_MAX
|
|
364
|
+
return Err.BLOCK_COST_EXCEEDS_MAX
|
|
305
365
|
|
|
306
366
|
# 8. The CLVM program must not return any errors
|
|
307
367
|
assert conds is not None
|
|
368
|
+
assert conds.validated_signature
|
|
308
369
|
|
|
309
370
|
for spend in conds.spends:
|
|
310
371
|
removals.append(bytes32(spend.coin_id))
|
|
@@ -317,19 +378,19 @@ async def validate_block_body(
|
|
|
317
378
|
|
|
318
379
|
# 9. Check that the correct cost is in the transactions info
|
|
319
380
|
if block.transactions_info.cost != cost:
|
|
320
|
-
return Err.INVALID_BLOCK_COST
|
|
381
|
+
return Err.INVALID_BLOCK_COST
|
|
321
382
|
|
|
322
|
-
additions_dic:
|
|
383
|
+
additions_dic: dict[bytes32, Coin] = {}
|
|
323
384
|
# 10. Check additions for max coin amount
|
|
324
385
|
# Be careful to check for 64 bit overflows in other languages. This is the max 64 bit unsigned integer
|
|
325
386
|
# We will not even reach here because Coins do type checking (uint64)
|
|
326
387
|
for coin, coin_name in additions + coinbase_additions:
|
|
327
388
|
additions_dic[coin_name] = coin
|
|
328
389
|
if coin.amount < 0:
|
|
329
|
-
return Err.COIN_AMOUNT_NEGATIVE
|
|
390
|
+
return Err.COIN_AMOUNT_NEGATIVE
|
|
330
391
|
|
|
331
392
|
if coin.amount > constants.MAX_COIN_AMOUNT:
|
|
332
|
-
return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM
|
|
393
|
+
return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM
|
|
333
394
|
|
|
334
395
|
# 11. Validate addition and removal roots
|
|
335
396
|
root_error = validate_block_merkle_roots(
|
|
@@ -338,11 +399,11 @@ async def validate_block_body(
|
|
|
338
399
|
additions + coinbase_additions,
|
|
339
400
|
removals,
|
|
340
401
|
)
|
|
341
|
-
if root_error:
|
|
342
|
-
return root_error
|
|
402
|
+
if root_error is not None:
|
|
403
|
+
return root_error
|
|
343
404
|
|
|
344
405
|
# 12. The additions and removals must result in the correct filter
|
|
345
|
-
byte_array_tx:
|
|
406
|
+
byte_array_tx: list[bytearray] = []
|
|
346
407
|
|
|
347
408
|
for coin, _ in additions + coinbase_additions:
|
|
348
409
|
byte_array_tx.append(bytearray(coin.puzzle_hash))
|
|
@@ -354,19 +415,19 @@ async def validate_block_body(
|
|
|
354
415
|
filter_hash = std_hash(encoded_filter)
|
|
355
416
|
|
|
356
417
|
if filter_hash != block.foliage_transaction_block.filter_hash:
|
|
357
|
-
return Err.INVALID_TRANSACTIONS_FILTER_HASH
|
|
418
|
+
return Err.INVALID_TRANSACTIONS_FILTER_HASH
|
|
358
419
|
|
|
359
420
|
# 13. Check for duplicate outputs in additions
|
|
360
421
|
addition_counter = collections.Counter(coin_name for _, coin_name in additions + coinbase_additions)
|
|
361
|
-
for
|
|
362
|
-
if
|
|
363
|
-
return Err.DUPLICATE_OUTPUT
|
|
422
|
+
for count in addition_counter.values():
|
|
423
|
+
if count > 1:
|
|
424
|
+
return Err.DUPLICATE_OUTPUT
|
|
364
425
|
|
|
365
426
|
# 14. Check for duplicate spends inside block
|
|
366
427
|
removal_counter = collections.Counter(removals)
|
|
367
428
|
for count in removal_counter.values():
|
|
368
429
|
if count > 1:
|
|
369
|
-
return Err.DOUBLE_SPEND
|
|
430
|
+
return Err.DOUBLE_SPEND
|
|
370
431
|
|
|
371
432
|
# 15. Check if removals exist and were not previously spent. (unspent_db + diff_store + this_block)
|
|
372
433
|
# The fork point is the last block in common between the peak chain and the chain of `block`
|
|
@@ -374,10 +435,10 @@ async def validate_block_body(
|
|
|
374
435
|
assert fork_info.fork_height < height
|
|
375
436
|
assert fork_info.peak_height == height - 1
|
|
376
437
|
|
|
377
|
-
removal_coin_records:
|
|
438
|
+
removal_coin_records: dict[bytes32, CoinRecord] = {}
|
|
378
439
|
# the removed coins we need to look up from the DB
|
|
379
440
|
# i.e. all non-ephemeral coins
|
|
380
|
-
removals_from_db:
|
|
441
|
+
removals_from_db: list[bytes32] = []
|
|
381
442
|
for rem in removals:
|
|
382
443
|
if rem in additions_dic:
|
|
383
444
|
# Ephemeral coin
|
|
@@ -396,40 +457,46 @@ async def validate_block_body(
|
|
|
396
457
|
if rem in fork_info.removals_since_fork:
|
|
397
458
|
# This coin was spent in the fork
|
|
398
459
|
log.error(f"Err.DOUBLE_SPEND_IN_FORK {fork_info.removals_since_fork[rem]}")
|
|
399
|
-
return Err.DOUBLE_SPEND_IN_FORK
|
|
460
|
+
return Err.DOUBLE_SPEND_IN_FORK
|
|
400
461
|
removals_from_db.append(rem)
|
|
401
462
|
|
|
402
463
|
unspent_records = await get_coin_records(removals_from_db)
|
|
403
464
|
|
|
404
465
|
# some coin spends we need to ensure exist in the fork branch. Both coins we
|
|
405
466
|
# can't find in the DB, but also coins that were spent after the fork point
|
|
406
|
-
look_in_fork:
|
|
467
|
+
look_in_fork: list[bytes32] = []
|
|
407
468
|
for unspent in unspent_records:
|
|
408
469
|
if unspent.confirmed_block_index <= fork_info.fork_height:
|
|
409
470
|
# Spending something in the current chain, confirmed before fork
|
|
410
471
|
# (We ignore all coins confirmed after fork)
|
|
411
472
|
if unspent.spent == 1 and unspent.spent_block_index <= fork_info.fork_height:
|
|
412
473
|
# Check for coins spent in an ancestor block
|
|
413
|
-
return Err.DOUBLE_SPEND
|
|
474
|
+
return Err.DOUBLE_SPEND
|
|
414
475
|
removal_coin_records[unspent.name] = unspent
|
|
415
476
|
else:
|
|
416
477
|
look_in_fork.append(unspent.name)
|
|
417
478
|
|
|
479
|
+
if log_coins and len(look_in_fork) > 0:
|
|
480
|
+
log.info("%d coins spent after fork", len(look_in_fork))
|
|
481
|
+
|
|
418
482
|
if len(unspent_records) != len(removals_from_db):
|
|
419
483
|
# some coins could not be found in the DB. We need to find out which
|
|
420
484
|
# ones and look for them in additions_since_fork
|
|
421
|
-
found:
|
|
485
|
+
found: set[bytes32] = {u.name for u in unspent_records}
|
|
422
486
|
for rem in removals_from_db:
|
|
423
487
|
if rem in found:
|
|
424
488
|
continue
|
|
425
489
|
look_in_fork.append(rem)
|
|
426
490
|
|
|
491
|
+
if log_coins and len(look_in_fork) > 0:
|
|
492
|
+
log.info("coins spent in fork: %s", ",".join([f"{name}"[0:6] for name in look_in_fork]))
|
|
493
|
+
|
|
427
494
|
for rem in look_in_fork:
|
|
428
495
|
# This coin is not in the current heaviest chain, so it must be in the fork
|
|
429
496
|
if rem not in fork_info.additions_since_fork:
|
|
430
497
|
# Check for spending a coin that does not exist in this fork
|
|
431
498
|
log.error(f"Err.UNKNOWN_UNSPENT: COIN ID: {rem} fork_info: {fork_info}")
|
|
432
|
-
return Err.UNKNOWN_UNSPENT
|
|
499
|
+
return Err.UNKNOWN_UNSPENT
|
|
433
500
|
addition: ForkAdd = fork_info.additions_since_fork[rem]
|
|
434
501
|
new_coin_record: CoinRecord = CoinRecord(
|
|
435
502
|
addition.coin,
|
|
@@ -450,7 +517,7 @@ async def validate_block_body(
|
|
|
450
517
|
|
|
451
518
|
# 16. Check that the total coin amount for added is <= removed
|
|
452
519
|
if removed < added:
|
|
453
|
-
return Err.MINTING_COIN
|
|
520
|
+
return Err.MINTING_COIN
|
|
454
521
|
|
|
455
522
|
fees = removed - added
|
|
456
523
|
assert fees >= 0
|
|
@@ -461,20 +528,20 @@ async def validate_block_body(
|
|
|
461
528
|
|
|
462
529
|
# 17. Check that the assert fee sum <= fees, and that each reserved fee is non-negative
|
|
463
530
|
if fees < assert_fee_sum:
|
|
464
|
-
return Err.RESERVE_FEE_CONDITION_FAILED
|
|
531
|
+
return Err.RESERVE_FEE_CONDITION_FAILED
|
|
465
532
|
|
|
466
533
|
# 18. Check that the fee amount + farmer reward < maximum coin amount
|
|
467
534
|
if fees + calculate_base_farmer_reward(height) > constants.MAX_COIN_AMOUNT:
|
|
468
|
-
return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM
|
|
535
|
+
return Err.COIN_AMOUNT_EXCEEDS_MAXIMUM
|
|
469
536
|
|
|
470
537
|
# 19. Check that the computed fees are equal to the fees in the block header
|
|
471
538
|
if block.transactions_info.fees != fees:
|
|
472
|
-
return Err.INVALID_BLOCK_FEE_AMOUNT
|
|
539
|
+
return Err.INVALID_BLOCK_FEE_AMOUNT
|
|
473
540
|
|
|
474
541
|
# 20. Verify that removed coin puzzle_hashes match with calculated puzzle_hashes
|
|
475
542
|
for unspent in removal_coin_records.values():
|
|
476
543
|
if unspent.coin.puzzle_hash != removals_puzzle_dic[unspent.name]:
|
|
477
|
-
return Err.WRONG_PUZZLE_HASH
|
|
544
|
+
return Err.WRONG_PUZZLE_HASH
|
|
478
545
|
|
|
479
546
|
# 21. Verify conditions
|
|
480
547
|
# verify absolute/relative height/time conditions
|
|
@@ -486,30 +553,10 @@ async def validate_block_body(
|
|
|
486
553
|
prev_transaction_block_timestamp,
|
|
487
554
|
)
|
|
488
555
|
if error is not None:
|
|
489
|
-
return error
|
|
490
|
-
|
|
491
|
-
# create hash_key list for aggsig check
|
|
492
|
-
pairs_pks: List[G1Element] = []
|
|
493
|
-
pairs_msgs: List[bytes] = []
|
|
494
|
-
if conds is not None:
|
|
495
|
-
pairs_pks, pairs_msgs = pkm_pairs(conds, constants.AGG_SIG_ME_ADDITIONAL_DATA)
|
|
556
|
+
return error
|
|
496
557
|
|
|
497
|
-
# 22. Verify aggregated signature
|
|
498
|
-
# TODO: move this to pre_validate_blocks_multiprocessing so we can sync faster
|
|
558
|
+
# 22. Verify aggregated signature is done in pre-validation
|
|
499
559
|
if not block.transactions_info.aggregated_signature:
|
|
500
|
-
return Err.BAD_AGGREGATE_SIGNATURE
|
|
501
|
-
|
|
502
|
-
# The pairing cache is not useful while syncing as each pairing is seen
|
|
503
|
-
# only once, so the extra effort of populating it is not justified.
|
|
504
|
-
# However, we force caching of pairings just for unfinished blocks
|
|
505
|
-
# as the cache is likely to be useful when validating the corresponding
|
|
506
|
-
# finished blocks later.
|
|
507
|
-
if validate_signature:
|
|
508
|
-
if bls_cache is None:
|
|
509
|
-
if not AugSchemeMPL.aggregate_verify(pairs_pks, pairs_msgs, block.transactions_info.aggregated_signature):
|
|
510
|
-
return Err.BAD_AGGREGATE_SIGNATURE, None
|
|
511
|
-
else:
|
|
512
|
-
if not bls_cache.aggregate_verify(pairs_pks, pairs_msgs, block.transactions_info.aggregated_signature):
|
|
513
|
-
return Err.BAD_AGGREGATE_SIGNATURE, None
|
|
560
|
+
return Err.BAD_AGGREGATE_SIGNATURE
|
|
514
561
|
|
|
515
|
-
return None
|
|
562
|
+
return None
|
chia/consensus/block_creation.py
CHANGED
|
@@ -2,10 +2,20 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import random
|
|
5
|
-
from
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
from typing import Callable, Optional
|
|
6
7
|
|
|
7
8
|
import chia_rs
|
|
8
|
-
from chia_rs import
|
|
9
|
+
from chia_rs import (
|
|
10
|
+
DONT_VALIDATE_SIGNATURE,
|
|
11
|
+
MEMPOOL_MODE,
|
|
12
|
+
G1Element,
|
|
13
|
+
G2Element,
|
|
14
|
+
compute_merkle_set_root,
|
|
15
|
+
get_flags_for_height_and_constants,
|
|
16
|
+
run_block_generator,
|
|
17
|
+
run_block_generator2,
|
|
18
|
+
)
|
|
9
19
|
from chiabip158 import PyBIP158
|
|
10
20
|
|
|
11
21
|
from chia.consensus.block_record import BlockRecord
|
|
@@ -13,8 +23,6 @@ from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate
|
|
|
13
23
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
14
24
|
from chia.consensus.coinbase import create_farmer_coin, create_pool_coin
|
|
15
25
|
from chia.consensus.constants import ConsensusConstants
|
|
16
|
-
from chia.consensus.cost_calculator import NPCResult
|
|
17
|
-
from chia.full_node.mempool_check_conditions import get_name_puzzle_conditions
|
|
18
26
|
from chia.full_node.signage_point import SignagePoint
|
|
19
27
|
from chia.types.blockchain_format.coin import Coin, hash_coin_ids
|
|
20
28
|
from chia.types.blockchain_format.foliage import Foliage, FoliageBlockData, FoliageTransactionBlock, TransactionsInfo
|
|
@@ -35,10 +43,23 @@ log = logging.getLogger(__name__)
|
|
|
35
43
|
|
|
36
44
|
|
|
37
45
|
def compute_block_cost(generator: BlockGenerator, constants: ConsensusConstants, height: uint32) -> uint64:
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
flags = get_flags_for_height_and_constants(height, constants) | MEMPOOL_MODE | DONT_VALIDATE_SIGNATURE
|
|
47
|
+
|
|
48
|
+
if height >= constants.HARD_FORK_HEIGHT:
|
|
49
|
+
run_block = run_block_generator2
|
|
50
|
+
else:
|
|
51
|
+
run_block = run_block_generator
|
|
52
|
+
|
|
53
|
+
_, conds = run_block(
|
|
54
|
+
bytes(generator.program),
|
|
55
|
+
generator.generator_refs,
|
|
56
|
+
constants.MAX_BLOCK_COST_CLVM,
|
|
57
|
+
flags,
|
|
58
|
+
G2Element(),
|
|
59
|
+
None,
|
|
60
|
+
constants,
|
|
40
61
|
)
|
|
41
|
-
return uint64(0 if
|
|
62
|
+
return uint64(0 if conds is None else conds.cost)
|
|
42
63
|
|
|
43
64
|
|
|
44
65
|
def compute_block_fee(additions: Sequence[Coin], removals: Sequence[Coin]) -> uint64:
|
|
@@ -56,8 +77,8 @@ def create_foliage(
|
|
|
56
77
|
reward_block_unfinished: RewardChainBlockUnfinished,
|
|
57
78
|
block_generator: Optional[BlockGenerator],
|
|
58
79
|
aggregate_sig: G2Element,
|
|
59
|
-
additions:
|
|
60
|
-
removals:
|
|
80
|
+
additions: list[Coin],
|
|
81
|
+
removals: list[Coin],
|
|
61
82
|
prev_block: Optional[BlockRecord],
|
|
62
83
|
blocks: BlockRecordsProtocol,
|
|
63
84
|
total_iters_sp: uint128,
|
|
@@ -69,7 +90,7 @@ def create_foliage(
|
|
|
69
90
|
seed: bytes,
|
|
70
91
|
compute_cost: Callable[[BlockGenerator, ConsensusConstants, uint32], uint64],
|
|
71
92
|
compute_fees: Callable[[Sequence[Coin], Sequence[Coin]], uint64],
|
|
72
|
-
) ->
|
|
93
|
+
) -> tuple[Foliage, Optional[FoliageTransactionBlock], Optional[TransactionsInfo]]:
|
|
73
94
|
"""
|
|
74
95
|
Creates a foliage for a given reward chain block. This may or may not be a tx block. In the case of a tx block,
|
|
75
96
|
the return values are not None. This is called at the signage point, so some of this information may be
|
|
@@ -111,9 +132,9 @@ def create_foliage(
|
|
|
111
132
|
height = uint32(prev_block.height + 1)
|
|
112
133
|
|
|
113
134
|
# Create filter
|
|
114
|
-
byte_array_tx:
|
|
115
|
-
tx_additions:
|
|
116
|
-
tx_removals:
|
|
135
|
+
byte_array_tx: list[bytearray] = []
|
|
136
|
+
tx_additions: list[Coin] = []
|
|
137
|
+
tx_removals: list[bytes32] = []
|
|
117
138
|
|
|
118
139
|
pool_target_signature: Optional[G2Element] = get_pool_signature(
|
|
119
140
|
pool_target, reward_block_unfinished.proof_of_space.pool_public_key
|
|
@@ -202,10 +223,10 @@ def create_foliage(
|
|
|
202
223
|
bip158: PyBIP158 = PyBIP158(byte_array_tx)
|
|
203
224
|
encoded = bytes(bip158.GetEncoded())
|
|
204
225
|
|
|
205
|
-
additions_merkle_items:
|
|
226
|
+
additions_merkle_items: list[bytes32] = []
|
|
206
227
|
|
|
207
228
|
# Create addition Merkle set
|
|
208
|
-
puzzlehash_coin_map:
|
|
229
|
+
puzzlehash_coin_map: dict[bytes32, list[bytes32]] = {}
|
|
209
230
|
|
|
210
231
|
for coin in tx_additions:
|
|
211
232
|
if coin.puzzle_hash in puzzlehash_coin_map:
|
|
@@ -221,7 +242,7 @@ def create_foliage(
|
|
|
221
242
|
additions_root = bytes32(compute_merkle_set_root(additions_merkle_items))
|
|
222
243
|
removals_root = bytes32(compute_merkle_set_root(tx_removals))
|
|
223
244
|
|
|
224
|
-
generator_hash = bytes32
|
|
245
|
+
generator_hash = bytes32.zeros
|
|
225
246
|
if block_generator is not None:
|
|
226
247
|
generator_hash = std_hash(block_generator.program)
|
|
227
248
|
|
|
@@ -295,10 +316,10 @@ def create_unfinished_block(
|
|
|
295
316
|
seed: bytes = b"",
|
|
296
317
|
block_generator: Optional[BlockGenerator] = None,
|
|
297
318
|
aggregate_sig: G2Element = G2Element(),
|
|
298
|
-
additions: Optional[
|
|
299
|
-
removals: Optional[
|
|
319
|
+
additions: Optional[list[Coin]] = None,
|
|
320
|
+
removals: Optional[list[Coin]] = None,
|
|
300
321
|
prev_block: Optional[BlockRecord] = None,
|
|
301
|
-
finished_sub_slots_input: Optional[
|
|
322
|
+
finished_sub_slots_input: Optional[list[EndOfSubSlotBundle]] = None,
|
|
302
323
|
compute_cost: Callable[[BlockGenerator, ConsensusConstants, uint32], uint64] = compute_block_cost,
|
|
303
324
|
compute_fees: Callable[[Sequence[Coin], Sequence[Coin]], uint64] = compute_block_fee,
|
|
304
325
|
) -> UnfinishedBlock:
|
|
@@ -334,7 +355,7 @@ def create_unfinished_block(
|
|
|
334
355
|
|
|
335
356
|
"""
|
|
336
357
|
if finished_sub_slots_input is None:
|
|
337
|
-
finished_sub_slots:
|
|
358
|
+
finished_sub_slots: list[EndOfSubSlotBundle] = []
|
|
338
359
|
else:
|
|
339
360
|
finished_sub_slots = finished_sub_slots_input.copy()
|
|
340
361
|
overflow: bool = sp_iters > ip_iters
|
|
@@ -428,7 +449,7 @@ def unfinished_block_to_full_block(
|
|
|
428
449
|
rc_ip_proof: VDFProof,
|
|
429
450
|
icc_ip_vdf: Optional[VDFInfo],
|
|
430
451
|
icc_ip_proof: Optional[VDFProof],
|
|
431
|
-
finished_sub_slots:
|
|
452
|
+
finished_sub_slots: list[EndOfSubSlotBundle],
|
|
432
453
|
prev_block: Optional[BlockRecord],
|
|
433
454
|
blocks: BlockRecordsProtocol,
|
|
434
455
|
total_iters_sp: uint128,
|