LCOV - code coverage report
Current view: top level - src/wallet - scriptpubkeyman.h (source / functions) Coverage Total Hit
Test: total_coverage.info Lines: 51.9 % 52 27
Test Date: 2025-05-10 04:59:59 Functions: 35.7 % 42 15
Branches: 37.5 % 16 6

             Branch data     Line data    Source code
       1                 :             : // Copyright (c) 2019-2022 The Bitcoin Core developers
       2                 :             : // Distributed under the MIT software license, see the accompanying
       3                 :             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4                 :             : 
       5                 :             : #ifndef BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
       6                 :             : #define BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
       7                 :             : 
       8                 :             : #include <addresstype.h>
       9                 :             : #include <common/messages.h>
      10                 :             : #include <common/signmessage.h>
      11                 :             : #include <common/types.h>
      12                 :             : #include <logging.h>
      13                 :             : #include <node/types.h>
      14                 :             : #include <psbt.h>
      15                 :             : #include <script/descriptor.h>
      16                 :             : #include <script/script.h>
      17                 :             : #include <script/signingprovider.h>
      18                 :             : #include <util/result.h>
      19                 :             : #include <util/time.h>
      20                 :             : #include <wallet/crypter.h>
      21                 :             : #include <wallet/types.h>
      22                 :             : #include <wallet/walletdb.h>
      23                 :             : #include <wallet/walletutil.h>
      24                 :             : 
      25                 :             : #include <boost/signals2/signal.hpp>
      26                 :             : 
      27                 :             : #include <functional>
      28                 :             : #include <optional>
      29                 :             : #include <unordered_map>
      30                 :             : 
      31                 :             : enum class OutputType;
      32                 :             : 
      33                 :             : namespace wallet {
      34                 :             : struct MigrationData;
      35                 :             : class ScriptPubKeyMan;
      36                 :             : 
      37                 :             : // Wallet storage things that ScriptPubKeyMans need in order to be able to store things to the wallet database.
      38                 :             : // It provides access to things that are part of the entire wallet and not specific to a ScriptPubKeyMan such as
      39                 :             : // wallet flags, wallet version, encryption keys, encryption status, and the database itself. This allows a
      40                 :             : // ScriptPubKeyMan to have callbacks into CWallet without causing a circular dependency.
      41                 :             : // WalletStorage should be the same for all ScriptPubKeyMans of a wallet.
      42         [ +  - ]:         918 : class WalletStorage
      43                 :             : {
      44                 :             : public:
      45                 :         918 :     virtual ~WalletStorage() = default;
      46                 :             :     virtual std::string GetDisplayName() const = 0;
      47                 :             :     virtual WalletDatabase& GetDatabase() const = 0;
      48                 :             :     virtual bool IsWalletFlagSet(uint64_t) const = 0;
      49                 :             :     virtual void UnsetBlankWalletFlag(WalletBatch&) = 0;
      50                 :             :     virtual bool CanSupportFeature(enum WalletFeature) const = 0;
      51                 :             :     virtual void SetMinVersion(enum WalletFeature, WalletBatch* = nullptr) = 0;
      52                 :             :     //! Pass the encryption key to cb().
      53                 :             :     virtual bool WithEncryptionKey(std::function<bool (const CKeyingMaterial&)> cb) const = 0;
      54                 :             :     virtual bool HasEncryptionKeys() const = 0;
      55                 :             :     virtual bool IsLocked() const = 0;
      56                 :             :     //! Callback function for after TopUp completes containing any scripts that were added by a SPKMan
      57                 :             :     virtual void TopUpCallback(const std::set<CScript>&, ScriptPubKeyMan*) = 0;
      58                 :             : };
      59                 :             : 
      60                 :             : //! Constant representing an unknown spkm creation time
      61                 :             : static constexpr int64_t UNKNOWN_TIME = std::numeric_limits<int64_t>::max();
      62                 :             : 
      63                 :             : //! Default for -keypool
      64                 :             : static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
      65                 :             : 
      66                 :             : std::vector<CKeyID> GetAffectedKeys(const CScript& spk, const SigningProvider& provider);
      67                 :             : 
      68                 :       91532 : struct WalletDestination
      69                 :             : {
      70                 :             :     CTxDestination dest;
      71                 :             :     std::optional<bool> internal;
      72                 :             : };
      73                 :             : 
      74                 :             : /*
      75                 :             :  * A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
      76                 :             :  * It contains the scripts and keys related to the scriptPubKeys it manages.
      77                 :             :  * A ScriptPubKeyMan will be able to give out scriptPubKeys to be used, as well as marking
      78                 :             :  * when a scriptPubKey has been used. It also handles when and how to store a scriptPubKey
      79                 :             :  * and its related scripts and keys, including encryption.
      80                 :             :  */
      81                 :             : class ScriptPubKeyMan
      82                 :             : {
      83                 :             : protected:
      84                 :             :     WalletStorage& m_storage;
      85                 :             : 
      86                 :             : public:
      87         [ +  - ]:        6137 :     explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
      88                 :        6137 :     virtual ~ScriptPubKeyMan() = default;
      89         [ #  # ]:           0 :     virtual util::Result<CTxDestination> GetNewDestination(const OutputType type) { return util::Error{Untranslated("Not supported")}; }
      90                 :           0 :     virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
      91                 :             : 
      92                 :             :     //! Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the keys handled by it.
      93                 :           0 :     virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key) { return false; }
      94                 :           0 :     virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
      95                 :             : 
      96         [ #  # ]:           0 :     virtual util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index) { return util::Error{Untranslated("Not supported")}; }
      97                 :        1827 :     virtual void KeepDestination(int64_t index, const OutputType& type) {}
      98                 :           0 :     virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
      99                 :             : 
     100                 :             :     /** Fills internal address pool. Use within ScriptPubKeyMan implementations should be used sparingly and only
     101                 :             :       * when something from the address pool is removed, excluding GetNewDestination and GetReservedDestination.
     102                 :             :       * External wallet code is primarily responsible for topping up prior to fetching new addresses
     103                 :             :       */
     104                 :          32 :     virtual bool TopUp(unsigned int size = 0) { return false; }
     105                 :             : 
     106                 :             :     /** Mark unused addresses as being used
     107                 :             :      * Affects all keys up to and including the one determined by provided script.
     108                 :             :      *
     109                 :             :      * @param script determines the last key to mark as used
     110                 :             :      *
     111                 :             :      * @return All of the addresses affected
     112                 :             :      */
     113                 :           0 :     virtual std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) { return {}; }
     114                 :             : 
     115                 :             :     /** Sets up the key generation stuff, i.e. generates new HD seeds and sets them as active.
     116                 :             :       * Returns false if already setup or setup fails, true if setup is successful
     117                 :             :       * Set force=true to make it re-setup if already setup, used for upgrades
     118                 :             :       */
     119                 :           0 :     virtual bool SetupGeneration(bool force = false) { return false; }
     120                 :             : 
     121                 :             :     /* Returns true if HD is enabled */
     122                 :           0 :     virtual bool IsHDEnabled() const { return false; }
     123                 :             : 
     124                 :             :     /* Returns true if the wallet can give out new addresses. This means it has keys in the keypool or can generate new keys */
     125                 :           0 :     virtual bool CanGetAddresses(bool internal = false) const { return false; }
     126                 :             : 
     127                 :             :     /** Upgrades the wallet to the specified version */
     128                 :           0 :     virtual bool Upgrade(int prev_version, int new_version, bilingual_str& error) { return true; }
     129                 :             : 
     130                 :           2 :     virtual bool HavePrivateKeys() const { return false; }
     131                 :           0 :     virtual bool HaveCryptedKeys() const { return false; }
     132                 :             : 
     133                 :             :     //! The action to do when the DB needs rewrite
     134                 :           0 :     virtual void RewriteDB() {}
     135                 :             : 
     136                 :           0 :     virtual std::optional<int64_t> GetOldestKeyPoolTime() const { return GetTime(); }
     137                 :             : 
     138                 :          32 :     virtual unsigned int GetKeyPoolSize() const { return 0; }
     139                 :             : 
     140                 :          64 :     virtual int64_t GetTimeFirstKey() const { return 0; }
     141                 :             : 
     142                 :           0 :     virtual std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const { return nullptr; }
     143                 :             : 
     144                 :           0 :     virtual std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const { return nullptr; }
     145                 :             : 
     146                 :             :     /** Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that, combined with
     147                 :             :       * sigdata, can produce solving data.
     148                 :             :       */
     149                 :           0 :     virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
     150                 :             : 
     151                 :             :     /** Creates new signatures and adds them to the transaction. Returns whether all inputs were signed */
     152                 :           0 :     virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const { return false; }
     153                 :             :     /** Sign a message with the given script */
     154                 :           0 :     virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
     155                 :             :     /** Adds script and derivation path information to a PSBT, and optionally signs it. */
     156                 :           0 :     virtual std::optional<common::PSBTError> FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = SIGHASH_DEFAULT, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr, bool finalize = true) const { return common::PSBTError::UNSUPPORTED; }
     157                 :             : 
     158                 :           0 :     virtual uint256 GetID() const { return uint256(); }
     159                 :             : 
     160                 :             :     /** Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches */
     161                 :           0 :     virtual std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const { return {}; };
     162                 :             : 
     163                 :             :     /** Prepends the wallet name in logging output to ease debugging in multi-wallet use cases */
     164                 :             :     template <typename... Params>
     165                 :         499 :     void WalletLogPrintf(util::ConstevalFormatString<sizeof...(Params)> wallet_fmt, const Params&... params) const
     166                 :             :     {
     167   [ +  -  +  - ]:         998 :         LogInfo("%s %s", m_storage.GetDisplayName(), tfm::format(wallet_fmt, params...));
     168                 :         499 :     };
     169                 :             : 
     170                 :             :     /** Keypool has new keys */
     171                 :             :     boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
     172                 :             : 
     173                 :             :     /** Birth time changed */
     174                 :             :     boost::signals2::signal<void (const ScriptPubKeyMan* spkm, int64_t new_birth_time)> NotifyFirstKeyTimeChanged;
     175                 :             : };
     176                 :             : 
     177                 :             : /** OutputTypes supported by the LegacyScriptPubKeyMan */
     178                 :             : static const std::unordered_set<OutputType> LEGACY_OUTPUT_TYPES {
     179                 :             :     OutputType::LEGACY,
     180                 :             :     OutputType::P2SH_SEGWIT,
     181                 :             :     OutputType::BECH32,
     182                 :             : };
     183                 :             : 
     184                 :             : // Manages the data for a LegacyScriptPubKeyMan.
     185                 :             : // This is the minimum necessary to load a legacy wallet so that it can be migrated.
     186                 :             : class LegacyDataSPKM : public ScriptPubKeyMan, public FillableSigningProvider
     187                 :             : {
     188                 :             : private:
     189                 :             :     using WatchOnlySet = std::set<CScript>;
     190                 :             :     using WatchKeyMap = std::map<CKeyID, CPubKey>;
     191                 :             :     using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
     192                 :             : 
     193                 :             :     CryptedKeyMap mapCryptedKeys GUARDED_BY(cs_KeyStore);
     194                 :             :     WatchOnlySet setWatchOnly GUARDED_BY(cs_KeyStore);
     195                 :             :     WatchKeyMap mapWatchKeys GUARDED_BY(cs_KeyStore);
     196                 :             : 
     197                 :             :     /* the HD chain data model (external chain counters) */
     198                 :             :     CHDChain m_hd_chain;
     199                 :             :     std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
     200                 :             : 
     201                 :             :     //! keeps track of whether Unlock has run a thorough check before
     202                 :             :     bool fDecryptionThoroughlyChecked = true;
     203                 :             : 
     204                 :             :     bool AddWatchOnlyInMem(const CScript &dest);
     205                 :             :     virtual bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
     206                 :             :     bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
     207                 :             : 
     208                 :             :     // Helper function to retrieve a conservative superset of all output scripts that may be relevant to this LegacyDataSPKM.
     209                 :             :     // It may include scripts that are invalid or not actually watched by this LegacyDataSPKM.
     210                 :             :     // Used only in migration.
     211                 :             :     std::unordered_set<CScript, SaltedSipHasher> GetCandidateScriptPubKeys() const;
     212                 :             : 
     213                 :             :     isminetype IsMine(const CScript& script) const override;
     214                 :             :     bool CanProvide(const CScript& script, SignatureData& sigdata) override;
     215                 :             : public:
     216                 :             :     using ScriptPubKeyMan::ScriptPubKeyMan;
     217                 :             : 
     218                 :             :     // Map from Key ID to key metadata.
     219                 :             :     std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
     220                 :             : 
     221                 :             :     // Map from Script ID to key metadata (for watch-only keys).
     222                 :             :     std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
     223                 :             : 
     224                 :             :     // ScriptPubKeyMan overrides
     225                 :             :     bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
     226                 :             :     std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
     227                 :             :     std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
     228                 :          60 :     uint256 GetID() const override { return uint256::ONE; }
     229                 :             : 
     230                 :             :     // FillableSigningProvider overrides
     231                 :             :     bool HaveKey(const CKeyID &address) const override;
     232                 :             :     bool GetKey(const CKeyID &address, CKey& keyOut) const override;
     233                 :             :     bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
     234                 :             :     bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
     235                 :             : 
     236                 :             :     //! Load metadata (used by LoadWallet)
     237                 :             :     virtual void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
     238                 :             :     virtual void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
     239                 :             : 
     240                 :             :     //! Adds a watch-only address to the store, without saving it to disk (used by LoadWallet)
     241                 :             :     bool LoadWatchOnly(const CScript &dest);
     242                 :             :     //! Returns whether the watch-only script is in the wallet
     243                 :             :     bool HaveWatchOnly(const CScript &dest) const;
     244                 :             :     //! Returns whether there are any watch-only things in the wallet
     245                 :             :     bool HaveWatchOnly() const;
     246                 :             :     //! Adds a key to the store, without saving it to disk (used by LoadWallet)
     247                 :             :     bool LoadKey(const CKey& key, const CPubKey &pubkey);
     248                 :             :     //! Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
     249                 :             :     bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
     250                 :             :     //! Adds a CScript to the store
     251                 :             :     bool LoadCScript(const CScript& redeemScript);
     252                 :             :     //! Load a HD chain model (used by LoadWallet)
     253                 :             :     void LoadHDChain(const CHDChain& chain);
     254                 :             :     void AddInactiveHDChain(const CHDChain& chain);
     255                 :             :     const CHDChain& GetHDChain() const { return m_hd_chain; }
     256                 :             : 
     257                 :             :     //! Fetches a pubkey from mapWatchKeys if it exists there
     258                 :             :     bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
     259                 :             : 
     260                 :             :     /**
     261                 :             :      * Retrieves scripts that were imported by bugs into the legacy spkm and are
     262                 :             :      * simply invalid, such as a sh(sh(pkh())) script, or not watched.
     263                 :             :      */
     264                 :             :     std::unordered_set<CScript, SaltedSipHasher> GetNotMineScriptPubKeys() const;
     265                 :             : 
     266                 :             :     /** Get the DescriptorScriptPubKeyMans (with private keys) that have the same scriptPubKeys as this LegacyScriptPubKeyMan.
     267                 :             :      * Does not modify this ScriptPubKeyMan. */
     268                 :             :     std::optional<MigrationData> MigrateToDescriptor();
     269                 :             :     /** Delete all the records of this LegacyScriptPubKeyMan from disk*/
     270                 :             :     bool DeleteRecordsWithDB(WalletBatch& batch);
     271                 :             : };
     272                 :             : 
     273                 :             : /** Wraps a LegacyScriptPubKeyMan so that it can be returned in a new unique_ptr. Does not provide privkeys */
     274                 :             : class LegacySigningProvider : public SigningProvider
     275                 :             : {
     276                 :             : private:
     277                 :             :     const LegacyDataSPKM& m_spk_man;
     278                 :             : public:
     279                 :          81 :     explicit LegacySigningProvider(const LegacyDataSPKM& spk_man) : m_spk_man(spk_man) {}
     280                 :             : 
     281                 :          65 :     bool GetCScript(const CScriptID &scriptid, CScript& script) const override { return m_spk_man.GetCScript(scriptid, script); }
     282                 :           0 :     bool HaveCScript(const CScriptID &scriptid) const override { return m_spk_man.HaveCScript(scriptid); }
     283                 :          36 :     bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const override { return m_spk_man.GetPubKey(address, pubkey); }
     284                 :           0 :     bool GetKey(const CKeyID &address, CKey& key) const override { return false; }
     285                 :           0 :     bool HaveKey(const CKeyID &address) const override { return false; }
     286                 :          86 :     bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override { return m_spk_man.GetKeyOrigin(keyid, info); }
     287                 :             : };
     288                 :             : 
     289                 :             : class DescriptorScriptPubKeyMan : public ScriptPubKeyMan
     290                 :             : {
     291                 :             :     friend class LegacyDataSPKM;
     292                 :             : private:
     293                 :             :     using ScriptPubKeyMap = std::map<CScript, int32_t>; // Map of scripts to descriptor range index
     294                 :             :     using PubKeyMap = std::map<CPubKey, int32_t>; // Map of pubkeys involved in scripts to descriptor range index
     295                 :             :     using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
     296                 :             :     using KeyMap = std::map<CKeyID, CKey>;
     297                 :             : 
     298                 :             :     ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
     299                 :             :     PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man);
     300                 :             :     int32_t m_max_cached_index = -1;
     301                 :             : 
     302                 :             :     KeyMap m_map_keys GUARDED_BY(cs_desc_man);
     303                 :             :     CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man);
     304                 :             : 
     305                 :             :     //! keeps track of whether Unlock has run a thorough check before
     306                 :             :     bool m_decryption_thoroughly_checked = false;
     307                 :             : 
     308                 :             :     //! Number of pre-generated keys/scripts (part of the look-ahead process, used to detect payments)
     309                 :             :     int64_t m_keypool_size GUARDED_BY(cs_desc_man){DEFAULT_KEYPOOL_SIZE};
     310                 :             : 
     311                 :             :     bool AddDescriptorKeyWithDB(WalletBatch& batch, const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
     312                 :             : 
     313                 :             :     KeyMap GetKeys() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
     314                 :             : 
     315                 :             :     // Cached FlatSigningProviders to avoid regenerating them each time they are needed.
     316                 :             :     mutable std::map<int32_t, FlatSigningProvider> m_map_signing_providers;
     317                 :             :     // Fetch the SigningProvider for the given script and optionally include private keys
     318                 :             :     std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CScript& script, bool include_private = false) const;
     319                 :             :     // Fetch the SigningProvider for a given index and optionally include private keys. Called by the above functions.
     320                 :             :     std::unique_ptr<FlatSigningProvider> GetSigningProvider(int32_t index, bool include_private = false) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
     321                 :             : 
     322                 :             : protected:
     323                 :             :     WalletDescriptor m_wallet_descriptor GUARDED_BY(cs_desc_man);
     324                 :             : 
     325                 :             :     //! Same as 'TopUp' but designed for use within a batch transaction context
     326                 :             :     bool TopUpWithDB(WalletBatch& batch, unsigned int size = 0);
     327                 :             : 
     328                 :             : public:
     329                 :        3143 :     DescriptorScriptPubKeyMan(WalletStorage& storage, WalletDescriptor& descriptor, int64_t keypool_size)
     330                 :        3143 :         :   ScriptPubKeyMan(storage),
     331         [ +  - ]:        3143 :             m_keypool_size(keypool_size),
     332         [ +  - ]:        3143 :             m_wallet_descriptor(descriptor)
     333                 :        3143 :         {}
     334                 :        2962 :     DescriptorScriptPubKeyMan(WalletStorage& storage, int64_t keypool_size)
     335                 :        2962 :         :   ScriptPubKeyMan(storage),
     336                 :        2962 :             m_keypool_size(keypool_size)
     337                 :        2962 :         {}
     338                 :             : 
     339                 :             :     mutable RecursiveMutex cs_desc_man;
     340                 :             : 
     341                 :             :     util::Result<CTxDestination> GetNewDestination(const OutputType type) override;
     342                 :             :     isminetype IsMine(const CScript& script) const override;
     343                 :             : 
     344                 :             :     bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
     345                 :             :     bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
     346                 :             : 
     347                 :             :     util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index) override;
     348                 :             :     void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
     349                 :             : 
     350                 :             :     // Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
     351                 :             :     // and is used to expand the descriptor in GetNewDestination. DescriptorScriptPubKeyMan relies
     352                 :             :     // more on ephemeral data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
     353                 :             :     // (with or without private keys), the "keypool" is a single xpub.
     354                 :             :     bool TopUp(unsigned int size = 0) override;
     355                 :             : 
     356                 :             :     std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
     357                 :             : 
     358                 :             :     bool IsHDEnabled() const override;
     359                 :             : 
     360                 :             :     //! Setup descriptors based on the given CExtkey
     361                 :             :     bool SetupDescriptorGeneration(WalletBatch& batch, const CExtKey& master_key, OutputType addr_type, bool internal);
     362                 :             : 
     363                 :             :     bool HavePrivateKeys() const override;
     364                 :             :     bool HasPrivKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
     365                 :             :     //! Retrieve the particular key if it is available. Returns nullopt if the key is not in the wallet, or if the wallet is locked.
     366                 :             :     std::optional<CKey> GetKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
     367                 :             :     bool HaveCryptedKeys() const override;
     368                 :             : 
     369                 :             :     std::optional<int64_t> GetOldestKeyPoolTime() const override;
     370                 :             :     unsigned int GetKeyPoolSize() const override;
     371                 :             : 
     372                 :             :     int64_t GetTimeFirstKey() const override;
     373                 :             : 
     374                 :             :     std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
     375                 :             : 
     376                 :             :     bool CanGetAddresses(bool internal = false) const override;
     377                 :             : 
     378                 :             :     std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
     379                 :             : 
     380                 :             :     bool CanProvide(const CScript& script, SignatureData& sigdata) override;
     381                 :             : 
     382                 :             :     // Fetch the SigningProvider for the given pubkey and always include private keys. This should only be called by signing code.
     383                 :             :     std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CPubKey& pubkey) const;
     384                 :             : 
     385                 :             :     bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
     386                 :             :     SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
     387                 :             :     std::optional<common::PSBTError> FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = SIGHASH_DEFAULT, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr, bool finalize = true) const override;
     388                 :             : 
     389                 :             :     uint256 GetID() const override;
     390                 :             : 
     391                 :             :     void SetCache(const DescriptorCache& cache);
     392                 :             : 
     393                 :             :     bool AddKey(const CKeyID& key_id, const CKey& key);
     394                 :             :     bool AddCryptedKey(const CKeyID& key_id, const CPubKey& pubkey, const std::vector<unsigned char>& crypted_key);
     395                 :             : 
     396                 :             :     bool HasWalletDescriptor(const WalletDescriptor& desc) const;
     397                 :             :     util::Result<void> UpdateWalletDescriptor(WalletDescriptor& descriptor);
     398                 :             :     bool CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error);
     399                 :             :     void AddDescriptorKey(const CKey& key, const CPubKey &pubkey);
     400                 :             :     void WriteDescriptor();
     401                 :             : 
     402                 :             :     WalletDescriptor GetWalletDescriptor() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
     403                 :             :     std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
     404                 :             :     std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys(int32_t minimum_index) const;
     405                 :             :     int32_t GetEndRange() const;
     406                 :             : 
     407                 :             :     [[nodiscard]] bool GetDescriptorString(std::string& out, const bool priv) const;
     408                 :             : 
     409                 :             :     void UpgradeDescriptorCache();
     410                 :             : };
     411                 :             : 
     412                 :             : /** struct containing information needed for migrating legacy wallets to descriptor wallets */
     413                 :             : struct MigrationData
     414                 :             : {
     415                 :             :     CExtKey master_key;
     416                 :             :     std::vector<std::pair<std::string, int64_t>> watch_descs;
     417                 :             :     std::vector<std::pair<std::string, int64_t>> solvable_descs;
     418                 :             :     std::vector<std::unique_ptr<DescriptorScriptPubKeyMan>> desc_spkms;
     419                 :             :     std::shared_ptr<CWallet> watchonly_wallet{nullptr};
     420                 :             :     std::shared_ptr<CWallet> solvable_wallet{nullptr};
     421                 :             : };
     422                 :             : 
     423                 :             : } // namespace wallet
     424                 :             : 
     425                 :             : #endif // BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
        

Generated by: LCOV version 2.0-1