chia-blockchain 2.5.7rc4__py3-none-any.whl → 2.5.8rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chia/__init__.py +8 -4
- chia/_tests/blockchain/blockchain_test_utils.py +6 -8
- chia/_tests/blockchain/test_augmented_chain.py +4 -4
- chia/_tests/blockchain/test_blockchain.py +165 -190
- chia/_tests/blockchain/test_build_chains.py +2 -4
- chia/_tests/blockchain/test_get_block_generator.py +2 -3
- chia/_tests/clvm/coin_store.py +4 -7
- chia/_tests/clvm/test_clvm_step.py +4 -4
- chia/_tests/clvm/test_puzzle_compression.py +2 -1
- chia/_tests/clvm/test_puzzle_drivers.py +2 -2
- chia/_tests/clvm/test_singletons.py +2 -4
- chia/_tests/clvm/test_spend_sim.py +2 -2
- chia/_tests/cmds/cmd_test_utils.py +27 -45
- chia/_tests/cmds/test_cmd_framework.py +6 -6
- chia/_tests/cmds/test_daemon.py +3 -3
- chia/_tests/cmds/test_show.py +4 -4
- chia/_tests/cmds/test_tx_config_args.py +1 -2
- chia/_tests/cmds/testing_classes.py +4 -5
- chia/_tests/cmds/wallet/test_did.py +24 -27
- chia/_tests/cmds/wallet/test_nft.py +12 -10
- chia/_tests/cmds/wallet/test_vcs.py +11 -12
- chia/_tests/cmds/wallet/test_wallet.py +134 -89
- chia/_tests/conftest.py +59 -30
- chia/_tests/connection_utils.py +2 -2
- chia/_tests/core/cmds/test_beta.py +4 -4
- chia/_tests/core/cmds/test_keys.py +2 -3
- chia/_tests/core/cmds/test_wallet.py +15 -15
- chia/_tests/core/consensus/test_pot_iterations.py +19 -73
- chia/_tests/core/custom_types/test_proof_of_space.py +124 -98
- chia/_tests/core/daemon/test_daemon.py +11 -11
- chia/_tests/core/data_layer/conftest.py +2 -2
- chia/_tests/core/data_layer/test_data_rpc.py +28 -14
- chia/_tests/core/data_layer/test_data_store.py +10 -10
- chia/_tests/core/data_layer/util.py +11 -11
- chia/_tests/core/farmer/test_farmer_api.py +2 -4
- chia/_tests/core/full_node/full_sync/test_full_sync.py +8 -7
- chia/_tests/core/full_node/stores/test_block_store.py +5 -4
- chia/_tests/core/full_node/stores/test_coin_store.py +5 -11
- chia/_tests/core/full_node/stores/test_full_node_store.py +8 -8
- chia/_tests/core/full_node/stores/test_hint_store.py +2 -2
- chia/_tests/core/full_node/test_block_height_map.py +3 -4
- chia/_tests/core/full_node/test_conditions.py +21 -23
- chia/_tests/core/full_node/test_full_node.py +225 -62
- chia/_tests/core/full_node/test_hint_management.py +2 -4
- chia/_tests/core/full_node/test_performance.py +0 -1
- chia/_tests/core/full_node/test_prev_tx_block.py +88 -11
- chia/_tests/core/full_node/test_transactions.py +1 -2
- chia/_tests/core/full_node/test_tx_processing_queue.py +109 -25
- chia/_tests/core/mempool/test_mempool.py +29 -37
- chia/_tests/core/mempool/test_mempool_fee_estimator.py +39 -39
- chia/_tests/core/mempool/test_mempool_fee_protocol.py +2 -6
- chia/_tests/core/mempool/test_mempool_manager.py +963 -839
- chia/_tests/core/mempool/test_singleton_fast_forward.py +6 -6
- chia/_tests/core/server/serve.py +7 -7
- chia/_tests/core/server/test_dos.py +1 -2
- chia/_tests/core/server/test_event_loop.py +12 -4
- chia/_tests/core/server/test_loop.py +7 -8
- chia/_tests/core/server/test_rate_limits.py +9 -8
- chia/_tests/core/server/test_server.py +61 -1
- chia/_tests/core/services/test_services.py +2 -2
- chia/_tests/core/ssl/test_ssl.py +2 -2
- chia/_tests/core/test_cost_calculation.py +2 -6
- chia/_tests/core/test_farmer_harvester_rpc.py +3 -5
- chia/_tests/core/test_filter.py +0 -1
- chia/_tests/core/test_full_node_rpc.py +2 -2
- chia/_tests/core/test_merkle_set.py +1 -2
- chia/_tests/core/test_seeder.py +4 -4
- chia/_tests/core/util/test_config.py +4 -4
- chia/_tests/core/util/test_jsonify.py +2 -2
- chia/_tests/core/util/test_keychain.py +3 -3
- chia/_tests/core/util/test_lockfile.py +2 -1
- chia/_tests/core/util/test_log_exceptions.py +1 -2
- chia/_tests/core/util/test_streamable.py +17 -17
- chia/_tests/db/test_db_wrapper.py +3 -2
- chia/_tests/environments/wallet.py +14 -14
- chia/_tests/ether.py +4 -3
- chia/_tests/farmer_harvester/test_farmer.py +41 -24
- chia/_tests/farmer_harvester/test_farmer_harvester.py +50 -17
- chia/_tests/farmer_harvester/test_filter_prefix_bits.py +27 -27
- chia/_tests/farmer_harvester/test_third_party_harvesters.py +21 -22
- chia/_tests/fee_estimation/test_fee_estimation_integration.py +18 -18
- chia/_tests/fee_estimation/test_fee_estimation_rpc.py +11 -9
- chia/_tests/harvester/test_harvester_api.py +11 -4
- chia/_tests/plot_sync/test_plot_sync.py +13 -11
- chia/_tests/plot_sync/test_receiver.py +11 -10
- chia/_tests/plot_sync/test_sync_simulated.py +2 -2
- chia/_tests/plot_sync/util.py +1 -2
- chia/_tests/plotting/test_plot_manager.py +7 -6
- chia/_tests/plotting/test_prover.py +30 -38
- chia/_tests/pools/test_pool_cmdline.py +4 -6
- chia/_tests/pools/test_pool_rpc.py +203 -61
- chia/_tests/pools/test_pool_wallet.py +3 -3
- chia/_tests/pools/test_wallet_pool_store.py +1 -4
- chia/_tests/process_junit.py +2 -2
- chia/_tests/rpc/test_rpc_client.py +4 -4
- chia/_tests/rpc/test_rpc_server.py +3 -3
- chia/_tests/simulation/test_simulation.py +12 -25
- chia/_tests/solver/test_solver_service.py +13 -4
- chia/_tests/testconfig.py +2 -2
- chia/_tests/timelord/test_new_peak.py +22 -11
- chia/_tests/tools/test_run_block.py +0 -2
- chia/_tests/tools/test_virtual_project.py +2 -1
- chia/_tests/util/benchmarks.py +1 -0
- chia/_tests/util/blockchain.py +38 -36
- chia/_tests/util/blockchain_mock.py +11 -11
- chia/_tests/util/build_network_protocol_files.py +2 -1
- chia/_tests/util/coin_store.py +2 -1
- chia/_tests/util/config.py +1 -1
- chia/_tests/util/db_connection.py +2 -3
- chia/_tests/util/full_sync.py +9 -11
- chia/_tests/util/gen_ssl_certs.py +4 -5
- chia/_tests/util/get_name_puzzle_conditions.py +2 -0
- chia/_tests/util/misc.py +24 -24
- chia/_tests/util/network_protocol_data.py +20 -3
- chia/_tests/util/protocol_messages_bytes-v1.0 +0 -0
- chia/_tests/util/protocol_messages_json.py +292 -3
- chia/_tests/util/setup_nodes.py +62 -47
- chia/_tests/util/spend_sim.py +57 -57
- chia/_tests/util/test_async_pool.py +2 -3
- chia/_tests/util/test_chia_version.py +1 -3
- chia/_tests/util/test_config.py +3 -3
- chia/_tests/util/test_full_block_utils.py +6 -3
- chia/_tests/util/test_limited_semaphore.py +1 -2
- chia/_tests/util/test_misc.py +2 -2
- chia/_tests/util/test_network.py +1 -2
- chia/_tests/util/test_priority_mutex.py +3 -3
- chia/_tests/util/test_recursive_replace.py +5 -6
- chia/_tests/util/test_replace_str_to_bytes.py +8 -10
- chia/_tests/util/test_testnet_overrides.py +3 -3
- chia/_tests/util/time_out_assert.py +2 -2
- chia/_tests/wallet/cat_wallet/test_cat_lifecycle.py +4 -6
- chia/_tests/wallet/cat_wallet/test_cat_outer_puzzle.py +2 -4
- chia/_tests/wallet/cat_wallet/test_cat_wallet.py +19 -13
- chia/_tests/wallet/cat_wallet/test_offer_lifecycle.py +13 -13
- chia/_tests/wallet/cat_wallet/test_trades.py +40 -38
- chia/_tests/wallet/clawback/test_clawback_lifecycle.py +2 -4
- chia/_tests/wallet/conftest.py +6 -6
- chia/_tests/wallet/db_wallet/test_db_graftroot.py +1 -1
- chia/_tests/wallet/db_wallet/test_dl_offers.py +34 -34
- chia/_tests/wallet/did_wallet/test_did.py +16 -6
- chia/_tests/wallet/nft_wallet/test_nft_1_offers.py +21 -21
- chia/_tests/wallet/nft_wallet/test_nft_bulk_mint.py +20 -6
- chia/_tests/wallet/nft_wallet/test_nft_offers.py +19 -21
- chia/_tests/wallet/nft_wallet/test_nft_puzzles.py +1 -2
- chia/_tests/wallet/nft_wallet/test_nft_wallet.py +121 -2
- chia/_tests/wallet/nft_wallet/test_ownership_outer_puzzle.py +6 -9
- chia/_tests/wallet/rpc/test_dl_wallet_rpc.py +44 -1
- chia/_tests/wallet/rpc/test_wallet_rpc.py +1672 -896
- chia/_tests/wallet/sync/test_wallet_sync.py +43 -47
- chia/_tests/wallet/test_clvm_streamable.py +2 -3
- chia/_tests/wallet/test_coin_management.py +2 -2
- chia/_tests/wallet/test_conditions.py +45 -51
- chia/_tests/wallet/test_debug_spend_bundle.py +2 -2
- chia/_tests/wallet/test_new_wallet_protocol.py +4 -6
- chia/_tests/wallet/test_notifications.py +14 -14
- chia/_tests/wallet/test_signer_protocol.py +5 -5
- chia/_tests/wallet/test_singleton_lifecycle_fast.py +4 -3
- chia/_tests/wallet/test_transaction_store.py +20 -20
- chia/_tests/wallet/test_util.py +2 -2
- chia/_tests/wallet/test_wallet.py +380 -228
- chia/_tests/wallet/test_wallet_action_scope.py +4 -4
- chia/_tests/wallet/test_wallet_blockchain.py +12 -12
- chia/_tests/wallet/test_wallet_coin_store.py +3 -4
- chia/_tests/wallet/test_wallet_node.py +14 -14
- chia/_tests/wallet/test_wallet_test_framework.py +2 -1
- chia/_tests/wallet/test_wallet_utils.py +2 -3
- chia/_tests/wallet/vc_wallet/test_cr_outer_puzzle.py +3 -5
- chia/_tests/wallet/vc_wallet/test_vc_lifecycle.py +14 -15
- chia/_tests/wallet/vc_wallet/test_vc_wallet.py +29 -24
- chia/_tests/wallet/wallet_block_tools.py +12 -11
- chia/_tests/weight_proof/config.py +1 -0
- chia/_tests/weight_proof/test_weight_proof.py +5 -4
- chia/apis/__init__.py +21 -0
- chia/apis/farmer_stub.py +102 -0
- chia/apis/full_node_stub.py +372 -0
- chia/apis/harvester_stub.py +57 -0
- chia/apis/introducer_stub.py +35 -0
- chia/apis/solver_stub.py +30 -0
- chia/apis/stub_protocol_registry.py +21 -0
- chia/apis/timelord_stub.py +39 -0
- chia/apis/wallet_stub.py +161 -0
- chia/cmds/beta.py +3 -4
- chia/cmds/beta_funcs.py +4 -3
- chia/cmds/check_wallet_db.py +4 -4
- chia/cmds/chia.py +1 -2
- chia/cmds/cmd_classes.py +11 -13
- chia/cmds/cmd_helpers.py +11 -11
- chia/cmds/cmds_util.py +15 -15
- chia/cmds/coin_funcs.py +6 -7
- chia/cmds/coins.py +2 -3
- chia/cmds/configure.py +1 -2
- chia/cmds/data.py +42 -42
- chia/cmds/data_funcs.py +81 -81
- chia/cmds/db.py +4 -5
- 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/data.py +4 -4
- chia/cmds/dev/gh.py +5 -5
- chia/cmds/dev/installers.py +2 -3
- chia/cmds/dev/mempool.py +3 -4
- chia/cmds/dev/mempool_funcs.py +4 -4
- chia/cmds/dev/sim.py +8 -8
- chia/cmds/dump_keyring.py +3 -3
- chia/cmds/farm.py +6 -8
- chia/cmds/farm_funcs.py +25 -24
- chia/cmds/init_funcs.py +4 -4
- chia/cmds/keys.py +16 -18
- chia/cmds/keys_funcs.py +36 -36
- chia/cmds/netspace.py +1 -3
- chia/cmds/netspace_funcs.py +1 -2
- chia/cmds/options.py +3 -2
- chia/cmds/param_types.py +17 -16
- chia/cmds/passphrase.py +6 -7
- chia/cmds/passphrase_funcs.py +11 -13
- chia/cmds/peer.py +1 -3
- chia/cmds/peer_funcs.py +3 -3
- chia/cmds/plotnft.py +6 -7
- chia/cmds/plotnft_funcs.py +37 -26
- chia/cmds/rpc.py +3 -3
- chia/cmds/show.py +3 -5
- chia/cmds/show_funcs.py +9 -9
- chia/cmds/sim_funcs.py +25 -26
- chia/cmds/solver.py +1 -3
- chia/cmds/solver_funcs.py +1 -2
- chia/cmds/start_funcs.py +2 -2
- chia/cmds/wallet.py +76 -81
- chia/cmds/wallet_funcs.py +206 -177
- chia/consensus/augmented_chain.py +6 -6
- chia/consensus/block_body_validation.py +19 -15
- chia/consensus/block_creation.py +25 -21
- chia/consensus/block_header_validation.py +27 -13
- chia/consensus/block_height_map.py +3 -6
- chia/consensus/block_height_map_protocol.py +2 -2
- chia/consensus/block_record.py +2 -4
- chia/consensus/blockchain.py +58 -40
- chia/consensus/blockchain_interface.py +7 -7
- chia/consensus/coin_store_protocol.py +5 -6
- chia/consensus/condition_tools.py +4 -4
- chia/consensus/cost_calculator.py +2 -3
- chia/consensus/default_constants.py +16 -13
- chia/consensus/deficit.py +1 -3
- chia/consensus/difficulty_adjustment.py +3 -5
- chia/consensus/find_fork_point.py +2 -4
- chia/consensus/full_block_to_block_record.py +11 -13
- chia/consensus/generator_tools.py +2 -3
- chia/consensus/get_block_challenge.py +42 -26
- chia/consensus/get_block_generator.py +2 -3
- chia/consensus/make_sub_epoch_summary.py +8 -7
- chia/consensus/multiprocess_validation.py +31 -20
- chia/consensus/pos_quality.py +6 -23
- chia/consensus/pot_iterations.py +17 -44
- chia/consensus/signage_point.py +4 -5
- chia/consensus/vdf_info_computation.py +2 -4
- chia/daemon/client.py +8 -8
- chia/daemon/keychain_proxy.py +31 -37
- chia/daemon/server.py +32 -33
- chia/daemon/windows_signal.py +4 -3
- chia/data_layer/data_layer.py +86 -77
- chia/data_layer/data_layer_rpc_api.py +9 -9
- chia/data_layer/data_layer_rpc_client.py +13 -15
- chia/data_layer/data_layer_server.py +3 -3
- chia/data_layer/data_layer_util.py +14 -14
- chia/data_layer/data_layer_wallet.py +94 -101
- chia/data_layer/data_store.py +50 -50
- chia/data_layer/dl_wallet_store.py +9 -12
- chia/data_layer/download_data.py +8 -9
- chia/data_layer/s3_plugin_service.py +5 -9
- chia/data_layer/start_data_layer.py +5 -5
- chia/farmer/farmer.py +31 -31
- chia/farmer/farmer_api.py +45 -33
- chia/farmer/farmer_rpc_api.py +5 -4
- chia/farmer/farmer_rpc_client.py +6 -6
- chia/farmer/start_farmer.py +6 -6
- chia/full_node/block_store.py +13 -16
- chia/full_node/check_fork_next_block.py +1 -2
- chia/full_node/coin_store.py +15 -16
- chia/full_node/eligible_coin_spends.py +3 -3
- chia/full_node/fee_estimate_store.py +2 -3
- chia/full_node/fee_tracker.py +1 -2
- chia/full_node/full_block_utils.py +4 -4
- chia/full_node/full_node.py +238 -224
- chia/full_node/full_node_api.py +193 -150
- chia/full_node/full_node_rpc_api.py +53 -31
- chia/full_node/full_node_rpc_client.py +18 -19
- chia/full_node/full_node_store.py +45 -43
- chia/full_node/hint_management.py +2 -2
- chia/full_node/mempool.py +17 -19
- chia/full_node/mempool_manager.py +89 -42
- chia/full_node/pending_tx_cache.py +2 -3
- chia/full_node/start_full_node.py +5 -5
- chia/full_node/sync_store.py +3 -4
- chia/full_node/tx_processing_queue.py +34 -13
- chia/full_node/weight_proof.py +61 -48
- chia/harvester/harvester.py +25 -24
- chia/harvester/harvester_api.py +61 -38
- chia/harvester/harvester_rpc_api.py +10 -10
- chia/harvester/start_harvester.py +4 -4
- chia/introducer/introducer.py +3 -3
- chia/introducer/introducer_api.py +6 -4
- chia/introducer/start_introducer.py +4 -4
- chia/legacy/keyring.py +3 -3
- chia/plot_sync/delta.py +1 -2
- chia/plot_sync/receiver.py +20 -17
- chia/plot_sync/sender.py +15 -10
- chia/plotters/bladebit.py +7 -7
- chia/plotters/chiapos.py +2 -2
- chia/plotters/madmax.py +4 -4
- chia/plotters/plotters.py +4 -4
- chia/plotters/plotters_util.py +3 -3
- chia/plotting/cache.py +20 -14
- chia/plotting/check_plots.py +26 -35
- chia/plotting/create_plots.py +22 -23
- chia/plotting/manager.py +21 -14
- chia/plotting/prover.py +59 -42
- chia/plotting/util.py +16 -16
- chia/pools/pool_config.py +2 -1
- chia/pools/pool_puzzles.py +11 -12
- chia/pools/pool_wallet.py +34 -57
- chia/pools/pool_wallet_info.py +39 -10
- chia/protocols/farmer_protocol.py +8 -9
- chia/protocols/fee_estimate.py +3 -4
- chia/protocols/full_node_protocol.py +3 -4
- chia/protocols/harvester_protocol.py +27 -15
- chia/protocols/outbound_message.py +3 -3
- chia/protocols/pool_protocol.py +8 -9
- chia/protocols/shared_protocol.py +1 -2
- chia/protocols/solver_protocol.py +9 -2
- chia/protocols/timelord_protocol.py +4 -7
- chia/protocols/wallet_protocol.py +11 -12
- chia/rpc/rpc_client.py +9 -9
- chia/rpc/rpc_server.py +17 -17
- chia/rpc/util.py +2 -2
- chia/seeder/crawler.py +8 -8
- chia/seeder/crawler_api.py +21 -27
- chia/seeder/crawler_rpc_api.py +2 -2
- chia/seeder/dns_server.py +21 -21
- chia/seeder/start_crawler.py +4 -4
- chia/server/address_manager.py +15 -16
- chia/server/api_protocol.py +11 -11
- chia/server/chia_policy.py +46 -26
- chia/server/introducer_peers.py +2 -3
- chia/server/node_discovery.py +19 -19
- chia/server/rate_limit_numbers.py +4 -5
- chia/server/rate_limits.py +4 -4
- chia/server/resolve_peer_info.py +4 -4
- chia/server/server.py +49 -52
- chia/server/signal_handlers.py +6 -6
- chia/server/start_service.py +17 -17
- chia/server/upnp.py +4 -6
- chia/server/ws_connection.py +52 -37
- chia/simulator/add_blocks_in_batches.py +1 -3
- chia/simulator/block_tools.py +312 -200
- chia/simulator/full_node_simulator.py +56 -35
- chia/simulator/keyring.py +2 -3
- chia/simulator/setup_services.py +15 -15
- chia/simulator/simulator_full_node_rpc_api.py +1 -2
- chia/simulator/simulator_full_node_rpc_client.py +1 -2
- chia/simulator/simulator_protocol.py +1 -2
- chia/simulator/simulator_test_tools.py +3 -3
- chia/simulator/start_simulator.py +7 -7
- chia/simulator/wallet_tools.py +10 -10
- chia/solver/solver.py +10 -10
- chia/solver/solver_api.py +10 -8
- chia/solver/solver_rpc_api.py +2 -2
- chia/solver/start_solver.py +4 -4
- chia/ssl/cacert.pem +148 -90
- chia/ssl/chia_ca.crt +14 -10
- chia/ssl/chia_ca_old.crt +19 -0
- chia/ssl/create_ssl.py +4 -4
- chia/ssl/renewedselfsignedca.conf +4 -0
- chia/ssl/ssl_check.py +1 -2
- chia/timelord/iters_from_block.py +1 -4
- chia/timelord/start_timelord.py +4 -4
- chia/timelord/timelord.py +44 -40
- chia/timelord/timelord_api.py +6 -4
- chia/timelord/timelord_launcher.py +2 -2
- chia/timelord/timelord_rpc_api.py +2 -2
- chia/timelord/timelord_state.py +11 -12
- chia/types/block_protocol.py +1 -3
- chia/types/blockchain_format/coin.py +1 -3
- chia/types/blockchain_format/program.py +11 -8
- chia/types/blockchain_format/proof_of_space.py +123 -76
- chia/types/blockchain_format/tree_hash.py +3 -3
- chia/types/blockchain_format/vdf.py +1 -2
- chia/types/coin_spend.py +3 -3
- chia/types/mempool_item.py +5 -5
- chia/types/mempool_submission_status.py +2 -3
- chia/types/peer_info.py +1 -2
- chia/types/unfinished_header_block.py +3 -4
- chia/types/validation_state.py +1 -2
- chia/util/action_scope.py +8 -8
- chia/util/async_pool.py +5 -5
- chia/util/bech32m.py +1 -2
- chia/util/beta_metrics.py +2 -2
- chia/util/block_cache.py +4 -4
- chia/util/chia_logging.py +2 -2
- chia/util/chia_version.py +1 -2
- chia/util/config.py +15 -16
- chia/util/db_wrapper.py +26 -27
- chia/util/default_root.py +1 -2
- chia/util/errors.py +3 -3
- chia/util/file_keyring.py +14 -14
- chia/util/files.py +2 -3
- chia/util/hash.py +4 -4
- chia/util/initial-config.yaml +3 -5
- chia/util/inline_executor.py +2 -1
- chia/util/ip_address.py +1 -2
- chia/util/keychain.py +25 -27
- chia/util/keyring_wrapper.py +18 -19
- chia/util/lock.py +3 -4
- chia/util/log_exceptions.py +1 -2
- chia/util/lru_cache.py +2 -2
- chia/util/network.py +6 -6
- chia/util/path.py +2 -3
- chia/util/priority_mutex.py +2 -2
- chia/util/profiler.py +1 -2
- chia/util/safe_cancel_task.py +1 -2
- chia/util/streamable.py +22 -8
- chia/util/task_referencer.py +1 -1
- chia/util/timing.py +3 -3
- chia/util/virtual_project_analysis.py +6 -5
- chia/util/ws_message.py +2 -2
- chia/wallet/cat_wallet/cat_info.py +3 -4
- chia/wallet/cat_wallet/cat_outer_puzzle.py +12 -11
- chia/wallet/cat_wallet/cat_utils.py +3 -4
- chia/wallet/cat_wallet/cat_wallet.py +61 -83
- chia/wallet/cat_wallet/lineage_store.py +3 -4
- chia/wallet/cat_wallet/r_cat_wallet.py +19 -22
- chia/wallet/coin_selection.py +9 -10
- chia/wallet/conditions.py +120 -105
- chia/wallet/db_wallet/db_wallet_puzzles.py +4 -5
- chia/wallet/derivation_record.py +1 -2
- chia/wallet/derive_keys.py +2 -4
- chia/wallet/did_wallet/did_info.py +10 -11
- chia/wallet/did_wallet/did_wallet.py +36 -82
- chia/wallet/did_wallet/did_wallet_puzzles.py +7 -8
- chia/wallet/driver_protocol.py +5 -7
- chia/wallet/lineage_proof.py +4 -4
- chia/wallet/nft_wallet/metadata_outer_puzzle.py +11 -11
- chia/wallet/nft_wallet/nft_info.py +8 -9
- chia/wallet/nft_wallet/nft_puzzle_utils.py +8 -8
- chia/wallet/nft_wallet/nft_wallet.py +79 -116
- chia/wallet/nft_wallet/ownership_outer_puzzle.py +14 -14
- chia/wallet/nft_wallet/singleton_outer_puzzle.py +12 -11
- chia/wallet/nft_wallet/transfer_program_puzzle.py +11 -11
- chia/wallet/nft_wallet/uncurry_nft.py +10 -11
- chia/wallet/notification_manager.py +3 -3
- chia/wallet/notification_store.py +44 -61
- chia/wallet/outer_puzzles.py +6 -7
- chia/wallet/puzzle_drivers.py +34 -6
- chia/wallet/puzzles/clawback/drivers.py +6 -6
- chia/wallet/puzzles/deployed_puzzle_hashes.json +1 -54
- chia/wallet/puzzles/load_clvm.py +1 -1
- chia/wallet/puzzles/p2_delegated_puzzle_or_hidden_puzzle.py +1 -2
- chia/wallet/puzzles/singleton_top_layer.py +2 -3
- chia/wallet/puzzles/singleton_top_layer_v1_1.py +3 -4
- chia/wallet/puzzles/tails.py +3 -3
- chia/wallet/singleton.py +5 -7
- chia/wallet/singleton_record.py +3 -3
- chia/wallet/start_wallet.py +5 -5
- chia/wallet/trade_manager.py +37 -58
- chia/wallet/trade_record.py +4 -4
- chia/wallet/trading/offer.py +59 -46
- chia/wallet/trading/trade_store.py +8 -9
- chia/wallet/transaction_record.py +8 -8
- chia/wallet/uncurried_puzzle.py +1 -2
- chia/wallet/util/clvm_streamable.py +12 -12
- chia/wallet/util/compute_hints.py +4 -5
- chia/wallet/util/curry_and_treehash.py +1 -2
- chia/wallet/util/merkle_tree.py +2 -3
- chia/wallet/util/peer_request_cache.py +8 -8
- chia/wallet/util/signing.py +85 -0
- chia/wallet/util/tx_config.py +15 -6
- chia/wallet/util/wallet_sync_utils.py +14 -16
- chia/wallet/util/wallet_types.py +2 -2
- chia/wallet/vc_wallet/cr_cat_drivers.py +10 -11
- chia/wallet/vc_wallet/cr_cat_wallet.py +50 -68
- chia/wallet/vc_wallet/cr_outer_puzzle.py +14 -13
- chia/wallet/vc_wallet/vc_drivers.py +27 -27
- chia/wallet/vc_wallet/vc_store.py +5 -6
- chia/wallet/vc_wallet/vc_wallet.py +33 -61
- chia/wallet/wallet.py +50 -78
- chia/wallet/wallet_action_scope.py +11 -11
- chia/wallet/wallet_blockchain.py +12 -12
- chia/wallet/wallet_coin_record.py +12 -6
- chia/wallet/wallet_coin_store.py +24 -25
- chia/wallet/wallet_interested_store.py +3 -5
- chia/wallet/wallet_nft_store.py +10 -11
- chia/wallet/wallet_node.py +53 -61
- chia/wallet/wallet_node_api.py +5 -3
- chia/wallet/wallet_protocol.py +23 -23
- chia/wallet/wallet_puzzle_store.py +15 -18
- chia/wallet/wallet_request_types.py +778 -114
- chia/wallet/wallet_retry_store.py +1 -3
- chia/wallet/wallet_rpc_api.py +572 -909
- chia/wallet/wallet_rpc_client.py +87 -279
- chia/wallet/wallet_singleton_store.py +3 -4
- chia/wallet/wallet_state_manager.py +332 -106
- chia/wallet/wallet_transaction_store.py +11 -14
- chia/wallet/wallet_user_store.py +4 -6
- chia/wallet/wallet_weight_proof_handler.py +4 -4
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/METADATA +6 -5
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/RECORD +507 -516
- chia/apis.py +0 -21
- chia/consensus/check_time_locks.py +0 -57
- chia/data_layer/puzzles/__init__.py +0 -0
- chia/data_layer/puzzles/graftroot_dl_offers.clsp +0 -100
- chia/data_layer/puzzles/graftroot_dl_offers.clsp.hex +0 -1
- chia/types/coin_record.py +0 -44
- chia/wallet/nft_wallet/puzzles/__init__.py +0 -0
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/create_nft_launcher_from_did.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp +0 -6
- chia/wallet/nft_wallet/puzzles/nft_intermediate_launcher.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp +0 -30
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_default.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp +0 -28
- chia/wallet/nft_wallet/puzzles/nft_metadata_updater_updateable.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp +0 -100
- chia/wallet/nft_wallet/puzzles/nft_ownership_layer.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp +0 -78
- chia/wallet/nft_wallet/puzzles/nft_ownership_transfer_program_one_way_claim_with_royalties.clsp.hex +0 -1
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp +0 -74
- chia/wallet/nft_wallet/puzzles/nft_state_layer.clsp.hex +0 -1
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/WHEEL +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/entry_points.txt +0 -0
- {chia_blockchain-2.5.7rc4.dist-info → chia_blockchain-2.5.8rc1.dist-info}/licenses/LICENSE +0 -0
chia/data_layer/data_store.py
CHANGED
|
@@ -7,12 +7,12 @@ import logging
|
|
|
7
7
|
import shutil
|
|
8
8
|
import sqlite3
|
|
9
9
|
from collections import defaultdict
|
|
10
|
-
from collections.abc import AsyncIterator, Awaitable, Iterable, Iterator, Sequence
|
|
10
|
+
from collections.abc import AsyncIterator, Awaitable, Callable, Iterable, Iterator, Sequence
|
|
11
11
|
from contextlib import asynccontextmanager, contextmanager
|
|
12
12
|
from dataclasses import dataclass, field, replace
|
|
13
13
|
from hashlib import sha256
|
|
14
14
|
from pathlib import Path
|
|
15
|
-
from typing import Any, BinaryIO
|
|
15
|
+
from typing import Any, BinaryIO
|
|
16
16
|
|
|
17
17
|
import aiosqlite
|
|
18
18
|
import anyio.to_thread
|
|
@@ -90,11 +90,11 @@ class DataStore:
|
|
|
90
90
|
@contextlib.asynccontextmanager
|
|
91
91
|
async def managed(
|
|
92
92
|
cls,
|
|
93
|
-
database:
|
|
93
|
+
database: str | Path,
|
|
94
94
|
merkle_blobs_path: Path,
|
|
95
95
|
key_value_blobs_path: Path,
|
|
96
96
|
uri: bool = False,
|
|
97
|
-
sql_log_path:
|
|
97
|
+
sql_log_path: Path | None = None,
|
|
98
98
|
cache_capacity: int = 1,
|
|
99
99
|
prefer_db_kv_blob_length: int = default_prefer_file_kv_blob_length,
|
|
100
100
|
) -> AsyncIterator[DataStore]:
|
|
@@ -202,10 +202,10 @@ class DataStore:
|
|
|
202
202
|
async def insert_into_data_store_from_file(
|
|
203
203
|
self,
|
|
204
204
|
store_id: bytes32,
|
|
205
|
-
root_hash:
|
|
205
|
+
root_hash: bytes32 | None,
|
|
206
206
|
filename: Path,
|
|
207
|
-
delta_reader:
|
|
208
|
-
) ->
|
|
207
|
+
delta_reader: DeltaReader | None = None,
|
|
208
|
+
) -> DeltaReader | None:
|
|
209
209
|
async with self.db_wrapper.writer():
|
|
210
210
|
with self.manage_kv_files(store_id):
|
|
211
211
|
if root_hash is None:
|
|
@@ -453,7 +453,7 @@ class DataStore:
|
|
|
453
453
|
|
|
454
454
|
expected_synced_generations = synced_generations + len(roots)
|
|
455
455
|
for root in roots:
|
|
456
|
-
recovery_filename:
|
|
456
|
+
recovery_filename: Path | None = None
|
|
457
457
|
|
|
458
458
|
for group_by_store in (True, False):
|
|
459
459
|
filename = get_delta_filename_path(
|
|
@@ -495,7 +495,7 @@ class DataStore:
|
|
|
495
495
|
async def get_merkle_blob(
|
|
496
496
|
self,
|
|
497
497
|
store_id: bytes32,
|
|
498
|
-
root_hash:
|
|
498
|
+
root_hash: bytes32 | None,
|
|
499
499
|
read_only: bool = False,
|
|
500
500
|
update_cache: bool = True,
|
|
501
501
|
) -> MerkleBlob:
|
|
@@ -532,14 +532,14 @@ class DataStore:
|
|
|
532
532
|
|
|
533
533
|
return Path(*segments, raw)
|
|
534
534
|
|
|
535
|
-
def get_merkle_path(self, store_id: bytes32, root_hash:
|
|
535
|
+
def get_merkle_path(self, store_id: bytes32, root_hash: bytes32 | None) -> Path:
|
|
536
536
|
store_root = self.merkle_blobs_path.joinpath(store_id.hex())
|
|
537
537
|
if root_hash is None:
|
|
538
538
|
return store_root
|
|
539
539
|
|
|
540
540
|
return store_root.joinpath(self.get_bytes_path(bytes_=root_hash))
|
|
541
541
|
|
|
542
|
-
def get_key_value_path(self, store_id: bytes32, blob_hash:
|
|
542
|
+
def get_key_value_path(self, store_id: bytes32, blob_hash: bytes32 | None) -> Path:
|
|
543
543
|
store_root = self.key_value_blobs_path.joinpath(store_id.hex())
|
|
544
544
|
if blob_hash is None:
|
|
545
545
|
return store_root
|
|
@@ -551,7 +551,7 @@ class DataStore:
|
|
|
551
551
|
merkle_blob: MerkleBlob,
|
|
552
552
|
store_id: bytes32,
|
|
553
553
|
status: Status,
|
|
554
|
-
old_root:
|
|
554
|
+
old_root: Root | None = None,
|
|
555
555
|
update_cache: bool = True,
|
|
556
556
|
) -> Root:
|
|
557
557
|
if not merkle_blob.empty():
|
|
@@ -579,7 +579,7 @@ class DataStore:
|
|
|
579
579
|
def _use_file_for_new_kv_blob(self, blob: bytes) -> bool:
|
|
580
580
|
return len(blob) > self.prefer_db_kv_blob_length
|
|
581
581
|
|
|
582
|
-
async def get_kvid(self, blob: bytes, store_id: bytes32) ->
|
|
582
|
+
async def get_kvid(self, blob: bytes, store_id: bytes32) -> KeyOrValueId | None:
|
|
583
583
|
blob_hash = bytes32(sha256(blob).digest())
|
|
584
584
|
|
|
585
585
|
async with self.db_wrapper.reader() as reader:
|
|
@@ -602,7 +602,7 @@ class DataStore:
|
|
|
602
602
|
# TODO: consider file-system based locking of either the file or the store directory
|
|
603
603
|
return zstd.decompress(self.get_key_value_path(store_id=store_id, blob_hash=blob_hash).read_bytes()) # type: ignore[no-any-return]
|
|
604
604
|
|
|
605
|
-
async def get_blob_from_kvid(self, kv_id: KeyOrValueId, store_id: bytes32) ->
|
|
605
|
+
async def get_blob_from_kvid(self, kv_id: KeyOrValueId, store_id: bytes32) -> bytes | None:
|
|
606
606
|
async with self.db_wrapper.reader() as reader:
|
|
607
607
|
cursor = await reader.execute(
|
|
608
608
|
"SELECT hash, blob FROM ids WHERE kv_id = ? AND store_id = ?",
|
|
@@ -706,9 +706,9 @@ class DataStore:
|
|
|
706
706
|
self,
|
|
707
707
|
node_hash: bytes32,
|
|
708
708
|
store_id: bytes32,
|
|
709
|
-
root_hash:
|
|
709
|
+
root_hash: bytes32 | Unspecified = unspecified,
|
|
710
710
|
) -> TerminalNode:
|
|
711
|
-
resolved_root_hash:
|
|
711
|
+
resolved_root_hash: bytes32 | None
|
|
712
712
|
if root_hash is unspecified:
|
|
713
713
|
root = await self.get_tree_root(store_id=store_id)
|
|
714
714
|
resolved_root_hash = root.node_hash
|
|
@@ -723,9 +723,9 @@ class DataStore:
|
|
|
723
723
|
self,
|
|
724
724
|
node_hashes: list[bytes32],
|
|
725
725
|
store_id: bytes32,
|
|
726
|
-
root_hash:
|
|
726
|
+
root_hash: bytes32 | Unspecified = unspecified,
|
|
727
727
|
) -> list[TerminalNode]:
|
|
728
|
-
resolved_root_hash:
|
|
728
|
+
resolved_root_hash: bytes32 | None
|
|
729
729
|
if root_hash is unspecified:
|
|
730
730
|
root = await self.get_tree_root(store_id=store_id)
|
|
731
731
|
resolved_root_hash = root.node_hash
|
|
@@ -762,7 +762,7 @@ class DataStore:
|
|
|
762
762
|
|
|
763
763
|
return result
|
|
764
764
|
|
|
765
|
-
async def add_node_hashes(self, store_id: bytes32, generation:
|
|
765
|
+
async def add_node_hashes(self, store_id: bytes32, generation: int | None = None) -> None:
|
|
766
766
|
root = await self.get_tree_root(store_id=store_id, generation=generation)
|
|
767
767
|
if root.node_hash is None:
|
|
768
768
|
return
|
|
@@ -789,9 +789,9 @@ class DataStore:
|
|
|
789
789
|
async def _insert_root(
|
|
790
790
|
self,
|
|
791
791
|
store_id: bytes32,
|
|
792
|
-
node_hash:
|
|
792
|
+
node_hash: bytes32 | None,
|
|
793
793
|
status: Status,
|
|
794
|
-
generation:
|
|
794
|
+
generation: int | None = None,
|
|
795
795
|
) -> Root:
|
|
796
796
|
async with self.db_wrapper.writer_maybe_transaction() as writer:
|
|
797
797
|
if generation is None:
|
|
@@ -820,7 +820,7 @@ class DataStore:
|
|
|
820
820
|
)
|
|
821
821
|
return new_root
|
|
822
822
|
|
|
823
|
-
async def get_pending_root(self, store_id: bytes32) ->
|
|
823
|
+
async def get_pending_root(self, store_id: bytes32) -> Root | None:
|
|
824
824
|
async with self.db_wrapper.reader() as reader:
|
|
825
825
|
cursor = await reader.execute(
|
|
826
826
|
"""
|
|
@@ -845,7 +845,7 @@ class DataStore:
|
|
|
845
845
|
|
|
846
846
|
return Root.from_row(row=row)
|
|
847
847
|
|
|
848
|
-
async def clear_pending_roots(self, store_id: bytes32) ->
|
|
848
|
+
async def clear_pending_roots(self, store_id: bytes32) -> Root | None:
|
|
849
849
|
async with self.db_wrapper.writer() as writer:
|
|
850
850
|
pending_root = await self.get_pending_root(store_id=store_id)
|
|
851
851
|
|
|
@@ -931,14 +931,14 @@ class DataStore:
|
|
|
931
931
|
row = await cursor.fetchone()
|
|
932
932
|
|
|
933
933
|
if row is not None:
|
|
934
|
-
generation:
|
|
934
|
+
generation: int | None = row["MAX(generation)"]
|
|
935
935
|
|
|
936
936
|
if generation is not None:
|
|
937
937
|
return generation
|
|
938
938
|
|
|
939
939
|
raise Exception(f"No generations found for store ID: {store_id.hex()}")
|
|
940
940
|
|
|
941
|
-
async def get_tree_root(self, store_id: bytes32, generation:
|
|
941
|
+
async def get_tree_root(self, store_id: bytes32, generation: int | None = None) -> Root:
|
|
942
942
|
async with self.db_wrapper.reader() as reader:
|
|
943
943
|
if generation is None:
|
|
944
944
|
generation = await self.get_tree_generation(store_id=store_id)
|
|
@@ -999,8 +999,8 @@ class DataStore:
|
|
|
999
999
|
self,
|
|
1000
1000
|
node_hash: bytes32,
|
|
1001
1001
|
store_id: bytes32,
|
|
1002
|
-
root_hash:
|
|
1003
|
-
generation:
|
|
1002
|
+
root_hash: bytes32 | None = None,
|
|
1003
|
+
generation: int | None = None,
|
|
1004
1004
|
) -> list[InternalNode]:
|
|
1005
1005
|
async with self.db_wrapper.reader():
|
|
1006
1006
|
if root_hash is None:
|
|
@@ -1030,7 +1030,7 @@ class DataStore:
|
|
|
1030
1030
|
self,
|
|
1031
1031
|
kid: KeyId,
|
|
1032
1032
|
vid: ValueId,
|
|
1033
|
-
table_blobs: dict[KeyOrValueId, tuple[bytes32,
|
|
1033
|
+
table_blobs: dict[KeyOrValueId, tuple[bytes32, bytes | None]],
|
|
1034
1034
|
store_id: bytes32,
|
|
1035
1035
|
) -> TerminalNode:
|
|
1036
1036
|
key = table_blobs[KeyOrValueId(kid.raw)][1]
|
|
@@ -1048,10 +1048,10 @@ class DataStore:
|
|
|
1048
1048
|
async def get_keys_values(
|
|
1049
1049
|
self,
|
|
1050
1050
|
store_id: bytes32,
|
|
1051
|
-
root_hash:
|
|
1051
|
+
root_hash: bytes32 | Unspecified = unspecified,
|
|
1052
1052
|
) -> list[TerminalNode]:
|
|
1053
1053
|
async with self.db_wrapper.reader():
|
|
1054
|
-
resolved_root_hash:
|
|
1054
|
+
resolved_root_hash: bytes32 | None
|
|
1055
1055
|
if root_hash is unspecified:
|
|
1056
1056
|
root = await self.get_tree_root(store_id=store_id)
|
|
1057
1057
|
resolved_root_hash = root.node_hash
|
|
@@ -1076,10 +1076,10 @@ class DataStore:
|
|
|
1076
1076
|
async def get_keys_values_compressed(
|
|
1077
1077
|
self,
|
|
1078
1078
|
store_id: bytes32,
|
|
1079
|
-
root_hash:
|
|
1079
|
+
root_hash: bytes32 | Unspecified = unspecified,
|
|
1080
1080
|
) -> KeysValuesCompressed:
|
|
1081
1081
|
async with self.db_wrapper.reader():
|
|
1082
|
-
resolved_root_hash:
|
|
1082
|
+
resolved_root_hash: bytes32 | None
|
|
1083
1083
|
if root_hash is unspecified:
|
|
1084
1084
|
root = await self.get_tree_root(store_id=store_id)
|
|
1085
1085
|
resolved_root_hash = root.node_hash
|
|
@@ -1112,7 +1112,7 @@ class DataStore:
|
|
|
1112
1112
|
store_id: bytes32,
|
|
1113
1113
|
page: int,
|
|
1114
1114
|
max_page_size: int,
|
|
1115
|
-
root_hash:
|
|
1115
|
+
root_hash: bytes32 | Unspecified = unspecified,
|
|
1116
1116
|
) -> KeysPaginationData:
|
|
1117
1117
|
keys_values_compressed = await self.get_keys_values_compressed(store_id, root_hash)
|
|
1118
1118
|
pagination_data = get_hashes_for_page(page, keys_values_compressed.key_hash_to_length, max_page_size)
|
|
@@ -1137,7 +1137,7 @@ class DataStore:
|
|
|
1137
1137
|
store_id: bytes32,
|
|
1138
1138
|
page: int,
|
|
1139
1139
|
max_page_size: int,
|
|
1140
|
-
root_hash:
|
|
1140
|
+
root_hash: bytes32 | Unspecified = unspecified,
|
|
1141
1141
|
) -> KeysValuesPaginationData:
|
|
1142
1142
|
keys_values_compressed = await self.get_keys_values_compressed(store_id, root_hash)
|
|
1143
1143
|
pagination_data = get_hashes_for_page(page, keys_values_compressed.leaf_hash_to_length, max_page_size)
|
|
@@ -1211,7 +1211,7 @@ class DataStore:
|
|
|
1211
1211
|
value: bytes,
|
|
1212
1212
|
store_id: bytes32,
|
|
1213
1213
|
status: Status = Status.PENDING,
|
|
1214
|
-
root:
|
|
1214
|
+
root: Root | None = None,
|
|
1215
1215
|
) -> InsertResult:
|
|
1216
1216
|
return await self.insert(
|
|
1217
1217
|
key=key,
|
|
@@ -1226,7 +1226,7 @@ class DataStore:
|
|
|
1226
1226
|
async def get_keys(
|
|
1227
1227
|
self,
|
|
1228
1228
|
store_id: bytes32,
|
|
1229
|
-
root_hash:
|
|
1229
|
+
root_hash: bytes32 | Unspecified = unspecified,
|
|
1230
1230
|
) -> list[bytes]:
|
|
1231
1231
|
async with self.db_wrapper.reader():
|
|
1232
1232
|
if root_hash is unspecified:
|
|
@@ -1265,7 +1265,7 @@ class DataStore:
|
|
|
1265
1265
|
assert isinstance(raw_node, chia_rs.datalayer.LeafNode)
|
|
1266
1266
|
return await self.get_terminal_node(raw_node.key, raw_node.value, store_id)
|
|
1267
1267
|
|
|
1268
|
-
async def get_terminal_node_for_seed(self, seed: bytes32, store_id: bytes32) ->
|
|
1268
|
+
async def get_terminal_node_for_seed(self, seed: bytes32, store_id: bytes32) -> TerminalNode | None:
|
|
1269
1269
|
root = await self.get_tree_root(store_id=store_id)
|
|
1270
1270
|
if root is None or root.node_hash is None:
|
|
1271
1271
|
return None
|
|
@@ -1280,10 +1280,10 @@ class DataStore:
|
|
|
1280
1280
|
key: bytes,
|
|
1281
1281
|
value: bytes,
|
|
1282
1282
|
store_id: bytes32,
|
|
1283
|
-
reference_node_hash:
|
|
1284
|
-
side:
|
|
1283
|
+
reference_node_hash: bytes32 | None = None,
|
|
1284
|
+
side: Side | None = None,
|
|
1285
1285
|
status: Status = Status.PENDING,
|
|
1286
|
-
root:
|
|
1286
|
+
root: Root | None = None,
|
|
1287
1287
|
) -> InsertResult:
|
|
1288
1288
|
async with self.db_wrapper.writer() as writer:
|
|
1289
1289
|
with self.manage_kv_files(store_id):
|
|
@@ -1315,8 +1315,8 @@ class DataStore:
|
|
|
1315
1315
|
key: bytes,
|
|
1316
1316
|
store_id: bytes32,
|
|
1317
1317
|
status: Status = Status.PENDING,
|
|
1318
|
-
root:
|
|
1319
|
-
) ->
|
|
1318
|
+
root: Root | None = None,
|
|
1319
|
+
) -> Root | None:
|
|
1320
1320
|
async with self.db_wrapper.writer():
|
|
1321
1321
|
if root is None:
|
|
1322
1322
|
root = await self.get_tree_root(store_id=store_id)
|
|
@@ -1336,7 +1336,7 @@ class DataStore:
|
|
|
1336
1336
|
new_value: bytes,
|
|
1337
1337
|
store_id: bytes32,
|
|
1338
1338
|
status: Status = Status.PENDING,
|
|
1339
|
-
root:
|
|
1339
|
+
root: Root | None = None,
|
|
1340
1340
|
) -> InsertResult:
|
|
1341
1341
|
async with self.db_wrapper.writer() as writer:
|
|
1342
1342
|
with self.manage_kv_files(store_id):
|
|
@@ -1357,7 +1357,7 @@ class DataStore:
|
|
|
1357
1357
|
changelist: list[dict[str, Any]],
|
|
1358
1358
|
status: Status = Status.PENDING,
|
|
1359
1359
|
enable_batch_autoinsert: bool = True,
|
|
1360
|
-
) ->
|
|
1360
|
+
) -> bytes32 | None:
|
|
1361
1361
|
async with self.db_wrapper.writer() as writer:
|
|
1362
1362
|
with self.manage_kv_files(store_id):
|
|
1363
1363
|
old_root = await self.get_tree_root(store_id=store_id)
|
|
@@ -1396,7 +1396,7 @@ class DataStore:
|
|
|
1396
1396
|
|
|
1397
1397
|
reference_node_hash = change.get("reference_node_hash", None)
|
|
1398
1398
|
side = change.get("side", None)
|
|
1399
|
-
reference_kid:
|
|
1399
|
+
reference_kid: KeyId | None = None
|
|
1400
1400
|
if reference_node_hash is not None:
|
|
1401
1401
|
reference_kid, _ = merkle_blob.get_node_by_hash(reference_node_hash)
|
|
1402
1402
|
|
|
@@ -1447,10 +1447,10 @@ class DataStore:
|
|
|
1447
1447
|
self,
|
|
1448
1448
|
key: bytes,
|
|
1449
1449
|
store_id: bytes32,
|
|
1450
|
-
root_hash:
|
|
1450
|
+
root_hash: bytes32 | Unspecified = unspecified,
|
|
1451
1451
|
) -> TerminalNode:
|
|
1452
1452
|
async with self.db_wrapper.reader():
|
|
1453
|
-
resolved_root_hash:
|
|
1453
|
+
resolved_root_hash: bytes32 | None
|
|
1454
1454
|
if root_hash is unspecified:
|
|
1455
1455
|
root = await self.get_tree_root(store_id=store_id)
|
|
1456
1456
|
resolved_root_hash = root.node_hash
|
|
@@ -1499,7 +1499,7 @@ class DataStore:
|
|
|
1499
1499
|
self,
|
|
1500
1500
|
node_hash: bytes32,
|
|
1501
1501
|
store_id: bytes32,
|
|
1502
|
-
root_hash:
|
|
1502
|
+
root_hash: bytes32 | None = None,
|
|
1503
1503
|
) -> ProofOfInclusion:
|
|
1504
1504
|
if root_hash is None:
|
|
1505
1505
|
root = await self.get_tree_root(store_id=store_id)
|
|
@@ -1556,8 +1556,8 @@ class DataStore:
|
|
|
1556
1556
|
|
|
1557
1557
|
async def get_table_blobs(
|
|
1558
1558
|
self, kv_ids_iter: Iterable[KeyOrValueId], store_id: bytes32
|
|
1559
|
-
) -> dict[KeyOrValueId, tuple[bytes32,
|
|
1560
|
-
result: dict[KeyOrValueId, tuple[bytes32,
|
|
1559
|
+
) -> dict[KeyOrValueId, tuple[bytes32, bytes | None]]:
|
|
1560
|
+
result: dict[KeyOrValueId, tuple[bytes32, bytes | None]] = {}
|
|
1561
1561
|
batch_size = min(500, SQLITE_MAX_VARIABLE_NUMBER - 10)
|
|
1562
1562
|
kv_ids = list(dict.fromkeys(kv_ids_iter))
|
|
1563
1563
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import dataclasses
|
|
4
|
-
from typing import Optional, Union
|
|
5
4
|
|
|
6
5
|
from aiosqlite import Row
|
|
7
6
|
from chia_rs.sized_bytes import bytes32
|
|
@@ -29,7 +28,7 @@ def _row_to_singleton_record(row: Row) -> SingletonRecord:
|
|
|
29
28
|
)
|
|
30
29
|
|
|
31
30
|
|
|
32
|
-
def _row_to_mirror(row: Row, confirmed_at_height:
|
|
31
|
+
def _row_to_mirror(row: Row, confirmed_at_height: uint32 | None) -> Mirror:
|
|
33
32
|
urls: list[bytes] = []
|
|
34
33
|
byte_list: bytes = row[3]
|
|
35
34
|
while byte_list != b"":
|
|
@@ -133,14 +132,14 @@ class DataLayerStore:
|
|
|
133
132
|
async def get_all_singletons_for_launcher(
|
|
134
133
|
self,
|
|
135
134
|
launcher_id: bytes32,
|
|
136
|
-
min_generation:
|
|
137
|
-
max_generation:
|
|
138
|
-
num_results:
|
|
135
|
+
min_generation: uint32 | None = None,
|
|
136
|
+
max_generation: uint32 | None = None,
|
|
137
|
+
num_results: uint32 | None = None,
|
|
139
138
|
) -> list[SingletonRecord]:
|
|
140
139
|
"""
|
|
141
140
|
Returns stored singletons with a specific launcher ID.
|
|
142
141
|
"""
|
|
143
|
-
query_params: list[
|
|
142
|
+
query_params: list[bytes32 | uint32] = [launcher_id]
|
|
144
143
|
for optional_param in (min_generation, max_generation, num_results):
|
|
145
144
|
if optional_param is not None:
|
|
146
145
|
query_params.append(optional_param)
|
|
@@ -163,7 +162,7 @@ class DataLayerStore:
|
|
|
163
162
|
|
|
164
163
|
return records
|
|
165
164
|
|
|
166
|
-
async def get_singleton_record(self, coin_id: bytes32) ->
|
|
165
|
+
async def get_singleton_record(self, coin_id: bytes32) -> SingletonRecord | None:
|
|
167
166
|
"""
|
|
168
167
|
Checks DB for SingletonRecord with coin_id: coin_id and returns it.
|
|
169
168
|
"""
|
|
@@ -178,9 +177,7 @@ class DataLayerStore:
|
|
|
178
177
|
return _row_to_singleton_record(row)
|
|
179
178
|
return None
|
|
180
179
|
|
|
181
|
-
async def get_latest_singleton(
|
|
182
|
-
self, launcher_id: bytes32, only_confirmed: bool = False
|
|
183
|
-
) -> Optional[SingletonRecord]:
|
|
180
|
+
async def get_latest_singleton(self, launcher_id: bytes32, only_confirmed: bool = False) -> SingletonRecord | None:
|
|
184
181
|
"""
|
|
185
182
|
Checks DB for SingletonRecords with launcher_id: launcher_id and returns the most recent.
|
|
186
183
|
"""
|
|
@@ -238,7 +235,7 @@ class DataLayerStore:
|
|
|
238
235
|
"""
|
|
239
236
|
Updates singleton record to be confirmed.
|
|
240
237
|
"""
|
|
241
|
-
current:
|
|
238
|
+
current: SingletonRecord | None = await self.get_singleton_record(coin_id)
|
|
242
239
|
if current is None or current.confirmed_at_height == height:
|
|
243
240
|
return
|
|
244
241
|
|
|
@@ -268,7 +265,7 @@ class DataLayerStore:
|
|
|
268
265
|
(launcher_id, launcher_bytes),
|
|
269
266
|
)
|
|
270
267
|
|
|
271
|
-
async def get_launcher(self, launcher_id: bytes32) ->
|
|
268
|
+
async def get_launcher(self, launcher_id: bytes32) -> Coin | None:
|
|
272
269
|
"""
|
|
273
270
|
Checks DB for a launcher with the specified ID and returns it.
|
|
274
271
|
"""
|
chia/data_layer/download_data.py
CHANGED
|
@@ -5,12 +5,11 @@ import logging
|
|
|
5
5
|
import time
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import
|
|
8
|
+
from typing import Literal
|
|
9
9
|
|
|
10
10
|
import aiohttp
|
|
11
11
|
from chia_rs.datalayer import DeltaReader
|
|
12
12
|
from chia_rs.sized_bytes import bytes32
|
|
13
|
-
from typing_extensions import Literal
|
|
14
13
|
|
|
15
14
|
from chia.data_layer.data_layer_util import (
|
|
16
15
|
PluginRemote,
|
|
@@ -62,7 +61,7 @@ def is_filename_valid(filename: str, group_by_store: bool = False) -> bool:
|
|
|
62
61
|
@dataclass
|
|
63
62
|
class WriteFilesResult:
|
|
64
63
|
result: bool
|
|
65
|
-
full_tree:
|
|
64
|
+
full_tree: Path | None
|
|
66
65
|
diff_tree: Path
|
|
67
66
|
|
|
68
67
|
|
|
@@ -114,8 +113,8 @@ async def download_file(
|
|
|
114
113
|
root_hash: bytes32,
|
|
115
114
|
generation: int,
|
|
116
115
|
server_info: ServerInfo,
|
|
117
|
-
proxy_url:
|
|
118
|
-
downloader:
|
|
116
|
+
proxy_url: str | None,
|
|
117
|
+
downloader: PluginRemote | None,
|
|
119
118
|
timeout: aiohttp.ClientTimeout,
|
|
120
119
|
client_foldername: Path,
|
|
121
120
|
timestamp: int,
|
|
@@ -169,15 +168,15 @@ async def insert_from_delta_file(
|
|
|
169
168
|
client_foldername: Path,
|
|
170
169
|
timeout: aiohttp.ClientTimeout,
|
|
171
170
|
log: logging.Logger,
|
|
172
|
-
proxy_url:
|
|
173
|
-
downloader:
|
|
171
|
+
proxy_url: str | None,
|
|
172
|
+
downloader: PluginRemote | None,
|
|
174
173
|
group_files_by_store: bool = False,
|
|
175
174
|
maximum_full_file_count: int = 1,
|
|
176
175
|
) -> bool:
|
|
177
176
|
if group_files_by_store:
|
|
178
177
|
client_foldername.joinpath(f"{store_id}").mkdir(parents=True, exist_ok=True)
|
|
179
178
|
|
|
180
|
-
delta_reader:
|
|
179
|
+
delta_reader: DeltaReader | None = None
|
|
181
180
|
|
|
182
181
|
for root_hash in root_hashes:
|
|
183
182
|
timestamp = int(time.time())
|
|
@@ -286,7 +285,7 @@ def delete_full_file_if_exists(foldername: Path, store_id: bytes32, root: Root)
|
|
|
286
285
|
async def http_download(
|
|
287
286
|
target_filename_path: Path,
|
|
288
287
|
filename: str,
|
|
289
|
-
proxy_url:
|
|
288
|
+
proxy_url: str | None,
|
|
290
289
|
server_info: ServerInfo,
|
|
291
290
|
timeout: aiohttp.ClientTimeout,
|
|
292
291
|
log: logging.Logger,
|
|
@@ -11,7 +11,7 @@ import sys
|
|
|
11
11
|
import tempfile
|
|
12
12
|
from dataclasses import dataclass
|
|
13
13
|
from pathlib import Path
|
|
14
|
-
from typing import Any,
|
|
14
|
+
from typing import Any, overload
|
|
15
15
|
from urllib.parse import urlparse
|
|
16
16
|
|
|
17
17
|
import boto3
|
|
@@ -30,7 +30,7 @@ plugin_version = "0.1.0"
|
|
|
30
30
|
@dataclass(frozen=True)
|
|
31
31
|
class StoreConfig:
|
|
32
32
|
id: bytes32
|
|
33
|
-
bucket:
|
|
33
|
+
bucket: str | None
|
|
34
34
|
urls: set[str]
|
|
35
35
|
|
|
36
36
|
@classmethod
|
|
@@ -142,9 +142,7 @@ class S3Plugin:
|
|
|
142
142
|
@overload
|
|
143
143
|
def get_path_for_filename(self, store_id: bytes32, filename: None, group_files_by_store: bool) -> None: ...
|
|
144
144
|
|
|
145
|
-
def get_path_for_filename(
|
|
146
|
-
self, store_id: bytes32, filename: Optional[str], group_files_by_store: bool
|
|
147
|
-
) -> Optional[Path]:
|
|
145
|
+
def get_path_for_filename(self, store_id: bytes32, filename: str | None, group_files_by_store: bool) -> Path | None:
|
|
148
146
|
if filename is None:
|
|
149
147
|
return None
|
|
150
148
|
|
|
@@ -158,9 +156,7 @@ class S3Plugin:
|
|
|
158
156
|
@overload
|
|
159
157
|
def get_s3_target_from_path(self, store_id: bytes32, path: None, group_files_by_store: bool) -> None: ...
|
|
160
158
|
|
|
161
|
-
def get_s3_target_from_path(
|
|
162
|
-
self, store_id: bytes32, path: Optional[Path], group_files_by_store: bool
|
|
163
|
-
) -> Optional[str]:
|
|
159
|
+
def get_s3_target_from_path(self, store_id: bytes32, path: Path | None, group_files_by_store: bool) -> str | None:
|
|
164
160
|
if path is None:
|
|
165
161
|
return None
|
|
166
162
|
|
|
@@ -174,7 +170,7 @@ class S3Plugin:
|
|
|
174
170
|
store_id = bytes32.from_hexstr(data["store_id"])
|
|
175
171
|
bucket_str = self.get_bucket(store_id)
|
|
176
172
|
my_bucket = self.boto_resource.Bucket(bucket_str)
|
|
177
|
-
full_tree_name:
|
|
173
|
+
full_tree_name: str | None = data.get("full_tree_filename", None)
|
|
178
174
|
diff_name: str = data["diff_filename"]
|
|
179
175
|
group_files_by_store: bool = data.get("group_files_by_store", False)
|
|
180
176
|
|
|
@@ -4,11 +4,11 @@ import logging
|
|
|
4
4
|
import os
|
|
5
5
|
import pathlib
|
|
6
6
|
import sys
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, cast
|
|
8
8
|
|
|
9
9
|
from chia_rs.sized_ints import uint16
|
|
10
10
|
|
|
11
|
-
from chia.apis import
|
|
11
|
+
from chia.apis import StubMetadataRegistry
|
|
12
12
|
from chia.data_layer.data_layer import DataLayer
|
|
13
13
|
from chia.data_layer.data_layer_api import DataLayerAPI
|
|
14
14
|
from chia.data_layer.data_layer_rpc_api import DataLayerRpcApi
|
|
@@ -40,7 +40,7 @@ def create_data_layer_service(
|
|
|
40
40
|
config: dict[str, Any],
|
|
41
41
|
downloaders: list[PluginRemote],
|
|
42
42
|
uploaders: list[PluginRemote], # dont add FilesystemUploader to this, it is the default uploader
|
|
43
|
-
wallet_service:
|
|
43
|
+
wallet_service: WalletService | None = None,
|
|
44
44
|
connect_to_daemon: bool = True,
|
|
45
45
|
) -> DataLayerService:
|
|
46
46
|
if uploaders is None:
|
|
@@ -72,7 +72,7 @@ def create_data_layer_service(
|
|
|
72
72
|
)
|
|
73
73
|
peer_api = DataLayerAPI(node)
|
|
74
74
|
|
|
75
|
-
rpc_info:
|
|
75
|
+
rpc_info: RpcInfo[DataLayerRpcApi] | None = None
|
|
76
76
|
if service_config.get("start_rpc_server", True):
|
|
77
77
|
rpc_info = (DataLayerRpcApi, cast(int, service_config["rpc_port"]))
|
|
78
78
|
|
|
@@ -89,7 +89,7 @@ def create_data_layer_service(
|
|
|
89
89
|
max_request_body_size=service_config.get("rpc_server_max_request_body_size", 26214400),
|
|
90
90
|
rpc_info=rpc_info,
|
|
91
91
|
connect_to_daemon=connect_to_daemon,
|
|
92
|
-
|
|
92
|
+
stub_metadata_for_type=StubMetadataRegistry,
|
|
93
93
|
)
|
|
94
94
|
|
|
95
95
|
|