chia-blockchain 2.5.4rc1__py3-none-any.whl → 2.5.5rc1__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/blockchain/blockchain_test_utils.py +2 -3
- chia/_tests/blockchain/test_augmented_chain.py +2 -3
- chia/_tests/blockchain/test_blockchain.py +261 -44
- chia/_tests/blockchain/test_blockchain_transactions.py +4 -3
- chia/_tests/blockchain/test_build_chains.py +197 -1
- chia/_tests/blockchain/test_get_block_generator.py +1 -1
- chia/_tests/blockchain/test_lookup_fork_chain.py +1 -1
- chia/_tests/clvm/benchmark_costs.py +1 -1
- chia/_tests/clvm/coin_store.py +3 -4
- chia/_tests/clvm/test_message_conditions.py +2 -2
- chia/_tests/clvm/test_puzzle_compression.py +2 -3
- chia/_tests/clvm/test_puzzles.py +1 -2
- chia/_tests/clvm/test_singletons.py +2 -3
- chia/_tests/clvm/test_spend_sim.py +7 -7
- chia/_tests/cmds/cmd_test_utils.py +30 -25
- chia/_tests/cmds/test_dev_gh.py +1 -1
- chia/_tests/cmds/test_farm_cmd.py +1 -1
- chia/_tests/cmds/test_show.py +1 -2
- chia/_tests/cmds/wallet/test_did.py +101 -56
- chia/_tests/cmds/wallet/test_nft.py +109 -84
- chia/_tests/cmds/wallet/test_notifications.py +1 -1
- chia/_tests/cmds/wallet/test_offer.toffer +1 -1
- chia/_tests/cmds/wallet/test_vcs.py +8 -8
- chia/_tests/cmds/wallet/test_wallet.py +100 -46
- chia/_tests/conftest.py +31 -20
- chia/_tests/connection_utils.py +1 -1
- chia/_tests/core/consensus/stores/__init__.py +0 -0
- chia/_tests/core/consensus/stores/test_coin_store_protocol.py +40 -0
- chia/_tests/core/consensus/test_block_creation.py +2 -31
- chia/_tests/core/consensus/test_pot_iterations.py +38 -3
- chia/_tests/core/custom_types/test_proof_of_space.py +154 -26
- chia/_tests/core/custom_types/test_spend_bundle.py +2 -3
- chia/_tests/core/daemon/test_daemon.py +80 -0
- chia/_tests/core/data_layer/test_data_layer.py +1 -1
- chia/_tests/core/data_layer/test_data_layer_util.py +1 -1
- chia/_tests/core/data_layer/test_data_rpc.py +14 -10
- chia/_tests/core/data_layer/test_data_store.py +5 -5
- chia/_tests/core/farmer/test_farmer_api.py +2 -2
- chia/_tests/core/full_node/full_sync/test_full_sync.py +446 -406
- chia/_tests/core/full_node/ram_db.py +3 -1
- chia/_tests/core/full_node/stores/test_block_store.py +28 -16
- chia/_tests/core/full_node/stores/test_coin_store.py +277 -185
- chia/_tests/core/full_node/stores/test_full_node_store.py +11 -4
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_address_manager.py +200 -27
- chia/_tests/core/full_node/test_block_height_map.py +2 -2
- chia/_tests/core/full_node/test_conditions.py +7 -6
- chia/_tests/core/full_node/test_full_node.py +456 -40
- chia/_tests/core/full_node/test_generator_tools.py +32 -2
- chia/_tests/core/full_node/test_hint_management.py +1 -1
- chia/_tests/core/full_node/test_node_load.py +20 -21
- chia/_tests/core/full_node/test_performance.py +3 -4
- chia/_tests/core/full_node/test_prev_tx_block.py +43 -0
- chia/_tests/core/full_node/test_subscriptions.py +1 -2
- chia/_tests/core/full_node/test_transactions.py +9 -5
- chia/_tests/core/full_node/test_tx_processing_queue.py +1 -2
- chia/_tests/core/large_block.py +1 -2
- chia/_tests/core/make_block_generator.py +3 -4
- chia/_tests/core/mempool/test_mempool.py +36 -86
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +1 -1
- chia/_tests/core/mempool/test_mempool_item_queries.py +1 -3
- chia/_tests/core/mempool/test_mempool_manager.py +421 -69
- chia/_tests/core/mempool/test_mempool_performance.py +3 -2
- chia/_tests/core/mempool/test_singleton_fast_forward.py +60 -131
- chia/_tests/core/server/flood.py +1 -1
- chia/_tests/core/server/test_dos.py +1 -1
- chia/_tests/core/server/test_node_discovery.py +41 -27
- chia/_tests/core/server/test_rate_limits.py +1 -1
- chia/_tests/core/server/test_server.py +1 -1
- chia/_tests/core/services/test_services.py +5 -5
- chia/_tests/core/ssl/test_ssl.py +1 -1
- chia/_tests/core/test_cost_calculation.py +6 -6
- chia/_tests/core/test_crawler.py +2 -2
- chia/_tests/core/test_crawler_rpc.py +1 -1
- chia/_tests/core/test_db_conversion.py +3 -1
- chia/_tests/core/test_db_validation.py +5 -3
- chia/_tests/core/test_farmer_harvester_rpc.py +15 -15
- chia/_tests/core/test_filter.py +4 -1
- chia/_tests/core/test_full_node_rpc.py +99 -82
- chia/_tests/core/test_program.py +2 -2
- chia/_tests/core/util/test_block_cache.py +1 -1
- chia/_tests/core/util/test_keychain.py +2 -2
- chia/_tests/core/util/test_lockfile.py +1 -1
- chia/_tests/core/util/test_log_exceptions.py +5 -5
- chia/_tests/core/util/test_streamable.py +81 -22
- chia/_tests/db/test_db_wrapper.py +1 -3
- chia/_tests/environments/wallet.py +5 -5
- chia/_tests/farmer_harvester/test_farmer.py +9 -7
- chia/_tests/farmer_harvester/test_farmer_harvester.py +11 -4
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +6 -5
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +15 -9
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +1 -2
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +7 -5
- chia/_tests/fee_estimation/test_fee_estimation_unit_tests.py +1 -1
- chia/_tests/generator/test_compression.py +1 -2
- chia/_tests/generator/test_rom.py +8 -4
- chia/_tests/plot_sync/test_plot_sync.py +3 -3
- chia/_tests/plot_sync/test_receiver.py +3 -3
- chia/_tests/plot_sync/test_sender.py +1 -1
- chia/_tests/plot_sync/test_sync_simulated.py +3 -3
- chia/_tests/plot_sync/util.py +2 -2
- chia/_tests/pools/test_pool_cmdline.py +48 -21
- chia/_tests/pools/test_pool_puzzles_lifecycle.py +2 -3
- chia/_tests/pools/test_pool_rpc.py +237 -105
- chia/_tests/pools/test_pool_wallet.py +11 -2
- chia/_tests/pools/test_wallet_pool_store.py +5 -4
- chia/_tests/rpc/test_rpc_client.py +1 -1
- chia/_tests/simulation/test_simulation.py +13 -8
- chia/_tests/simulation/test_simulator.py +2 -2
- chia/_tests/timelord/test_new_peak.py +191 -47
- chia/_tests/timelord/test_timelord.py +1 -1
- chia/_tests/tools/test_full_sync.py +0 -2
- chia/_tests/tools/test_run_block.py +3 -1
- chia/_tests/util/benchmark_cost.py +3 -3
- chia/_tests/util/benchmarks.py +2 -2
- chia/_tests/util/blockchain.py +11 -5
- chia/_tests/util/blockchain_mock.py +1 -4
- chia/_tests/util/coin_store.py +29 -0
- chia/_tests/util/constants.py +2 -18
- chia/_tests/util/full_sync.py +3 -3
- chia/_tests/util/generator_tools_testing.py +2 -3
- chia/_tests/util/key_tool.py +2 -3
- chia/_tests/util/misc.py +33 -31
- chia/_tests/util/network_protocol_data.py +19 -17
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +3 -1
- chia/_tests/util/run_block.py +2 -2
- chia/_tests/util/setup_nodes.py +7 -7
- chia/_tests/util/spend_sim.py +47 -55
- chia/_tests/util/test_condition_tools.py +5 -4
- chia/_tests/util/test_config.py +2 -2
- chia/_tests/util/test_dump_keyring.py +1 -1
- chia/_tests/util/test_full_block_utils.py +12 -14
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_paginator.py +4 -4
- chia/_tests/util/test_priority_mutex.py +2 -2
- chia/_tests/util/test_replace_str_to_bytes.py +15 -5
- chia/_tests/util/test_ssl_check.py +1 -1
- chia/_tests/util/test_testnet_overrides.py +13 -3
- chia/_tests/util/time_out_assert.py +4 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +1 -1
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +1 -2
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +352 -432
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +3 -6
- chia/_tests/wallet/cat_wallet/test_trades.py +53 -77
- chia/_tests/wallet/clawback/test_clawback_decorator.py +3 -1
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +3 -3
- chia/_tests/wallet/clawback/test_clawback_metadata.py +4 -2
- chia/_tests/wallet/conftest.py +11 -12
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +11 -4
- chia/_tests/wallet/db_wallet/test_dl_offers.py +433 -130
- chia/_tests/wallet/db_wallet/test_dl_wallet.py +3 -3
- chia/_tests/wallet/did_wallet/test_did.py +2132 -2000
- chia/_tests/wallet/nft_wallet/config.py +1 -1
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +1610 -742
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +486 -907
- chia/_tests/wallet/nft_wallet/test_nft_lifecycle.py +4 -4
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +517 -294
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +133 -62
- chia/_tests/wallet/rpc/test_wallet_rpc.py +305 -184
- chia/_tests/wallet/simple_sync/test_simple_sync_protocol.py +10 -6
- chia/_tests/wallet/sync/test_wallet_sync.py +89 -60
- chia/_tests/wallet/test_clvm_casts.py +88 -0
- chia/_tests/wallet/test_coin_management.py +1 -1
- chia/_tests/wallet/test_coin_selection.py +1 -1
- chia/_tests/wallet/test_conditions.py +1 -1
- chia/_tests/wallet/test_new_wallet_protocol.py +13 -11
- chia/_tests/wallet/test_notifications.py +5 -3
- chia/_tests/wallet/test_sign_coin_spends.py +6 -6
- chia/_tests/wallet/test_signer_protocol.py +13 -12
- chia/_tests/wallet/test_singleton.py +1 -1
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +5 -7
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +108 -29
- chia/_tests/wallet/test_wallet_action_scope.py +9 -2
- chia/_tests/wallet/test_wallet_blockchain.py +2 -3
- chia/_tests/wallet/test_wallet_key_val_store.py +1 -2
- chia/_tests/wallet/test_wallet_node.py +2 -4
- chia/_tests/wallet/test_wallet_retry.py +4 -2
- chia/_tests/wallet/test_wallet_state_manager.py +191 -5
- chia/_tests/wallet/test_wallet_test_framework.py +1 -1
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +8 -8
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -12
- chia/_tests/wallet/wallet_block_tools.py +6 -6
- chia/_tests/weight_proof/test_weight_proof.py +10 -48
- chia/apis.py +1 -1
- chia/cmds/beta.py +1 -1
- chia/cmds/chia.py +9 -9
- chia/cmds/cmd_classes.py +12 -11
- chia/cmds/cmd_helpers.py +1 -1
- chia/cmds/cmds_util.py +12 -9
- chia/cmds/coin_funcs.py +2 -2
- chia/cmds/configure.py +2 -2
- chia/cmds/data.py +0 -2
- chia/cmds/data_funcs.py +1 -1
- chia/cmds/db_validate_func.py +1 -2
- chia/cmds/dev/__init__.py +0 -0
- chia/cmds/dev/data.py +273 -0
- chia/cmds/{gh.py → dev/gh.py} +5 -5
- chia/cmds/dev/main.py +22 -0
- chia/cmds/dev/mempool.py +78 -0
- chia/cmds/dev/mempool_funcs.py +63 -0
- chia/cmds/farm_funcs.py +5 -4
- chia/cmds/init_funcs.py +11 -11
- chia/cmds/keys.py +2 -2
- chia/cmds/keys_funcs.py +4 -4
- chia/cmds/netspace_funcs.py +1 -1
- chia/cmds/peer_funcs.py +2 -2
- chia/cmds/plotnft_funcs.py +72 -26
- chia/cmds/rpc.py +1 -1
- chia/cmds/show_funcs.py +5 -5
- chia/cmds/signer.py +8 -7
- chia/cmds/sim_funcs.py +8 -9
- chia/cmds/wallet.py +2 -2
- chia/cmds/wallet_funcs.py +165 -131
- chia/{util → consensus}/augmented_chain.py +1 -2
- chia/consensus/block_body_validation.py +54 -40
- chia/consensus/block_creation.py +42 -76
- chia/consensus/block_header_validation.py +32 -26
- chia/consensus/block_record.py +0 -3
- chia/consensus/blockchain.py +23 -32
- chia/consensus/blockchain_interface.py +1 -5
- chia/consensus/check_time_locks.py +57 -0
- chia/consensus/coin_store_protocol.py +151 -0
- chia/consensus/coinbase.py +0 -6
- chia/consensus/condition_costs.py +4 -0
- chia/{util → consensus}/condition_tools.py +4 -5
- chia/consensus/cost_calculator.py +1 -1
- chia/consensus/default_constants.py +32 -9
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +1 -2
- chia/consensus/find_fork_point.py +1 -3
- chia/consensus/full_block_to_block_record.py +1 -6
- chia/{util → consensus}/generator_tools.py +1 -3
- chia/consensus/get_block_challenge.py +30 -7
- chia/consensus/make_sub_epoch_summary.py +1 -5
- chia/consensus/multiprocess_validation.py +21 -20
- chia/consensus/pot_iterations.py +74 -13
- chia/{util → consensus}/prev_transaction_block.py +1 -1
- chia/consensus/vdf_info_computation.py +1 -3
- chia/daemon/keychain_proxy.py +5 -5
- chia/daemon/server.py +22 -5
- chia/data_layer/data_layer.py +92 -51
- chia/{rpc → data_layer}/data_layer_rpc_api.py +1 -1
- chia/{rpc → data_layer}/data_layer_rpc_util.py +3 -6
- chia/data_layer/data_layer_util.py +4 -6
- chia/data_layer/data_layer_wallet.py +42 -69
- chia/data_layer/dl_wallet_store.py +12 -6
- chia/data_layer/download_data.py +3 -3
- chia/data_layer/s3_plugin_service.py +0 -1
- chia/farmer/farmer.py +3 -4
- chia/farmer/farmer_api.py +11 -7
- chia/{rpc → farmer}/farmer_rpc_client.py +1 -1
- chia/full_node/block_height_map.py +7 -6
- chia/full_node/block_store.py +5 -7
- chia/full_node/bundle_tools.py +1 -2
- chia/full_node/coin_store.py +143 -124
- chia/{types → full_node}/eligible_coin_spends.py +39 -70
- chia/full_node/fee_estimator.py +1 -1
- chia/full_node/fee_estimator_interface.py +0 -8
- chia/full_node/fee_tracker.py +25 -25
- chia/full_node/full_node.py +70 -53
- chia/full_node/full_node_api.py +57 -40
- chia/{rpc → full_node}/full_node_rpc_api.py +87 -8
- chia/{rpc → full_node}/full_node_rpc_client.py +7 -6
- chia/full_node/full_node_store.py +23 -8
- chia/full_node/mempool.py +206 -53
- chia/full_node/mempool_check_conditions.py +20 -63
- chia/full_node/mempool_manager.py +32 -42
- chia/full_node/subscriptions.py +1 -3
- chia/full_node/tx_processing_queue.py +50 -3
- chia/full_node/weight_proof.py +46 -37
- chia/harvester/harvester.py +1 -1
- chia/harvester/harvester_api.py +22 -7
- chia/introducer/introducer.py +1 -1
- chia/introducer/introducer_api.py +1 -1
- chia/plot_sync/exceptions.py +1 -1
- chia/plot_sync/receiver.py +1 -1
- chia/plot_sync/sender.py +2 -2
- chia/pools/pool_puzzles.py +13 -18
- chia/pools/pool_wallet.py +23 -46
- chia/protocols/farmer_protocol.py +11 -3
- chia/protocols/full_node_protocol.py +1 -4
- chia/protocols/harvester_protocol.py +3 -3
- chia/protocols/pool_protocol.py +1 -2
- chia/protocols/shared_protocol.py +3 -3
- chia/protocols/timelord_protocol.py +1 -3
- chia/protocols/wallet_protocol.py +3 -3
- chia/rpc/rpc_client.py +7 -8
- chia/rpc/rpc_server.py +3 -3
- chia/rpc/util.py +3 -1
- chia/seeder/crawler.py +1 -1
- chia/seeder/crawler_api.py +1 -1
- chia/seeder/dns_server.py +2 -0
- chia/seeder/start_crawler.py +3 -3
- chia/server/address_manager.py +286 -38
- chia/server/address_manager_store.py +0 -215
- chia/{types → server}/aliases.py +7 -7
- chia/server/api_protocol.py +1 -1
- chia/server/chia_policy.py +1 -1
- chia/server/node_discovery.py +76 -113
- chia/server/rate_limits.py +1 -1
- chia/server/resolve_peer_info.py +43 -0
- chia/server/server.py +5 -5
- chia/server/start_data_layer.py +4 -4
- chia/server/start_farmer.py +5 -4
- chia/server/start_full_node.py +5 -4
- chia/server/start_harvester.py +7 -5
- chia/server/start_introducer.py +2 -2
- chia/server/start_service.py +1 -1
- chia/server/start_timelord.py +7 -5
- chia/server/start_wallet.py +7 -5
- chia/server/ws_connection.py +1 -1
- chia/simulator/add_blocks_in_batches.py +2 -2
- chia/simulator/block_tools.py +245 -201
- chia/simulator/full_node_simulator.py +38 -10
- chia/simulator/setup_services.py +12 -12
- chia/simulator/simulator_full_node_rpc_api.py +2 -2
- chia/simulator/simulator_full_node_rpc_client.py +2 -2
- chia/simulator/simulator_test_tools.py +2 -2
- chia/simulator/start_simulator.py +1 -1
- chia/simulator/wallet_tools.py +10 -18
- chia/ssl/create_ssl.py +1 -1
- chia/timelord/iters_from_block.py +14 -14
- chia/timelord/timelord.py +15 -11
- chia/timelord/timelord_api.py +14 -2
- chia/timelord/timelord_state.py +20 -14
- chia/types/blockchain_format/program.py +53 -10
- chia/types/blockchain_format/proof_of_space.py +73 -19
- chia/types/coin_spend.py +3 -56
- chia/types/generator_types.py +28 -0
- chia/types/internal_mempool_item.py +1 -2
- chia/types/mempool_item.py +12 -7
- chia/types/unfinished_header_block.py +1 -2
- chia/types/validation_state.py +1 -2
- chia/types/weight_proof.py +1 -3
- chia/util/action_scope.py +3 -3
- chia/util/block_cache.py +1 -2
- chia/util/byte_types.py +1 -1
- chia/util/casts.py +21 -0
- chia/util/config.py +0 -37
- chia/util/db_wrapper.py +8 -1
- chia/util/errors.py +3 -2
- chia/util/initial-config.yaml +21 -5
- chia/util/keychain.py +6 -7
- chia/util/keyring_wrapper.py +5 -5
- chia/util/limited_semaphore.py +1 -1
- chia/util/priority_mutex.py +1 -1
- chia/util/streamable.py +63 -5
- chia/util/task_timing.py +1 -1
- chia/util/virtual_project_analysis.py +1 -1
- chia/wallet/cat_wallet/cat_info.py +7 -3
- chia/wallet/cat_wallet/cat_outer_puzzle.py +9 -5
- chia/wallet/cat_wallet/cat_utils.py +1 -1
- chia/wallet/cat_wallet/cat_wallet.py +44 -36
- chia/wallet/cat_wallet/lineage_store.py +7 -0
- chia/wallet/cat_wallet/r_cat_wallet.py +273 -0
- chia/wallet/conditions.py +5 -10
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -4
- chia/wallet/derivation_record.py +33 -0
- chia/wallet/derive_keys.py +3 -3
- chia/wallet/did_wallet/did_info.py +12 -3
- chia/wallet/did_wallet/did_wallet.py +132 -101
- chia/wallet/did_wallet/did_wallet_puzzles.py +9 -9
- chia/wallet/driver_protocol.py +3 -1
- chia/{types/spend_bundle.py → wallet/estimate_fees.py} +2 -7
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/nft_puzzle_utils.py +1 -1
- chia/wallet/nft_wallet/nft_wallet.py +69 -112
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +5 -3
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +6 -4
- chia/wallet/nft_wallet/transfer_program_puzzle.py +4 -2
- chia/wallet/nft_wallet/uncurry_nft.py +4 -6
- chia/wallet/notification_manager.py +2 -3
- chia/wallet/outer_puzzles.py +7 -2
- chia/wallet/puzzle_drivers.py +1 -1
- chia/wallet/puzzles/clawback/drivers.py +5 -4
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -1
- chia/wallet/puzzles/singleton_top_layer.py +2 -1
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +2 -1
- chia/wallet/puzzles/tails.py +1 -3
- chia/wallet/signer_protocol.py +5 -6
- chia/wallet/singleton.py +5 -4
- chia/wallet/singleton_record.py +1 -1
- chia/wallet/trade_manager.py +18 -20
- chia/wallet/trade_record.py +3 -6
- chia/wallet/trading/offer.py +12 -13
- chia/wallet/uncurried_puzzle.py +2 -2
- chia/wallet/util/compute_additions.py +58 -0
- chia/wallet/util/compute_hints.py +3 -3
- chia/wallet/util/compute_memos.py +4 -4
- chia/wallet/util/curry_and_treehash.py +2 -1
- chia/wallet/util/debug_spend_bundle.py +1 -1
- chia/wallet/util/merkle_tree.py +1 -1
- chia/wallet/util/peer_request_cache.py +1 -2
- chia/wallet/util/tx_config.py +3 -8
- chia/wallet/util/wallet_sync_utils.py +10 -5
- chia/wallet/util/wallet_types.py +1 -0
- chia/wallet/vc_wallet/cr_cat_drivers.py +17 -18
- chia/wallet/vc_wallet/cr_cat_wallet.py +30 -28
- chia/wallet/vc_wallet/cr_outer_puzzle.py +5 -3
- chia/wallet/vc_wallet/vc_drivers.py +50 -8
- chia/wallet/vc_wallet/vc_store.py +3 -5
- chia/wallet/vc_wallet/vc_wallet.py +15 -22
- chia/wallet/wallet.py +36 -46
- chia/wallet/wallet_action_scope.py +73 -4
- chia/wallet/wallet_blockchain.py +1 -3
- chia/wallet/wallet_interested_store.py +1 -1
- chia/wallet/wallet_nft_store.py +3 -3
- chia/wallet/wallet_node.py +17 -16
- chia/wallet/wallet_node_api.py +4 -5
- chia/wallet/wallet_pool_store.py +1 -1
- chia/wallet/wallet_protocol.py +2 -0
- chia/wallet/wallet_puzzle_store.py +1 -1
- chia/{rpc → wallet}/wallet_request_types.py +670 -81
- chia/{rpc → wallet}/wallet_rpc_api.py +735 -766
- chia/{rpc → wallet}/wallet_rpc_client.py +268 -420
- chia/wallet/wallet_singleton_store.py +8 -7
- chia/wallet/wallet_spend_bundle.py +4 -3
- chia/wallet/wallet_state_manager.py +320 -191
- chia/wallet/wallet_weight_proof_handler.py +1 -2
- chia/wallet/wsm_apis.py +98 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5rc1.dist-info}/METADATA +7 -7
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5rc1.dist-info}/RECORD +443 -436
- mozilla-ca/cacert.pem +3 -165
- chia/_tests/fee_estimation/test_mempoolitem_height_added.py +0 -145
- chia/cmds/dev.py +0 -18
- chia/types/blockchain_format/slots.py +0 -9
- chia/types/blockchain_format/sub_epoch_summary.py +0 -5
- chia/types/end_of_slot_bundle.py +0 -5
- chia/types/full_block.py +0 -5
- chia/types/header_block.py +0 -5
- chia/types/spend_bundle_conditions.py +0 -7
- chia/types/transaction_queue_entry.py +0 -56
- chia/types/unfinished_block.py +0 -5
- /chia/cmds/{installers.py → dev/installers.py} +0 -0
- /chia/cmds/{sim.py → dev/sim.py} +0 -0
- /chia/{util → cmds}/dump_keyring.py +0 -0
- /chia/{full_node → consensus}/signage_point.py +0 -0
- /chia/{rpc → data_layer}/data_layer_rpc_client.py +0 -0
- /chia/{rpc → farmer}/farmer_rpc_api.py +0 -0
- /chia/{util → full_node}/full_block_utils.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_api.py +0 -0
- /chia/{rpc → harvester}/harvester_rpc_client.py +0 -0
- /chia/{full_node → protocols}/fee_estimate.py +0 -0
- /chia/{server → protocols}/outbound_message.py +0 -0
- /chia/{rpc → seeder}/crawler_rpc_api.py +0 -0
- /chia/{util → simulator}/vdf_prover.py +0 -0
- /chia/{util → ssl}/ssl_check.py +0 -0
- /chia/{rpc → timelord}/timelord_rpc_api.py +0 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5rc1.dist-info}/LICENSE +0 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.4rc1.dist-info → chia_blockchain-2.5.5rc1.dist-info}/entry_points.txt +0 -0
chia/consensus/blockchain.py
CHANGED
|
@@ -7,12 +7,17 @@ import logging
|
|
|
7
7
|
import traceback
|
|
8
8
|
from concurrent.futures import Executor, ThreadPoolExecutor
|
|
9
9
|
from enum import Enum
|
|
10
|
-
from pathlib import Path
|
|
11
10
|
from typing import TYPE_CHECKING, ClassVar, Optional, cast
|
|
12
11
|
|
|
13
12
|
from chia_rs import (
|
|
13
|
+
BlockRecord,
|
|
14
14
|
ConsensusConstants,
|
|
15
|
+
EndOfSubSlotBundle,
|
|
16
|
+
FullBlock,
|
|
17
|
+
HeaderBlock,
|
|
15
18
|
SubEpochChallengeSegment,
|
|
19
|
+
SubEpochSummary,
|
|
20
|
+
UnfinishedBlock,
|
|
16
21
|
additions_and_removals,
|
|
17
22
|
get_flags_for_height_and_constants,
|
|
18
23
|
)
|
|
@@ -21,30 +26,24 @@ from chia_rs.sized_ints import uint16, uint32, uint64, uint128
|
|
|
21
26
|
|
|
22
27
|
from chia.consensus.block_body_validation import ForkInfo, validate_block_body
|
|
23
28
|
from chia.consensus.block_header_validation import validate_unfinished_header_block
|
|
24
|
-
from chia.consensus.
|
|
29
|
+
from chia.consensus.coin_store_protocol import CoinStoreProtocol
|
|
25
30
|
from chia.consensus.cost_calculator import NPCResult
|
|
26
31
|
from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
|
|
27
32
|
from chia.consensus.find_fork_point import lookup_fork_chain
|
|
28
33
|
from chia.consensus.full_block_to_block_record import block_to_block_record
|
|
34
|
+
from chia.consensus.generator_tools import get_block_header
|
|
29
35
|
from chia.consensus.get_block_generator import get_block_generator
|
|
30
36
|
from chia.consensus.multiprocess_validation import PreValidationResult
|
|
31
37
|
from chia.full_node.block_height_map import BlockHeightMap
|
|
32
38
|
from chia.full_node.block_store import BlockStore
|
|
33
|
-
from chia.full_node.coin_store import CoinStore
|
|
34
39
|
from chia.types.blockchain_format.coin import Coin
|
|
35
|
-
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
36
40
|
from chia.types.blockchain_format.vdf import VDFInfo
|
|
37
41
|
from chia.types.coin_record import CoinRecord
|
|
38
|
-
from chia.types.end_of_slot_bundle import EndOfSubSlotBundle
|
|
39
|
-
from chia.types.full_block import FullBlock
|
|
40
42
|
from chia.types.generator_types import BlockGenerator
|
|
41
|
-
from chia.types.header_block import HeaderBlock
|
|
42
|
-
from chia.types.unfinished_block import UnfinishedBlock
|
|
43
43
|
from chia.types.unfinished_header_block import UnfinishedHeaderBlock
|
|
44
44
|
from chia.types.validation_state import ValidationState
|
|
45
45
|
from chia.util.cpu import available_logical_cores
|
|
46
46
|
from chia.util.errors import Err
|
|
47
|
-
from chia.util.generator_tools import get_block_header
|
|
48
47
|
from chia.util.hash import std_hash
|
|
49
48
|
from chia.util.inline_executor import InlineExecutor
|
|
50
49
|
from chia.util.priority_mutex import PriorityMutex
|
|
@@ -103,7 +102,7 @@ class Blockchain:
|
|
|
103
102
|
# epoch summaries
|
|
104
103
|
__height_map: BlockHeightMap
|
|
105
104
|
# Unspent Store
|
|
106
|
-
coin_store:
|
|
105
|
+
coin_store: CoinStoreProtocol
|
|
107
106
|
# Store
|
|
108
107
|
block_store: BlockStore
|
|
109
108
|
# Used to verify blocks in parallel
|
|
@@ -122,10 +121,10 @@ class Blockchain:
|
|
|
122
121
|
|
|
123
122
|
@staticmethod
|
|
124
123
|
async def create(
|
|
125
|
-
coin_store:
|
|
124
|
+
coin_store: CoinStoreProtocol,
|
|
126
125
|
block_store: BlockStore,
|
|
126
|
+
height_map: BlockHeightMap,
|
|
127
127
|
consensus_constants: ConsensusConstants,
|
|
128
|
-
blockchain_dir: Path,
|
|
129
128
|
reserved_cores: int,
|
|
130
129
|
*,
|
|
131
130
|
single_threaded: bool = False,
|
|
@@ -157,7 +156,7 @@ class Blockchain:
|
|
|
157
156
|
self.coin_store = coin_store
|
|
158
157
|
self.block_store = block_store
|
|
159
158
|
self._shut_down = False
|
|
160
|
-
await self._load_chain_from_store(
|
|
159
|
+
await self._load_chain_from_store(height_map)
|
|
161
160
|
self._seen_compact_proofs = set()
|
|
162
161
|
return self
|
|
163
162
|
|
|
@@ -165,11 +164,11 @@ class Blockchain:
|
|
|
165
164
|
self._shut_down = True
|
|
166
165
|
self.pool.shutdown(wait=True)
|
|
167
166
|
|
|
168
|
-
async def _load_chain_from_store(self,
|
|
167
|
+
async def _load_chain_from_store(self, height_map: BlockHeightMap) -> None:
|
|
169
168
|
"""
|
|
170
169
|
Initializes the state of the Blockchain class from the database.
|
|
171
170
|
"""
|
|
172
|
-
self.__height_map =
|
|
171
|
+
self.__height_map = height_map
|
|
173
172
|
self.__block_records = {}
|
|
174
173
|
self.__heights_in_cache = {}
|
|
175
174
|
block_records, peak = await self.block_store.get_block_records_close_to_peak(self.constants.BLOCKS_CACHE_SIZE)
|
|
@@ -268,7 +267,7 @@ class Blockchain:
|
|
|
268
267
|
assert block.height == 0 or fork_info.peak_hash == block.prev_header_hash
|
|
269
268
|
|
|
270
269
|
additions: list[tuple[Coin, Optional[bytes]]] = []
|
|
271
|
-
removals: list[Coin] = []
|
|
270
|
+
removals: list[tuple[bytes32, Coin]] = []
|
|
272
271
|
if block.transactions_generator is not None:
|
|
273
272
|
block_generator: Optional[BlockGenerator] = await get_block_generator(self.lookup_block_generators, block)
|
|
274
273
|
assert block_generator is not None
|
|
@@ -361,7 +360,7 @@ class Blockchain:
|
|
|
361
360
|
fork_info.reset(block.height - 1, block.prev_header_hash)
|
|
362
361
|
|
|
363
362
|
# we dont consider block_record passed in here since it might be from
|
|
364
|
-
# a current sync process and not yet fully validated and
|
|
363
|
+
# a current sync process and not yet fully validated and committed to the DB
|
|
365
364
|
block_rec_from_db = await self.get_block_record_from_db(header_hash)
|
|
366
365
|
if block_rec_from_db is not None:
|
|
367
366
|
# We have already validated the block, but if it's not part of the
|
|
@@ -511,8 +510,7 @@ class Blockchain:
|
|
|
511
510
|
)
|
|
512
511
|
|
|
513
512
|
if block_record.prev_hash != peak.header_hash:
|
|
514
|
-
|
|
515
|
-
rolled_back_state[coin_record.name] = coin_record
|
|
513
|
+
rolled_back_state = await self.coin_store.rollback_to_block(fork_info.fork_height)
|
|
516
514
|
if self._log_coins and len(rolled_back_state) > 0:
|
|
517
515
|
log.info(f"rolled back {len(rolled_back_state)} coins, to fork height {fork_info.fork_height}")
|
|
518
516
|
log.info(
|
|
@@ -566,8 +564,8 @@ class Blockchain:
|
|
|
566
564
|
if fork_add.confirmed_height == height and fork_add.is_coinbase
|
|
567
565
|
]
|
|
568
566
|
tx_additions = [
|
|
569
|
-
fork_add.coin
|
|
570
|
-
for fork_add in fork_info.additions_since_fork.
|
|
567
|
+
(coin_id, fork_add.coin, fork_add.same_as_parent)
|
|
568
|
+
for coin_id, fork_add in fork_info.additions_since_fork.items()
|
|
571
569
|
if fork_add.confirmed_height == height and not fork_add.is_coinbase
|
|
572
570
|
]
|
|
573
571
|
tx_removals = [
|
|
@@ -588,7 +586,7 @@ class Blockchain:
|
|
|
588
586
|
f"height: {fetched_block_record.height}), {len(tx_removals)} spends"
|
|
589
587
|
)
|
|
590
588
|
log.info("rewards: %s", ",".join([add.name().hex()[0:6] for add in included_reward_coins]))
|
|
591
|
-
log.info("additions: %s", ",".join([add.
|
|
589
|
+
log.info("additions: %s", ",".join([add[0].hex()[0:6] for add in tx_additions]))
|
|
592
590
|
log.info("removals: %s", ",".join([f"{rem}"[0:6] for rem in tx_removals]))
|
|
593
591
|
|
|
594
592
|
# we made it to the end successfully
|
|
@@ -612,20 +610,13 @@ class Blockchain:
|
|
|
612
610
|
[fork_add.coin for fork_add in fork_info.additions_since_fork.values() if fork_add.is_coinbase],
|
|
613
611
|
)
|
|
614
612
|
|
|
615
|
-
def
|
|
613
|
+
def get_next_sub_slot_iters_and_difficulty(self, header_hash: bytes32, new_slot: bool) -> tuple[uint64, uint64]:
|
|
616
614
|
curr = self.try_block_record(header_hash)
|
|
617
615
|
assert curr is not None
|
|
618
616
|
if curr.height <= 2:
|
|
619
|
-
return self.constants.DIFFICULTY_STARTING
|
|
620
|
-
|
|
621
|
-
return get_next_sub_slot_iters_and_difficulty(self.constants, new_slot, curr, self)[1]
|
|
617
|
+
return self.constants.SUB_SLOT_ITERS_STARTING, self.constants.DIFFICULTY_STARTING
|
|
622
618
|
|
|
623
|
-
|
|
624
|
-
curr = self.try_block_record(header_hash)
|
|
625
|
-
assert curr is not None
|
|
626
|
-
if curr.height <= 2:
|
|
627
|
-
return self.constants.SUB_SLOT_ITERS_STARTING
|
|
628
|
-
return get_next_sub_slot_iters_and_difficulty(self.constants, new_slot, curr, self)[0]
|
|
619
|
+
return get_next_sub_slot_iters_and_difficulty(self.constants, new_slot, curr, self)
|
|
629
620
|
|
|
630
621
|
async def get_sp_and_ip_sub_slots(
|
|
631
622
|
self, header_hash: bytes32
|
|
@@ -2,14 +2,10 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Optional, Protocol
|
|
4
4
|
|
|
5
|
-
from chia_rs import SubEpochChallengeSegment
|
|
5
|
+
from chia_rs import BlockRecord, HeaderBlock, SubEpochChallengeSegment, SubEpochSummary
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint32
|
|
8
8
|
|
|
9
|
-
from chia.consensus.block_record import BlockRecord
|
|
10
|
-
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
11
|
-
from chia.types.header_block import HeaderBlock
|
|
12
|
-
|
|
13
9
|
|
|
14
10
|
class BlockRecordsProtocol(Protocol):
|
|
15
11
|
def try_block_record(self, header_hash: bytes32) -> Optional[BlockRecord]: ...
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from chia_rs import (
|
|
6
|
+
SpendBundleConditions,
|
|
7
|
+
)
|
|
8
|
+
from chia_rs.sized_bytes import bytes32
|
|
9
|
+
from chia_rs.sized_ints import uint32, uint64
|
|
10
|
+
|
|
11
|
+
from chia.types.coin_record import CoinRecord
|
|
12
|
+
from chia.util.errors import Err
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def check_time_locks(
|
|
16
|
+
removal_coin_records: dict[bytes32, CoinRecord],
|
|
17
|
+
bundle_conds: SpendBundleConditions,
|
|
18
|
+
prev_transaction_block_height: uint32,
|
|
19
|
+
timestamp: uint64,
|
|
20
|
+
) -> Optional[Err]:
|
|
21
|
+
"""
|
|
22
|
+
Check all time and height conditions against current state.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
if prev_transaction_block_height < bundle_conds.height_absolute:
|
|
26
|
+
return Err.ASSERT_HEIGHT_ABSOLUTE_FAILED
|
|
27
|
+
if timestamp < bundle_conds.seconds_absolute:
|
|
28
|
+
return Err.ASSERT_SECONDS_ABSOLUTE_FAILED
|
|
29
|
+
if bundle_conds.before_height_absolute is not None:
|
|
30
|
+
if prev_transaction_block_height >= bundle_conds.before_height_absolute:
|
|
31
|
+
return Err.ASSERT_BEFORE_HEIGHT_ABSOLUTE_FAILED
|
|
32
|
+
if bundle_conds.before_seconds_absolute is not None:
|
|
33
|
+
if timestamp >= bundle_conds.before_seconds_absolute:
|
|
34
|
+
return Err.ASSERT_BEFORE_SECONDS_ABSOLUTE_FAILED
|
|
35
|
+
|
|
36
|
+
for spend in bundle_conds.spends:
|
|
37
|
+
unspent = removal_coin_records[bytes32(spend.coin_id)]
|
|
38
|
+
if spend.birth_height is not None:
|
|
39
|
+
if spend.birth_height != unspent.confirmed_block_index:
|
|
40
|
+
return Err.ASSERT_MY_BIRTH_HEIGHT_FAILED
|
|
41
|
+
if spend.birth_seconds is not None:
|
|
42
|
+
if spend.birth_seconds != unspent.timestamp:
|
|
43
|
+
return Err.ASSERT_MY_BIRTH_SECONDS_FAILED
|
|
44
|
+
if spend.height_relative is not None:
|
|
45
|
+
if prev_transaction_block_height < unspent.confirmed_block_index + spend.height_relative:
|
|
46
|
+
return Err.ASSERT_HEIGHT_RELATIVE_FAILED
|
|
47
|
+
if spend.seconds_relative is not None:
|
|
48
|
+
if timestamp < unspent.timestamp + spend.seconds_relative:
|
|
49
|
+
return Err.ASSERT_SECONDS_RELATIVE_FAILED
|
|
50
|
+
if spend.before_height_relative is not None:
|
|
51
|
+
if prev_transaction_block_height >= unspent.confirmed_block_index + spend.before_height_relative:
|
|
52
|
+
return Err.ASSERT_BEFORE_HEIGHT_RELATIVE_FAILED
|
|
53
|
+
if spend.before_seconds_relative is not None:
|
|
54
|
+
if timestamp >= unspent.timestamp + spend.before_seconds_relative:
|
|
55
|
+
return Err.ASSERT_BEFORE_SECONDS_RELATIVE_FAILED
|
|
56
|
+
|
|
57
|
+
return None
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Collection
|
|
4
|
+
from typing import Optional, Protocol
|
|
5
|
+
|
|
6
|
+
from chia_rs import CoinState
|
|
7
|
+
from chia_rs.sized_bytes import bytes32
|
|
8
|
+
from chia_rs.sized_ints import uint32, uint64
|
|
9
|
+
|
|
10
|
+
from chia.types.blockchain_format.coin import Coin
|
|
11
|
+
from chia.types.coin_record import CoinRecord
|
|
12
|
+
from chia.types.mempool_item import UnspentLineageInfo
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CoinStoreProtocol(Protocol):
|
|
16
|
+
"""
|
|
17
|
+
Protocol defining the interface for CoinStore.
|
|
18
|
+
This is a substitute for importing from chia.full_node.coin_store directly.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
async def new_block(
|
|
22
|
+
self,
|
|
23
|
+
height: uint32,
|
|
24
|
+
timestamp: uint64,
|
|
25
|
+
included_reward_coins: Collection[Coin],
|
|
26
|
+
tx_additions: Collection[tuple[bytes32, Coin, bool]],
|
|
27
|
+
tx_removals: list[bytes32],
|
|
28
|
+
) -> None:
|
|
29
|
+
"""
|
|
30
|
+
Add a new block to the coin store
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
async def get_coin_record(self, coin_id: bytes32) -> Optional[CoinRecord]:
|
|
34
|
+
"""
|
|
35
|
+
Returns the coin record for the specified coin id
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
async def get_coin_records(self, coin_ids: Collection[bytes32]) -> list[CoinRecord]:
|
|
39
|
+
"""
|
|
40
|
+
Returns the coin records for the specified coin ids
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
async def get_coins_added_at_height(self, height: uint32) -> list[CoinRecord]:
|
|
44
|
+
"""
|
|
45
|
+
Returns the coins added at a specific height
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
async def get_coins_removed_at_height(self, height: uint32) -> list[CoinRecord]:
|
|
49
|
+
"""
|
|
50
|
+
Returns the coins removed at a specific height
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
async def get_coin_records_by_puzzle_hash(
|
|
54
|
+
self,
|
|
55
|
+
include_spent_coins: bool,
|
|
56
|
+
puzzle_hash: bytes32,
|
|
57
|
+
start_height: uint32 = ...,
|
|
58
|
+
end_height: uint32 = ...,
|
|
59
|
+
) -> list[CoinRecord]:
|
|
60
|
+
"""
|
|
61
|
+
Returns the coin records for a specific puzzle hash
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
async def get_coin_records_by_puzzle_hashes(
|
|
65
|
+
self,
|
|
66
|
+
coins: bool,
|
|
67
|
+
puzzle_hashes: list[bytes32],
|
|
68
|
+
start_height: uint32 = ...,
|
|
69
|
+
end_height: uint32 = ...,
|
|
70
|
+
) -> list[CoinRecord]:
|
|
71
|
+
"""
|
|
72
|
+
Returns the coin records for a list of puzzle hashes
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
async def get_coin_records_by_names(
|
|
76
|
+
self,
|
|
77
|
+
include_spent_coins: bool,
|
|
78
|
+
names: list[bytes32],
|
|
79
|
+
start_height: uint32 = ...,
|
|
80
|
+
end_height: uint32 = ...,
|
|
81
|
+
) -> list[CoinRecord]:
|
|
82
|
+
"""
|
|
83
|
+
Returns the coin records for a list of coin names
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
async def get_coin_states_by_puzzle_hashes(
|
|
87
|
+
self,
|
|
88
|
+
include_spent_coins: bool,
|
|
89
|
+
puzzle_hashes: set[bytes32],
|
|
90
|
+
min_height: uint32 = uint32(0),
|
|
91
|
+
*,
|
|
92
|
+
max_items: int = ...,
|
|
93
|
+
) -> set[CoinState]:
|
|
94
|
+
"""
|
|
95
|
+
Returns the coin states for a set of puzzle hashes
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
async def get_coin_records_by_parent_ids(
|
|
99
|
+
self,
|
|
100
|
+
include_spent_coins: bool,
|
|
101
|
+
parent_ids: list[bytes32],
|
|
102
|
+
start_height: uint32 = ...,
|
|
103
|
+
end_height: uint32 = ...,
|
|
104
|
+
) -> list[CoinRecord]:
|
|
105
|
+
"""
|
|
106
|
+
Returns the coin records for a list of parent ids
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
async def get_coin_states_by_ids(
|
|
110
|
+
self,
|
|
111
|
+
include_spent_coins: bool,
|
|
112
|
+
coin_ids: Collection[bytes32],
|
|
113
|
+
min_height: uint32 = uint32(0),
|
|
114
|
+
*,
|
|
115
|
+
max_height: uint32 = ...,
|
|
116
|
+
max_items: int = ...,
|
|
117
|
+
) -> list[CoinState]:
|
|
118
|
+
"""
|
|
119
|
+
Returns the coin states for a collection of coin ids
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
async def batch_coin_states_by_puzzle_hashes(
|
|
123
|
+
self,
|
|
124
|
+
puzzle_hashes: list[bytes32],
|
|
125
|
+
*,
|
|
126
|
+
min_height: uint32 = ...,
|
|
127
|
+
include_spent: bool = ...,
|
|
128
|
+
include_unspent: bool = ...,
|
|
129
|
+
include_hinted: bool = ...,
|
|
130
|
+
min_amount: uint64 = ...,
|
|
131
|
+
max_items: int = ...,
|
|
132
|
+
) -> tuple[list[CoinState], Optional[uint32]]:
|
|
133
|
+
"""
|
|
134
|
+
Returns the coin states, as well as the next block height (or `None` if finished).
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
async def get_unspent_lineage_info_for_puzzle_hash(self, puzzle_hash: bytes32) -> Optional[UnspentLineageInfo]:
|
|
138
|
+
"""
|
|
139
|
+
Lookup the most recent unspent lineage that matches a puzzle hash
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
async def rollback_to_block(self, block_index: int) -> dict[bytes32, CoinRecord]:
|
|
143
|
+
"""
|
|
144
|
+
Rolls back the blockchain to the specified block index
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
# DEPRECATED: do not use in new code
|
|
148
|
+
async def is_empty(self) -> bool:
|
|
149
|
+
"""
|
|
150
|
+
Returns True if the coin store is empty
|
|
151
|
+
"""
|
chia/consensus/coinbase.py
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from chia_rs import G1Element
|
|
4
3
|
from chia_rs.sized_bytes import bytes32
|
|
5
4
|
from chia_rs.sized_ints import uint32, uint64
|
|
6
5
|
|
|
7
6
|
from chia.types.blockchain_format.coin import Coin
|
|
8
|
-
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_hash_for_pk
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def create_puzzlehash_for_pk(pub_key: G1Element) -> bytes32:
|
|
12
|
-
return puzzle_hash_for_pk(pub_key)
|
|
13
7
|
|
|
14
8
|
|
|
15
9
|
def pool_parent_id(block_height: uint32, genesis_challenge: bytes32) -> bytes32:
|
|
@@ -7,3 +7,7 @@ class ConditionCost(Enum):
|
|
|
7
7
|
# Condition Costs
|
|
8
8
|
AGG_SIG = 1200000 # the cost of one G1 subgroup check + aggregated signature validation
|
|
9
9
|
CREATE_COIN = 1800000
|
|
10
|
+
|
|
11
|
+
# with hard fork 2 (Chia 3.0) all conditions past the first 100 (per spend)
|
|
12
|
+
# has an additional cost of 500
|
|
13
|
+
GENERIC_CONDITION_COST = 500
|
|
@@ -3,17 +3,16 @@ from __future__ import annotations
|
|
|
3
3
|
from functools import lru_cache
|
|
4
4
|
from typing import Callable, Union
|
|
5
5
|
|
|
6
|
-
from chia_rs import G1Element
|
|
6
|
+
from chia_rs import G1Element, SpendBundleConditions, SpendConditions
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
8
8
|
from chia_rs.sized_ints import uint64
|
|
9
|
-
from clvm.casts import int_from_bytes, int_to_bytes
|
|
10
9
|
|
|
11
10
|
from chia.types.blockchain_format.coin import Coin
|
|
12
|
-
from chia.types.blockchain_format.program import Program
|
|
11
|
+
from chia.types.blockchain_format.program import Program, run_with_cost
|
|
13
12
|
from chia.types.blockchain_format.serialized_program import SerializedProgram
|
|
14
13
|
from chia.types.condition_opcodes import ConditionOpcode
|
|
15
14
|
from chia.types.condition_with_args import ConditionWithArgs
|
|
16
|
-
from chia.
|
|
15
|
+
from chia.util.casts import int_from_bytes, int_to_bytes
|
|
17
16
|
from chia.util.errors import ConsensusError, Err
|
|
18
17
|
from chia.util.hash import std_hash
|
|
19
18
|
|
|
@@ -195,7 +194,7 @@ def conditions_for_solution(
|
|
|
195
194
|
) -> list[ConditionWithArgs]:
|
|
196
195
|
# get the standard script for a puzzle hash and feed in the solution
|
|
197
196
|
try:
|
|
198
|
-
_cost, r =
|
|
197
|
+
_cost, r = run_with_cost(puzzle_reveal, max_cost, solution)
|
|
199
198
|
return parse_sexp_to_conditions(r)
|
|
200
199
|
except Program.EvalError as e:
|
|
201
200
|
raise ConsensusError(Err.SEXP_ERROR, [str(e)]) from e
|
|
@@ -3,9 +3,9 @@ from __future__ import annotations
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from typing import Optional
|
|
5
5
|
|
|
6
|
+
from chia_rs import SpendBundleConditions
|
|
6
7
|
from chia_rs.sized_ints import uint16
|
|
7
8
|
|
|
8
|
-
from chia.types.spend_bundle_conditions import SpendBundleConditions
|
|
9
9
|
from chia.util.streamable import Streamable, streamable
|
|
10
10
|
|
|
11
11
|
|
|
@@ -14,7 +14,7 @@ DEFAULT_CONSTANTS = ConsensusConstants(
|
|
|
14
14
|
SLOT_BLOCKS_TARGET=uint32(32),
|
|
15
15
|
MIN_BLOCKS_PER_CHALLENGE_BLOCK=uint8(16), # Must be less than half of SLOT_BLOCKS_TARGET
|
|
16
16
|
MAX_SUB_SLOT_BLOCKS=uint32(128), # Must be less than half of SUB_EPOCH_BLOCKS
|
|
17
|
-
NUM_SPS_SUB_SLOT=
|
|
17
|
+
NUM_SPS_SUB_SLOT=uint8(64), # Must be a power of 2
|
|
18
18
|
SUB_SLOT_ITERS_STARTING=uint64(2**27),
|
|
19
19
|
# DIFFICULTY_STARTING is the starting difficulty for the first epoch, which is then further
|
|
20
20
|
# multiplied by another factor of DIFFICULTY_CONSTANT_FACTOR, to be used in the VDF iter calculation formula.
|
|
@@ -26,9 +26,16 @@ DEFAULT_CONSTANTS = ConsensusConstants(
|
|
|
26
26
|
EPOCH_BLOCKS=uint32(4608), # The number of blocks per epoch, mainnet 4608. Must be multiple of SUB_EPOCH_SB
|
|
27
27
|
SIGNIFICANT_BITS=uint8(8), # The number of bits to look at in difficulty and min iters. The rest are zeroed
|
|
28
28
|
DISCRIMINANT_SIZE_BITS=uint16(1024), # Max is 1024 (based on ClassGroupElement int size)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
NUMBER_ZERO_BITS_PLOT_FILTER_V1=uint8(
|
|
30
|
+
9
|
|
31
|
+
), # H(plot signature of the challenge) must start with these many zeroes, for v1 plots
|
|
32
|
+
NUMBER_ZERO_BITS_PLOT_FILTER_V2=uint8(
|
|
33
|
+
5
|
|
34
|
+
), # H(plot signature of the challenge) must start with these many zeroes. for v2 plots
|
|
35
|
+
MIN_PLOT_SIZE_V1=uint8(32), # 32 for mainnet
|
|
36
|
+
MAX_PLOT_SIZE_V1=uint8(50),
|
|
37
|
+
MIN_PLOT_SIZE_V2=uint8(28),
|
|
38
|
+
MAX_PLOT_SIZE_V2=uint8(32),
|
|
32
39
|
SUB_SLOT_TIME_TARGET=uint16(600), # The target number of seconds per slot, mainnet 600
|
|
33
40
|
NUM_SP_INTERVALS_EXTRA=uint8(3), # The number of sp intervals to add to the signage point
|
|
34
41
|
MAX_FUTURE_TIME2=uint32(2 * 60), # The next block can have a timestamp of at most these many seconds in the future
|
|
@@ -38,7 +45,7 @@ DEFAULT_CONSTANTS = ConsensusConstants(
|
|
|
38
45
|
# Default used for tests is std_hash(b'')
|
|
39
46
|
GENESIS_CHALLENGE=bytes32.fromhex("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"),
|
|
40
47
|
# Forks of chia should change the AGG_SIG_*_ADDITIONAL_DATA values to provide
|
|
41
|
-
# replay attack protection. This is set to mainnet genesis
|
|
48
|
+
# replay attack protection. This is set to mainnet genesis challenge
|
|
42
49
|
AGG_SIG_ME_ADDITIONAL_DATA=AGG_SIG_DATA,
|
|
43
50
|
AGG_SIG_PARENT_ADDITIONAL_DATA=std_hash(AGG_SIG_DATA + bytes([43])),
|
|
44
51
|
AGG_SIG_PUZZLE_ADDITIONAL_DATA=std_hash(AGG_SIG_DATA + bytes([44])),
|
|
@@ -72,19 +79,35 @@ DEFAULT_CONSTANTS = ConsensusConstants(
|
|
|
72
79
|
MAX_GENERATOR_SIZE=uint32(1000000),
|
|
73
80
|
MAX_GENERATOR_REF_LIST_SIZE=uint32(512), # Number of references allowed in the block generator ref list
|
|
74
81
|
POOL_SUB_SLOT_ITERS=uint64(37600000000), # iters limit * NUM_SPS
|
|
75
|
-
SOFT_FORK6_HEIGHT=uint32(6800000),
|
|
76
82
|
# June 2024
|
|
77
83
|
HARD_FORK_HEIGHT=uint32(5496000),
|
|
84
|
+
HARD_FORK2_HEIGHT=uint32(0xFFFFFFFA),
|
|
85
|
+
# starting at the hard fork 2 height, v1 plots will gradually be phased out,
|
|
86
|
+
# and stop working entirely after this many blocks
|
|
87
|
+
PLOT_V1_PHASE_OUT=uint32(1179648),
|
|
78
88
|
# June 2027
|
|
79
89
|
PLOT_FILTER_128_HEIGHT=uint32(10542000),
|
|
80
90
|
# June 2030
|
|
81
91
|
PLOT_FILTER_64_HEIGHT=uint32(15592000),
|
|
82
92
|
# June 2033
|
|
83
93
|
PLOT_FILTER_32_HEIGHT=uint32(20643000),
|
|
94
|
+
PLOT_DIFFICULTY_INITIAL=uint8(2),
|
|
95
|
+
PLOT_DIFFICULTY_4_HEIGHT=uint32(0xFFFFFFFB),
|
|
96
|
+
PLOT_DIFFICULTY_5_HEIGHT=uint32(0xFFFFFFFC),
|
|
97
|
+
PLOT_DIFFICULTY_6_HEIGHT=uint32(0xFFFFFFFD),
|
|
98
|
+
PLOT_DIFFICULTY_7_HEIGHT=uint32(0xFFFFFFFE),
|
|
99
|
+
PLOT_DIFFICULTY_8_HEIGHT=uint32(0xFFFFFFFF),
|
|
84
100
|
)
|
|
85
101
|
|
|
86
102
|
|
|
87
103
|
def update_testnet_overrides(network_id: str, overrides: dict[str, Any]) -> None:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
104
|
+
# These constants changed names to support v2 plots
|
|
105
|
+
if "MIN_PLOT_SIZE_V1" not in overrides and "MIN_PLOT_SIZE" in overrides:
|
|
106
|
+
overrides["MIN_PLOT_SIZE_V1"] = overrides["MIN_PLOT_SIZE"]
|
|
107
|
+
overrides.pop("MIN_PLOT_SIZE")
|
|
108
|
+
if "MAX_PLOT_SIZE_V1" not in overrides and "MAX_PLOT_SIZE" in overrides:
|
|
109
|
+
overrides["MAX_PLOT_SIZE_V1"] = overrides["MAX_PLOT_SIZE"]
|
|
110
|
+
overrides.pop("MAX_PLOT_SIZE")
|
|
111
|
+
if network_id in {"testnet11", "testneta"}:
|
|
112
|
+
if "MIN_PLOT_SIZE_V2" not in overrides:
|
|
113
|
+
overrides["MIN_PLOT_SIZE_V2"] = 18
|
chia/consensus/deficit.py
CHANGED
|
@@ -2,11 +2,9 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
|
-
from chia_rs import ConsensusConstants
|
|
5
|
+
from chia_rs import BlockRecord, ConsensusConstants
|
|
6
6
|
from chia_rs.sized_ints import uint8, uint32
|
|
7
7
|
|
|
8
|
-
from chia.consensus.block_record import BlockRecord
|
|
9
|
-
|
|
10
8
|
|
|
11
9
|
def calculate_deficit(
|
|
12
10
|
constants: ConsensusConstants,
|
|
@@ -2,11 +2,10 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
|
-
from chia_rs import ConsensusConstants
|
|
5
|
+
from chia_rs import BlockRecord, ConsensusConstants
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint8, uint32, uint64, uint128
|
|
8
8
|
|
|
9
|
-
from chia.consensus.block_record import BlockRecord
|
|
10
9
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
11
10
|
from chia.util.significant_bits import count_significant_bits, truncate_to_significant_bits
|
|
12
11
|
|
|
@@ -2,13 +2,11 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Union
|
|
4
4
|
|
|
5
|
-
from chia_rs import ConsensusConstants
|
|
5
|
+
from chia_rs import BlockRecord, ConsensusConstants, HeaderBlock
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint32
|
|
8
8
|
|
|
9
|
-
from chia.consensus.block_record import BlockRecord
|
|
10
9
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
11
|
-
from chia.types.header_block import HeaderBlock
|
|
12
10
|
|
|
13
11
|
|
|
14
12
|
async def find_fork_point_in_chain(
|
|
@@ -2,21 +2,16 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Optional, Union
|
|
4
4
|
|
|
5
|
-
from chia_rs import ConsensusConstants
|
|
5
|
+
from chia_rs import BlockRecord, ChallengeBlockInfo, ConsensusConstants, FullBlock, HeaderBlock, SubEpochSummary
|
|
6
6
|
from chia_rs.sized_bytes import bytes32
|
|
7
7
|
from chia_rs.sized_ints import uint8, uint32, uint64
|
|
8
8
|
|
|
9
|
-
from chia.consensus.block_record import BlockRecord
|
|
10
9
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
11
10
|
from chia.consensus.deficit import calculate_deficit
|
|
12
11
|
from chia.consensus.difficulty_adjustment import get_next_sub_slot_iters_and_difficulty
|
|
13
12
|
from chia.consensus.make_sub_epoch_summary import make_sub_epoch_summary
|
|
14
13
|
from chia.consensus.pot_iterations import is_overflow_block
|
|
15
14
|
from chia.types.blockchain_format.classgroup import ClassgroupElement
|
|
16
|
-
from chia.types.blockchain_format.slots import ChallengeBlockInfo
|
|
17
|
-
from chia.types.blockchain_format.sub_epoch_summary import SubEpochSummary
|
|
18
|
-
from chia.types.full_block import FullBlock
|
|
19
|
-
from chia.types.header_block import HeaderBlock
|
|
20
15
|
from chia.util.errors import Err
|
|
21
16
|
|
|
22
17
|
|
|
@@ -3,14 +3,12 @@ from __future__ import annotations
|
|
|
3
3
|
from collections.abc import Collection
|
|
4
4
|
from typing import Optional
|
|
5
5
|
|
|
6
|
+
from chia_rs import FullBlock, HeaderBlock, SpendBundleConditions
|
|
6
7
|
from chia_rs.sized_bytes import bytes32
|
|
7
8
|
from chia_rs.sized_ints import uint64
|
|
8
9
|
from chiabip158 import PyBIP158
|
|
9
10
|
|
|
10
11
|
from chia.types.blockchain_format.coin import Coin
|
|
11
|
-
from chia.types.full_block import FullBlock
|
|
12
|
-
from chia.types.header_block import HeaderBlock
|
|
13
|
-
from chia.types.spend_bundle_conditions import SpendBundleConditions
|
|
14
12
|
|
|
15
13
|
|
|
16
14
|
def get_block_header(
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Union
|
|
4
|
+
from typing import Optional, Union
|
|
5
5
|
|
|
6
|
-
from chia_rs import ConsensusConstants
|
|
6
|
+
from chia_rs import BlockRecord, ConsensusConstants, FullBlock, HeaderBlock, UnfinishedBlock
|
|
7
7
|
from chia_rs.sized_bytes import bytes32
|
|
8
|
-
from chia_rs.sized_ints import uint64
|
|
8
|
+
from chia_rs.sized_ints import uint32, uint64
|
|
9
9
|
|
|
10
|
-
from chia.consensus.block_record import BlockRecord
|
|
11
10
|
from chia.consensus.blockchain_interface import BlockRecordsProtocol
|
|
12
|
-
from chia.types.full_block import FullBlock
|
|
13
|
-
from chia.types.header_block import HeaderBlock
|
|
14
|
-
from chia.types.unfinished_block import UnfinishedBlock
|
|
15
11
|
from chia.types.unfinished_header_block import UnfinishedHeaderBlock
|
|
16
12
|
|
|
17
13
|
log = logging.getLogger(__name__)
|
|
@@ -105,3 +101,30 @@ def get_block_challenge(
|
|
|
105
101
|
curr = blocks.block_record(curr.prev_hash)
|
|
106
102
|
challenge = reversed_challenge_hashes[challenges_to_look_for - 1]
|
|
107
103
|
return challenge
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def prev_tx_block(
|
|
107
|
+
blocks: BlockRecordsProtocol,
|
|
108
|
+
prev_b: Optional[Union[BlockRecord, FullBlock, HeaderBlock]],
|
|
109
|
+
) -> uint32:
|
|
110
|
+
# todo add check to make sure we dont return tx block from same sp as block we are validating
|
|
111
|
+
if prev_b is None:
|
|
112
|
+
return uint32(0)
|
|
113
|
+
if isinstance(prev_b, BlockRecord):
|
|
114
|
+
if prev_b.prev_transaction_block_hash is not None:
|
|
115
|
+
return prev_b.height
|
|
116
|
+
else:
|
|
117
|
+
curr = prev_b
|
|
118
|
+
elif isinstance(prev_b, FullBlock):
|
|
119
|
+
if prev_b.foliage_transaction_block is not None:
|
|
120
|
+
return prev_b.height
|
|
121
|
+
else:
|
|
122
|
+
curr = blocks.block_record(prev_b.header_hash)
|
|
123
|
+
elif isinstance(prev_b, HeaderBlock):
|
|
124
|
+
if prev_b.foliage_transaction_block is not None:
|
|
125
|
+
return prev_b.height
|
|
126
|
+
else:
|
|
127
|
+
curr = blocks.block_record(prev_b.header_hash)
|
|
128
|
+
while curr.is_transaction_block is False and curr.height > 0:
|
|
129
|
+
curr = blocks.block_record(curr.prev_hash)
|
|
130
|
+
return curr.height
|