Bitcoin Core  29.1.0
P2P Digital Currency
scriptpubkeyman.h
Go to the documentation of this file.
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.
43 {
44 public:
45  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;
53  virtual bool WithEncryptionKey(std::function<bool (const CKeyingMaterial&)> cb) const = 0;
54  virtual bool HasEncryptionKeys() const = 0;
55  virtual bool IsLocked() const = 0;
57  virtual void TopUpCallback(const std::set<CScript>&, ScriptPubKeyMan*) = 0;
58 };
59 
61 static constexpr int64_t UNKNOWN_TIME = std::numeric_limits<int64_t>::max();
62 
64 static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
65 
66 std::vector<CKeyID> GetAffectedKeys(const CScript& spk, const SigningProvider& provider);
67 
117 class CKeyPool
118 {
119 public:
121  int64_t nTime;
125  bool fInternal;
128 
129  CKeyPool();
130  CKeyPool(const CPubKey& vchPubKeyIn, bool internalIn);
131 
132  template<typename Stream>
133  void Serialize(Stream& s) const
134  {
135  s << int{259900}; // Unused field, writes the highest client version ever written
136  s << nTime << vchPubKey << fInternal << m_pre_split;
137  }
138 
139  template<typename Stream>
140  void Unserialize(Stream& s)
141  {
142  s >> int{}; // Discard unused field
143  s >> nTime >> vchPubKey;
144  try {
145  s >> fInternal;
146  } catch (std::ios_base::failure&) {
147  /* flag as external address if we can't read the internal boolean
148  (this will be the case for any wallet before the HD chain split version) */
149  fInternal = false;
150  }
151  try {
152  s >> m_pre_split;
153  } catch (std::ios_base::failure&) {
154  /* flag as postsplit address if we can't read the m_pre_split boolean
155  (this will be the case for any wallet that upgrades to HD chain split) */
156  m_pre_split = false;
157  }
158  }
159 };
160 
162 {
164  std::optional<bool> internal;
165 };
166 
167 /*
168  * A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
169  * It contains the scripts and keys related to the scriptPubKeys it manages.
170  * A ScriptPubKeyMan will be able to give out scriptPubKeys to be used, as well as marking
171  * when a scriptPubKey has been used. It also handles when and how to store a scriptPubKey
172  * and its related scripts and keys, including encryption.
173  */
175 {
176 protected:
178 
179 public:
180  explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
181  virtual ~ScriptPubKeyMan() = default;
182  virtual util::Result<CTxDestination> GetNewDestination(const OutputType type) { return util::Error{Untranslated("Not supported")}; }
183  virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
184 
186  virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key) { return false; }
187  virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
188 
189  virtual util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) { return util::Error{Untranslated("Not supported")}; }
190  virtual void KeepDestination(int64_t index, const OutputType& type) {}
191  virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
192 
197  virtual bool TopUp(unsigned int size = 0) { return false; }
198 
206  virtual std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) { return {}; }
207 
212  virtual bool SetupGeneration(bool force = false) { return false; }
213 
214  /* Returns true if HD is enabled */
215  virtual bool IsHDEnabled() const { return false; }
216 
217  /* Returns true if the wallet can give out new addresses. This means it has keys in the keypool or can generate new keys */
218  virtual bool CanGetAddresses(bool internal = false) const { return false; }
219 
221  virtual bool Upgrade(int prev_version, int new_version, bilingual_str& error) { return true; }
222 
223  virtual bool HavePrivateKeys() const { return false; }
224  virtual bool HaveCryptedKeys() const { return false; }
225 
227  virtual void RewriteDB() {}
228 
229  virtual std::optional<int64_t> GetOldestKeyPoolTime() const { return GetTime(); }
230 
231  virtual unsigned int GetKeyPoolSize() const { return 0; }
232 
233  virtual int64_t GetTimeFirstKey() const { return 0; }
234 
235  virtual std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const { return nullptr; }
236 
237  virtual std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const { return nullptr; }
238 
242  virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
243 
245  virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const { return false; }
247  virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
249  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; }
250 
251  virtual uint256 GetID() const { return uint256(); }
252 
254  virtual std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const { return {}; };
255 
257  template <typename... Params>
258  void WalletLogPrintf(util::ConstevalFormatString<sizeof...(Params)> wallet_fmt, const Params&... params) const
259  {
260  LogInfo("%s %s", m_storage.GetDisplayName(), tfm::format(wallet_fmt, params...));
261  };
262 
264  boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
265 
267  boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
268 
270  boost::signals2::signal<void (const ScriptPubKeyMan* spkm, int64_t new_birth_time)> NotifyFirstKeyTimeChanged;
271 };
272 
274 static const std::unordered_set<OutputType> LEGACY_OUTPUT_TYPES {
278 };
279 
280 class DescriptorScriptPubKeyMan;
281 
282 // Manages the data for a LegacyScriptPubKeyMan.
283 // This is the minimum necessary to load a legacy wallet so that it can be migrated.
285 {
286 protected:
287  using WatchOnlySet = std::set<CScript>;
288  using WatchKeyMap = std::map<CKeyID, CPubKey>;
289  using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
290 
291  CryptedKeyMap mapCryptedKeys GUARDED_BY(cs_KeyStore);
292  WatchOnlySet setWatchOnly GUARDED_BY(cs_KeyStore);
293  WatchKeyMap mapWatchKeys GUARDED_BY(cs_KeyStore);
294 
295  /* the HD chain data model (external chain counters) */
297  std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
298 
301 
302  bool AddWatchOnlyInMem(const CScript &dest);
303  virtual bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
304  bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
305 
306  // Helper function to retrieve a conservative superset of all output scripts that may be relevant to this LegacyDataSPKM.
307  // It may include scripts that are invalid or not actually watched by this LegacyDataSPKM.
308  // Used only in migration.
309  std::unordered_set<CScript, SaltedSipHasher> GetCandidateScriptPubKeys() const;
310 public:
312 
313  // Map from Key ID to key metadata.
314  std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
315 
316  // Map from Script ID to key metadata (for watch-only keys).
317  std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
318 
319  // ScriptPubKeyMan overrides
320  bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
321  std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
322  std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
323  uint256 GetID() const override { return uint256::ONE; }
324  // TODO: Remove IsMine when deleting LegacyScriptPubKeyMan
325  isminetype IsMine(const CScript& script) const override;
326  bool CanProvide(const CScript& script, SignatureData& sigdata) override;
327 
328  // FillableSigningProvider overrides
329  bool HaveKey(const CKeyID &address) const override;
330  bool GetKey(const CKeyID &address, CKey& keyOut) const override;
331  bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
332  bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
333 
334  std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
335  std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
336  std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
337  int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
338  std::map<CKeyID, int64_t> m_pool_key_to_index;
339 
341  virtual void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
342  virtual void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
343 
345  bool LoadWatchOnly(const CScript &dest);
347  bool HaveWatchOnly(const CScript &dest) const;
349  bool HaveWatchOnly() const;
351  bool LoadKey(const CKey& key, const CPubKey &pubkey);
353  bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
355  bool LoadCScript(const CScript& redeemScript);
357  void LoadHDChain(const CHDChain& chain);
358  void AddInactiveHDChain(const CHDChain& chain);
359  const CHDChain& GetHDChain() const { return m_hd_chain; }
361  void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
362 
364  bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
365 
370  std::unordered_set<CScript, SaltedSipHasher> GetNotMineScriptPubKeys() const;
371 
374  std::optional<MigrationData> MigrateToDescriptor();
376  bool DeleteRecords();
377  bool DeleteRecordsWithDB(WalletBatch& batch);
378 };
379 
380 // Implements the full legacy wallet behavior
382 {
383 private:
384  WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
385 
386  // By default, do not scan any block until keys/scripts are generated/imported
387  int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = UNKNOWN_TIME;
388 
390  int64_t m_keypool_size GUARDED_BY(cs_KeyStore){DEFAULT_KEYPOOL_SIZE};
391 
392  bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey) override;
393 
406  bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript& dest, int64_t create_time) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
407 
409  bool AddKeyPubKeyWithDB(WalletBatch &batch,const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
410 
411  void AddKeypoolPubkeyWithDB(const CPubKey& pubkey, const bool internal, WalletBatch& batch);
412 
414  bool AddCScriptWithDB(WalletBatch& batch, const CScript& script);
415 
417  bool AddKeyOriginWithDB(WalletBatch& batch, const CPubKey& pubkey, const KeyOriginInfo& info);
418 
419  /* HD derive new child key (on internal or external chain) */
420  void DeriveNewChildKey(WalletBatch& batch, CKeyMetadata& metadata, CKey& secret, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
421 
422  // Tracks keypool indexes to CKeyIDs of keys that have been taken out of the keypool but may be returned to it
424 
426  bool GetKeyFromPool(CPubKey &key, const OutputType type);
427 
442  bool ReserveKeyFromKeyPool(int64_t& nIndex, CKeyPool& keypool, bool fRequestedInternal);
443 
454  bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal);
455 
456  bool TopUpChain(WalletBatch& batch, CHDChain& chain, unsigned int size);
457 public:
458  LegacyScriptPubKeyMan(WalletStorage& storage, int64_t keypool_size) : LegacyDataSPKM(storage), m_keypool_size(keypool_size) {}
459 
461 
462  bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
463 
464  util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) override;
465  void KeepDestination(int64_t index, const OutputType& type) override;
466  void ReturnDestination(int64_t index, bool internal, const CTxDestination&) override;
467 
468  bool TopUp(unsigned int size = 0) override;
469 
470  std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
471 
473  void UpgradeKeyMetadata();
474 
475  bool IsHDEnabled() const override;
476 
477  bool SetupGeneration(bool force = false) override;
478 
479  bool Upgrade(int prev_version, int new_version, bilingual_str& error) override;
480 
481  bool HavePrivateKeys() const override;
482  bool HaveCryptedKeys() const override;
483 
484  void RewriteDB() override;
485 
486  std::optional<int64_t> GetOldestKeyPoolTime() const override;
487  size_t KeypoolCountExternalKeys() const;
488  unsigned int GetKeyPoolSize() const override;
489 
490  int64_t GetTimeFirstKey() const override;
491 
492  std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
493 
494  bool CanGetAddresses(bool internal = false) const override;
495 
496  bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
497  SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
498  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;
499 
500  uint256 GetID() const override;
501 
503  bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override;
505  bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
506  void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
508  void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata) override;
509  void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata) override;
511  CPubKey GenerateNewKey(WalletBatch& batch, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
512 
513  /* Set the HD chain model (chain child index counters) and writes it to the database */
514  void AddHDChain(const CHDChain& chain);
515 
517  bool RemoveWatchOnly(const CScript &dest);
518  bool AddWatchOnly(const CScript& dest, int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
519 
520  /* SigningProvider overrides */
521  bool AddCScript(const CScript& redeemScript) override;
522 
523  bool NewKeyPool();
525 
526  bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
527  bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
528  bool ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
529  bool ImportScriptPubKeys(const std::set<CScript>& script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
530 
531  /* Returns true if the wallet can generate new keys */
532  bool CanGenerateKeys() const;
533 
534  /* Generates a new HD seed (will not be activated) */
536 
537  /* Derives a new HD seed (will not be activated) */
538  CPubKey DeriveNewSeed(const CKey& key);
539 
540  /* Set the current HD seed (will reset the chain child index counters)
541  Sets the seed's version based on the current wallet version (so the
542  caller must ensure the current wallet version is correct before calling
543  this function). */
544  void SetHDSeed(const CPubKey& key);
545 
552  void LearnRelatedScripts(const CPubKey& key, OutputType);
553 
558  void LearnAllRelatedScripts(const CPubKey& key);
559 
568  const std::map<CKeyID, int64_t>& GetAllReserveKeys() const { return m_pool_key_to_index; }
569 
570  std::set<CKeyID> GetKeys() const override;
571 };
572 
575 {
576 private:
578 public:
579  explicit LegacySigningProvider(const LegacyDataSPKM& spk_man) : m_spk_man(spk_man) {}
580 
581  bool GetCScript(const CScriptID &scriptid, CScript& script) const override { return m_spk_man.GetCScript(scriptid, script); }
582  bool HaveCScript(const CScriptID &scriptid) const override { return m_spk_man.HaveCScript(scriptid); }
583  bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const override { return m_spk_man.GetPubKey(address, pubkey); }
584  bool GetKey(const CKeyID &address, CKey& key) const override { return false; }
585  bool HaveKey(const CKeyID &address) const override { return false; }
586  bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override { return m_spk_man.GetKeyOrigin(keyid, info); }
587 };
588 
590 {
591  friend class LegacyDataSPKM;
592 private:
593  using ScriptPubKeyMap = std::map<CScript, int32_t>; // Map of scripts to descriptor range index
594  using PubKeyMap = std::map<CPubKey, int32_t>; // Map of pubkeys involved in scripts to descriptor range index
595  using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
596  using KeyMap = std::map<CKeyID, CKey>;
597 
598  ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
599  PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man);
600  int32_t m_max_cached_index = -1;
601 
602  KeyMap m_map_keys GUARDED_BY(cs_desc_man);
603  CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man);
604 
607 
609  int64_t m_keypool_size GUARDED_BY(cs_desc_man){DEFAULT_KEYPOOL_SIZE};
610 
611  bool AddDescriptorKeyWithDB(WalletBatch& batch, const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
612 
614 
615  // Cached FlatSigningProviders to avoid regenerating them each time they are needed.
617  // Fetch the SigningProvider for the given script and optionally include private keys
618  std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CScript& script, bool include_private = false) const;
619  // Fetch the SigningProvider for a given index and optionally include private keys. Called by the above functions.
620  std::unique_ptr<FlatSigningProvider> GetSigningProvider(int32_t index, bool include_private = false) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
621 
622 protected:
623  WalletDescriptor m_wallet_descriptor GUARDED_BY(cs_desc_man);
624 
626  bool TopUpWithDB(WalletBatch& batch, unsigned int size = 0);
627 
628 public:
629  DescriptorScriptPubKeyMan(WalletStorage& storage, WalletDescriptor& descriptor, int64_t keypool_size)
630  : ScriptPubKeyMan(storage),
631  m_keypool_size(keypool_size),
632  m_wallet_descriptor(descriptor)
633  {}
634  DescriptorScriptPubKeyMan(WalletStorage& storage, int64_t keypool_size)
635  : ScriptPubKeyMan(storage),
636  m_keypool_size(keypool_size)
637  {}
638 
640 
642  isminetype IsMine(const CScript& script) const override;
643 
644  bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
645  bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
646 
647  util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) override;
648  void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
649 
650  // Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
651  // and is used to expand the descriptor in GetNewDestination. DescriptorScriptPubKeyMan relies
652  // more on ephemeral data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
653  // (with or without private keys), the "keypool" is a single xpub.
654  bool TopUp(unsigned int size = 0) override;
655 
656  std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
657 
658  bool IsHDEnabled() const override;
659 
661  bool SetupDescriptorGeneration(WalletBatch& batch, const CExtKey& master_key, OutputType addr_type, bool internal);
662 
663  bool HavePrivateKeys() const override;
664  bool HasPrivKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
666  std::optional<CKey> GetKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
667  bool HaveCryptedKeys() const override;
668 
669  std::optional<int64_t> GetOldestKeyPoolTime() const override;
670  unsigned int GetKeyPoolSize() const override;
671 
672  int64_t GetTimeFirstKey() const override;
673 
674  std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
675 
676  bool CanGetAddresses(bool internal = false) const override;
677 
678  std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
679 
680  bool CanProvide(const CScript& script, SignatureData& sigdata) override;
681 
682  // Fetch the SigningProvider for the given pubkey and always include private keys. This should only be called by signing code.
683  std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CPubKey& pubkey) const;
684 
685  bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
686  SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
687  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;
688 
689  uint256 GetID() const override;
690 
691  void SetCache(const DescriptorCache& cache);
692 
693  bool AddKey(const CKeyID& key_id, const CKey& key);
694  bool AddCryptedKey(const CKeyID& key_id, const CPubKey& pubkey, const std::vector<unsigned char>& crypted_key);
695 
696  bool HasWalletDescriptor(const WalletDescriptor& desc) const;
697  void UpdateWalletDescriptor(WalletDescriptor& descriptor);
698  bool CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error);
699  void AddDescriptorKey(const CKey& key, const CPubKey &pubkey);
700  void WriteDescriptor();
701 
703  std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
704  std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys(int32_t minimum_index) const;
705  int32_t GetEndRange() const;
706 
707  [[nodiscard]] bool GetDescriptorString(std::string& out, const bool priv) const;
708 
709  void UpgradeDescriptorCache();
710 };
711 
714 {
716  std::vector<std::pair<std::string, int64_t>> watch_descs;
717  std::vector<std::pair<std::string, int64_t>> solvable_descs;
718  std::vector<std::unique_ptr<DescriptorScriptPubKeyMan>> desc_spkms;
719  std::shared_ptr<CWallet> watchonly_wallet{nullptr};
720  std::shared_ptr<CWallet> solvable_wallet{nullptr};
721 };
722 
723 } // namespace wallet
724 
725 #endif // BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
int64_t GetTimeFirstKey() const override
virtual std::string GetDisplayName() const =0
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
virtual SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const
Sign a message with the given script.
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
Adds script and derivation path information to a PSBT, and optionally signs it.
bool ImportPrivKeys(const std::map< CKeyID, CKey > &privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
bool CheckDecryptionKey(const CKeyingMaterial &master_key) override
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Update wallet first key creation time.
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that...
bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override
Adds a key to the store, and saves it to disk.
std::optional< CKey > GetKey(const CKeyID &keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
Retrieve the particular key if it is available. Returns nullopt if the key is not in the wallet...
virtual uint256 GetID() const
bool RemoveWatchOnly(const CScript &dest)
Remove a watch only script from the keystore.
bool GetKey(const CKeyID &address, CKey &key) const override
static const uint256 ONE
Definition: uint256.h:210
bool CheckDecryptionKey(const CKeyingMaterial &master_key) override
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
std::vector< WalletDestination > MarkUnusedAddresses(const CScript &script) override
Mark unused addresses as being used Affects all keys up to and including the one determined by provid...
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
Adds an encrypted key to the store, and saves it to disk.
bool SetupDescriptorGeneration(WalletBatch &batch, const CExtKey &master_key, OutputType addr_type, bool internal)
Setup descriptors based on the given CExtkey.
void UpgradeKeyMetadata()
Upgrade stored CKeyMetadata objects to store key origin info as KeyOriginInfo.
bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override
std::vector< WalletDestination > MarkUnusedAddresses(const CScript &script) override
Mark unused addresses as being used Affects all keys up to and including the one determined by provid...
bool Upgrade(int prev_version, int new_version, bilingual_str &error) override
Upgrades the wallet to the specified version.
virtual bool IsWalletFlagSet(uint64_t) const =0
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const override
virtual WalletDatabase & GetDatabase() const =0
std::unordered_set< CScript, SaltedSipHasher > GetCandidateScriptPubKeys() const
util::Result< CTxDestination > GetNewDestination(const OutputType type) override
void AddKeypoolPubkeyWithDB(const CPubKey &pubkey, const bool internal, WalletBatch &batch)
Bilingual messages:
Definition: translation.h:24
std::map< int64_t, CKeyID > m_index_to_reserved_key
bool NewKeyPool()
Mark old keypool keys as used, and generate all new keys.
is a home for simple string functions returning descriptive messages that are used in RPC and GUI int...
unsigned int GetKeyPoolSize() const override
virtual bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch)
RecursiveMutex cs_KeyStore
bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const override
bool fDecryptionThoroughlyChecked
keeps track of whether Unlock has run a thorough check before
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
Definition: interpreter.h:35
bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal)
Like TopUp() but adds keys for inactive HD chains.
bool DeleteRecordsWithDB(WalletBatch &batch)
bool HaveCryptedKeys() const override
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:82
bool AddCScript(const CScript &redeemScript) override
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
Definition: key.h:227
bool CanGetAddresses(bool internal=false) const override
struct containing information needed for migrating legacy wallets to descriptor wallets ...
bool LoadKey(const CKey &key, const CPubKey &pubkey)
Adds a key to the store, without saving it to disk (used by LoadWallet)
std::vector< std::pair< std::string, int64_t > > solvable_descs
std::map< CKeyID, CKey > KeyMap
bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor, std::string &error)
DescriptorScriptPubKeyMan(WalletStorage &storage, int64_t keypool_size)
boost::signals2::signal< void()> NotifyCanGetAddressesChanged
Keypool has new keys.
virtual bool CheckDecryptionKey(const CKeyingMaterial &master_key)
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
static const unsigned int DEFAULT_KEYPOOL_SIZE
Default for -keypool.
bool AddWatchOnly(const CScript &dest) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Private version of AddWatchOnly method which does not accept a timestamp, and which will reset the wa...
void WalletLogPrintf(util::ConstevalFormatString< sizeof...(Params)> wallet_fmt, const Params &... params) const
Prepends the wallet name in logging output to ease debugging in multi-wallet use cases.
std::vector< std::pair< std::string, int64_t > > watch_descs
void AddInactiveHDChain(const CHDChain &chain)
bool AddKeyPubKeyWithDB(WalletBatch &batch, const CKey &key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Adds a key to the store, and saves it to disk.
bool m_pre_split
Whether this key was generated for a keypool before the wallet was upgraded to HD-split.
void UpdateWalletDescriptor(WalletDescriptor &descriptor)
bool ImportScriptPubKeys(const std::set< CScript > &script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
void SetHDSeed(const CPubKey &key)
A version of CTransaction with the PSBT format.
Definition: psbt.h:950
virtual void UnsetBlankWalletFlag(WalletBatch &)=0
SigningResult
Definition: signmessage.h:43
void LoadHDChain(const CHDChain &chain)
Load a HD chain model (used by LoadWallet)
Access to the wallet database.
Definition: walletdb.h:195
A key from a CWallet&#39;s keypool.
boost::signals2::signal< void(const ScriptPubKeyMan *spkm, int64_t new_birth_time)> NotifyFirstKeyTimeChanged
Birth time changed.
void Unserialize(Stream &s)
bool AddKey(const CKeyID &key_id, const CKey &key)
bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
virtual bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, bilingual_str > &input_errors) const
Creates new signatures and adds them to the transaction.
void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool)
Load a keypool entry.
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
void format(std::ostream &out, FormatStringCheck< sizeof...(Args)> fmt, const Args &... args)
Format list of arguments to the stream according to given format string.
Definition: tinyformat.h:1079
virtual bool IsLocked() const =0
virtual bool CanProvide(const CScript &script, SignatureData &sigdata)
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that...
unsigned int GetKeyPoolSize() const override
bool IsHDEnabled() const override
std::map< CPubKey, int32_t > PubKeyMap
OutputType
Definition: outputtype.h:17
bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const
Fetches a pubkey from mapWatchKeys if it exists there.
int64_t nTime
The time at which the key was generated. Set in AddKeypoolPubKeyWithDB.
virtual std::optional< int64_t > GetOldestKeyPoolTime() const
CryptedKeyMap mapCryptedKeys GUARDED_BY(cs_KeyStore)
int64_t m_keypool_size GUARDED_BY(cs_KeyStore)
Number of pre-generated keys/scripts (part of the look-ahead process, used to detect payments) ...
bool CanGetAddresses(bool internal=false) const override
bool AddWatchOnlyInMem(const CScript &dest)
bool LoadWatchOnly(const CScript &dest)
Adds a watch-only address to the store, without saving it to disk (used by LoadWallet) ...
bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
void SetCache(const DescriptorCache &cache)
virtual isminetype IsMine(const CScript &script) const
isminetype IsMine(const CScript &script) const override
bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey, const std::vector< unsigned char > &crypted_key)
WalletDescriptor GetWalletDescriptor() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
virtual std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const
std::map< CKeyID, CPubKey > WatchKeyMap
ScriptPubKeyMan(WalletStorage &storage)
bool GetKey(const CKeyID &address, CKey &keyOut) const override
virtual ~ScriptPubKeyMan()=default
static constexpr int64_t UNKNOWN_TIME
Constant representing an unknown spkm creation time.
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that...
std::set< CKeyID > GetKeys() const override
bool HavePrivateKeys() const override
virtual bool CanSupportFeature(enum WalletFeature) const =0
CPubKey vchPubKey
The public key.
bool fInternal
Whether this keypool entry is in the internal keypool (for change outputs)
void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr) override
std::vector< CKeyID > GetAffectedKeys(const CScript &spk, const SigningProvider &provider)
std::map< CKeyID, int64_t > m_pool_key_to_index
virtual void SetMinVersion(enum WalletFeature, WalletBatch *=nullptr)=0
void RewriteDB() override
The action to do when the DB needs rewrite.
virtual bool HasEncryptionKeys() const =0
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
std::optional< int64_t > GetOldestKeyPoolTime() const override
Wraps a LegacyScriptPubKeyMan so that it can be returned in a new unique_ptr.
bool HaveKey(const CKeyID &address) const override
void AddHDChain(const CHDChain &chain)
virtual std::vector< WalletDestination > MarkUnusedAddresses(const CScript &script)
Mark unused addresses as being used Affects all keys up to and including the one determined by provid...
An encapsulated public key.
Definition: pubkey.h:33
Fillable signing provider that keeps keys in an address->secret map.
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
Definition: types.h:41
bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret, bool checksum_valid)
Adds an encrypted key to the store, without saving it to disk (used by LoadWallet) ...
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:15
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
is a home for simple enum and struct type definitions that can be used internally by functions in the...
isminetype IsMine(const CScript &script) const override
void ReturnDestination(int64_t index, bool internal, const CTxDestination &) override
WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore)
ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man)
std::map< CScript, int32_t > ScriptPubKeyMap
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const override
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
std::optional< MigrationData > MigrateToDescriptor()
Get the DescriptorScriptPubKeyMans (with private keys) that have the same scriptPubKeys as this Legac...
virtual bool IsHDEnabled() const
util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool) override
virtual void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata)
Load metadata (used by LoadWallet)
A wrapper for a compile-time partially validated format string.
Definition: string.h:92
virtual std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const
static const std::unordered_set< OutputType > LEGACY_OUTPUT_TYPES
OutputTypes supported by the LegacyScriptPubKeyMan.
bool ImportPubKeys(const std::vector< std::pair< CKeyID, bool >> &ordered_pubkeys, const std::map< CKeyID, CPubKey > &pubkey_map, const std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo >> &key_origins, const bool add_keypool, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
std::optional< int64_t > GetOldestKeyPoolTime() const override
is a home for public enum and struct type definitions that are used by internally by wallet code...
virtual void TopUpCallback(const std::set< CScript > &, ScriptPubKeyMan *)=0
Callback function for after TopUp completes containing any scripts that were added by a SPKMan...
bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, bilingual_str > &input_errors) const override
Creates new signatures and adds them to the transaction.
uint256 GetID() const override
Descriptor with some wallet metadata.
Definition: walletutil.h:84
virtual bool HavePrivateKeys() const
bool HaveCScript(const CScriptID &scriptid) const override
bool AddCScriptWithDB(WalletBatch &batch, const CScript &script)
Adds a script to the store and saves it to disk.
virtual void KeepDestination(int64_t index, const OutputType &type)
virtual unsigned int GetKeyPoolSize() const
virtual bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey)
#define LogInfo(...)
Definition: logging.h:356
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
virtual void RewriteDB()
The action to do when the DB needs rewrite.
static int sign(const secp256k1_context *ctx, struct signer_secrets *signer_secrets, struct signer *signer, const secp256k1_musig_keyagg_cache *cache, const unsigned char *msg32, unsigned char *sig64)
Definition: musig.c:105
bool HaveWatchOnly() const
Returns whether there are any watch-only things in the wallet.
uint256 GetID() const override
virtual void LoadScriptMetadata(const CScriptID &script_id, const CKeyMetadata &metadata)
virtual bool CanGetAddresses(bool internal=false) const
256-bit opaque blob.
Definition: uint256.h:201
bool DeleteRecords()
Delete all the records of this LegacyScriptPubKeyMan from disk.
CPubKey DeriveNewSeed(const CKey &key)
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
Adds script and derivation path information to a PSBT, and optionally signs it.
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
bool TopUpChain(WalletBatch &batch, CHDChain &chain, unsigned int size)
void LearnRelatedScripts(const CPubKey &key, OutputType)
Explicitly make the wallet learn the related scripts for outputs to the given key.
virtual bool WithEncryptionKey(std::function< bool(const CKeyingMaterial &)> cb) const =0
Pass the encryption key to cb().
An interface to be implemented by keystores that support signing.
util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool) override
virtual bool HaveCryptedKeys() const
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
Adds script and derivation path information to a PSBT, and optionally signs it.
bool ImportScripts(const std::set< CScript > scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
const CChainParams & Params()
Return the currently selected parameters.
Cache for single descriptor&#39;s derived extended pubkeys.
Definition: descriptor.h:19
bool GetDescriptorString(std::string &out, const bool priv) const
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > >> CryptedKeyMap
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:414
virtual util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool)
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
Definition: addresstype.h:140
bool SetupGeneration(bool force=false) override
Sets up the key generation stuff, i.e.
void LearnAllRelatedScripts(const CPubKey &key)
Same as LearnRelatedScripts, but when the OutputType is not known (and could be anything).
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > >> CryptedKeyMap
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:23
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
std::map< int32_t, FlatSigningProvider > m_map_signing_providers
std::set< CScript > WatchOnlySet
bool m_decryption_thoroughly_checked
keeps track of whether Unlock has run a thorough check before
virtual bool HaveCScript(const CScriptID &hash) const override
void Serialize(Stream &s) const
void AddDescriptorKey(const CKey &key, const CPubKey &pubkey)
A reference to a CScript: the Hash160 of its serialization.
Definition: script.h:601
A mutable version of CTransaction.
Definition: transaction.h:377
CPubKey GenerateNewKey(WalletBatch &batch, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Generate a new key.
bool GetKeyFromPool(CPubKey &key, const OutputType type)
Fetches a key from the keypool.
int64_t m_keypool_size GUARDED_BY(cs_desc_man)
Number of pre-generated keys/scripts (part of the look-ahead process, used to detect payments) ...
bool AddDescriptorKeyWithDB(WalletBatch &batch, const CKey &key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
KeyMap GetKeys() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
void LoadScriptMetadata(const CScriptID &script_id, const CKeyMetadata &metadata) override
void KeepDestination(int64_t index, const OutputType &type) override
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
bool TopUp(unsigned int size=0) override
Fills internal address pool.
std::vector< CKeyPool > MarkReserveKeysAsUsed(int64_t keypool_id) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Marks all keys in the keypool up to and including the provided key as used.
virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr)
An encapsulated private key.
Definition: key.h:34
bool ReserveKeyFromKeyPool(int64_t &nIndex, CKeyPool &keypool, bool fRequestedInternal)
Reserves a key from the keypool and sets nIndex to its index.
virtual int64_t GetTimeFirstKey() const
bool HasPrivKey(const CKeyID &keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
std::unordered_map< CKeyID, CHDChain, SaltedSipHasher > m_inactive_hd_chains
void DeriveNewChildKey(WalletBatch &batch, CKeyMetadata &metadata, CKey &secret, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
virtual bool TopUp(unsigned int size=0)
Fills internal address pool.
virtual std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
is a home for public enum and struct type definitions that are used internally by node code...
bool HaveKey(const CKeyID &address) const override
virtual util::Result< CTxDestination > GetNewDestination(const OutputType type)
bool LoadCScript(const CScript &redeemScript)
Adds a CScript to the store.
int64_t GetTime()
DEPRECATED, see GetTime.
Definition: time.cpp:76
std::unordered_set< CScript, SaltedSipHasher > GetNotMineScriptPubKeys() const
Retrieves scripts that were imported by bugs into the legacy spkm and are simply invalid, such as a sh(sh(pkh())) script, or not watched.
std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const override
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
virtual ~WalletStorage()=default
const CHDChain & GetHDChain() const
virtual bool Upgrade(int prev_version, int new_version, bilingual_str &error)
Upgrades the wallet to the specified version.
LegacySigningProvider(const LegacyDataSPKM &spk_man)
bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey) override
bool TopUpWithDB(WalletBatch &batch, unsigned int size=0)
Same as &#39;TopUp&#39; but designed for use within a batch transaction context.
virtual bool SetupGeneration(bool force=false)
Sets up the key generation stuff, i.e.
const std::map< CKeyID, int64_t > & GetAllReserveKeys() const
bool HasWalletDescriptor(const WalletDescriptor &desc) const
boost::signals2::signal< void(bool fHaveWatchOnly)> NotifyWatchonlyChanged
Watch-only address added.
An instance of this class represents one database.
Definition: db.h:130
int64_t GetTimeFirstKey() const override
bool TopUp(unsigned int size=0) override
Fills internal address pool.
std::vector< unsigned char, secure_allocator< unsigned char > > CKeyingMaterial
Definition: crypter.h:62
void MarkPreSplitKeys() EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
std::vector< std::unique_ptr< DescriptorScriptPubKeyMan > > desc_spkms
util::Result< CTxDestination > GetNewDestination(const OutputType type) override
bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, bilingual_str > &input_errors) const override
Creates new signatures and adds them to the transaction.
const LegacyDataSPKM & m_spk_man
std::unique_ptr< FlatSigningProvider > GetSigningProvider(const CScript &script, bool include_private=false) const
void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata) override
Load metadata (used by LoadWallet)
WalletStorage & m_storage
bool AddKeyOriginWithDB(WalletBatch &batch, const CPubKey &pubkey, const KeyOriginInfo &info)
Add a KeyOriginInfo to the wallet.