Bitcoin Core  22.0.0
P2P Digital Currency
scriptpubkeyman.h
Go to the documentation of this file.
1 // Copyright (c) 2019-2020 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 <psbt.h>
9 #include <script/descriptor.h>
10 #include <script/signingprovider.h>
11 #include <script/standard.h>
12 #include <util/error.h>
13 #include <util/message.h>
14 #include <util/time.h>
15 #include <wallet/crypter.h>
16 #include <wallet/ismine.h>
17 #include <wallet/walletdb.h>
18 #include <wallet/walletutil.h>
19 
20 #include <boost/signals2/signal.hpp>
21 
22 #include <unordered_map>
23 
24 enum class OutputType;
25 struct bilingual_str;
26 
27 // Wallet storage things that ScriptPubKeyMans need in order to be able to store things to the wallet database.
28 // It provides access to things that are part of the entire wallet and not specific to a ScriptPubKeyMan such as
29 // wallet flags, wallet version, encryption keys, encryption status, and the database itself. This allows a
30 // ScriptPubKeyMan to have callbacks into CWallet without causing a circular dependency.
31 // WalletStorage should be the same for all ScriptPubKeyMans of a wallet.
33 {
34 public:
35  virtual ~WalletStorage() = default;
36  virtual const std::string GetDisplayName() const = 0;
37  virtual WalletDatabase& GetDatabase() const = 0;
38  virtual bool IsWalletFlagSet(uint64_t) const = 0;
39  virtual void UnsetBlankWalletFlag(WalletBatch&) = 0;
40  virtual bool CanSupportFeature(enum WalletFeature) const = 0;
41  virtual void SetMinVersion(enum WalletFeature, WalletBatch* = nullptr) = 0;
42  virtual const CKeyingMaterial& GetEncryptionKey() const = 0;
43  virtual bool HasEncryptionKeys() const = 0;
44  virtual bool IsLocked() const = 0;
45 };
46 
48 static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
49 
50 std::vector<CKeyID> GetAffectedKeys(const CScript& spk, const SigningProvider& provider);
51 
101 class CKeyPool
102 {
103 public:
105  int64_t nTime;
109  bool fInternal;
112 
113  CKeyPool();
114  CKeyPool(const CPubKey& vchPubKeyIn, bool internalIn);
115 
116  template<typename Stream>
117  void Serialize(Stream& s) const
118  {
119  int nVersion = s.GetVersion();
120  if (!(s.GetType() & SER_GETHASH)) {
121  s << nVersion;
122  }
123  s << nTime << vchPubKey << fInternal << m_pre_split;
124  }
125 
126  template<typename Stream>
127  void Unserialize(Stream& s)
128  {
129  int nVersion = s.GetVersion();
130  if (!(s.GetType() & SER_GETHASH)) {
131  s >> nVersion;
132  }
133  s >> nTime >> vchPubKey;
134  try {
135  s >> fInternal;
136  } catch (std::ios_base::failure&) {
137  /* flag as external address if we can't read the internal boolean
138  (this will be the case for any wallet before the HD chain split version) */
139  fInternal = false;
140  }
141  try {
142  s >> m_pre_split;
143  } catch (std::ios_base::failure&) {
144  /* flag as postsplit address if we can't read the m_pre_split boolean
145  (this will be the case for any wallet that upgrades to HD chain split) */
146  m_pre_split = false;
147  }
148  }
149 };
150 
152 {
153 public:
155 
156  size_t operator()(const CKeyID& id) const
157  {
158  return id.GetUint64(0);
159  }
160 };
161 
162 /*
163  * A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
164  * It contains the scripts and keys related to the scriptPubKeys it manages.
165  * A ScriptPubKeyMan will be able to give out scriptPubKeys to be used, as well as marking
166  * when a scriptPubKey has been used. It also handles when and how to store a scriptPubKey
167  * and its related scripts and keys, including encryption.
168  */
170 {
171 protected:
173 
174 public:
175  explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
176  virtual ~ScriptPubKeyMan() {};
177  virtual bool GetNewDestination(const OutputType type, CTxDestination& dest, std::string& error) { return false; }
178  virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
179 
181  virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) { return false; }
182  virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
183 
184  virtual bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, std::string& error) { return false; }
185  virtual void KeepDestination(int64_t index, const OutputType& type) {}
186  virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
187 
192  virtual bool TopUp(unsigned int size = 0) { return false; }
193 
195  virtual void MarkUnusedAddresses(const CScript& script) {}
196 
201  virtual bool SetupGeneration(bool force = false) { return false; }
202 
203  /* Returns true if HD is enabled */
204  virtual bool IsHDEnabled() const { return false; }
205 
206  /* Returns true if the wallet can give out new addresses. This means it has keys in the keypool or can generate new keys */
207  virtual bool CanGetAddresses(bool internal = false) const { return false; }
208 
210  virtual bool Upgrade(int prev_version, int new_version, bilingual_str& error) { return true; }
211 
212  virtual bool HavePrivateKeys() const { return false; }
213 
215  virtual void RewriteDB() {}
216 
217  virtual int64_t GetOldestKeyPoolTime() const { return GetTime(); }
218 
219  virtual unsigned int GetKeyPoolSize() const { return 0; }
220 
221  virtual int64_t GetTimeFirstKey() const { return 0; }
222 
223  virtual std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const { return nullptr; }
224 
225  virtual std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const { return nullptr; }
226 
230  virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
231 
233  virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const { return false; }
235  virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
237  virtual TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const { return TransactionError::INVALID_PSBT; }
238 
239  virtual uint256 GetID() const { return uint256(); }
240 
242  template<typename... Params>
243  void WalletLogPrintf(std::string fmt, Params... parameters) const {
244  LogPrintf(("%s " + fmt).c_str(), m_storage.GetDisplayName(), parameters...);
245  };
246 
248  boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
249 
251  boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
252 };
253 
255 static const std::unordered_set<OutputType> LEGACY_OUTPUT_TYPES {
259 };
260 
262 {
263 private:
266 
267  using WatchOnlySet = std::set<CScript>;
268  using WatchKeyMap = std::map<CKeyID, CPubKey>;
269 
270  WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
271 
272  using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
273 
274  CryptedKeyMap mapCryptedKeys GUARDED_BY(cs_KeyStore);
275  WatchOnlySet setWatchOnly GUARDED_BY(cs_KeyStore);
276  WatchKeyMap mapWatchKeys GUARDED_BY(cs_KeyStore);
277 
278  int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = 0;
279 
280  bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
281  bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
282 
294  bool AddWatchOnlyInMem(const CScript &dest);
296  bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript& dest, int64_t create_time) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
297 
299  bool AddKeyPubKeyWithDB(WalletBatch &batch,const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
300 
301  void AddKeypoolPubkeyWithDB(const CPubKey& pubkey, const bool internal, WalletBatch& batch);
302 
304  bool AddCScriptWithDB(WalletBatch& batch, const CScript& script);
305 
307  bool AddKeyOriginWithDB(WalletBatch& batch, const CPubKey& pubkey, const KeyOriginInfo& info);
308 
309  /* the HD chain data model (external chain counters) */
311  std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
312 
313  /* HD derive new child key (on internal or external chain) */
314  void DeriveNewChildKey(WalletBatch& batch, CKeyMetadata& metadata, CKey& secret, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
315 
316  std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
317  std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
318  std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
319  int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
321  // Tracks keypool indexes to CKeyIDs of keys that have been taken out of the keypool but may be returned to it
323 
325  bool GetKeyFromPool(CPubKey &key, const OutputType type, bool internal = false);
326 
341  bool ReserveKeyFromKeyPool(int64_t& nIndex, CKeyPool& keypool, bool fRequestedInternal);
342 
353  bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal);
354 
355 public:
357 
358  bool GetNewDestination(const OutputType type, CTxDestination& dest, std::string& error) override;
359  isminetype IsMine(const CScript& script) const override;
360 
361  bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
362  bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
363 
364  bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, std::string& error) override;
365  void KeepDestination(int64_t index, const OutputType& type) override;
366  void ReturnDestination(int64_t index, bool internal, const CTxDestination&) override;
367 
368  bool TopUp(unsigned int size = 0) override;
369 
370  void MarkUnusedAddresses(const CScript& script) override;
371 
373  void UpgradeKeyMetadata();
374 
375  bool IsHDEnabled() const override;
376 
377  bool SetupGeneration(bool force = false) override;
378 
379  bool Upgrade(int prev_version, int new_version, bilingual_str& error) override;
380 
381  bool HavePrivateKeys() const override;
382 
383  void RewriteDB() override;
384 
385  int64_t GetOldestKeyPoolTime() const override;
386  size_t KeypoolCountExternalKeys() const;
387  unsigned int GetKeyPoolSize() const override;
388 
389  int64_t GetTimeFirstKey() const override;
390 
391  std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
392 
393  bool CanGetAddresses(bool internal = false) const override;
394 
395  std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
396 
397  bool CanProvide(const CScript& script, SignatureData& sigdata) override;
398 
399  bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const override;
400  SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
401  TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const override;
402 
403  uint256 GetID() const override;
404 
405  // Map from Key ID to key metadata.
406  std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
407 
408  // Map from Script ID to key metadata (for watch-only keys).
409  std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
410 
412  bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override;
414  bool LoadKey(const CKey& key, const CPubKey &pubkey);
416  bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
418  bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
419  void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
421  bool LoadCScript(const CScript& redeemScript);
423  void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
424  void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
426  CPubKey GenerateNewKey(WalletBatch& batch, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
427 
428  /* Set the HD chain model (chain child index counters) and writes it to the database */
429  void AddHDChain(const CHDChain& chain);
431  void LoadHDChain(const CHDChain& chain);
432  const CHDChain& GetHDChain() const { return m_hd_chain; }
433  void AddInactiveHDChain(const CHDChain& chain);
434 
436  bool LoadWatchOnly(const CScript &dest);
438  bool HaveWatchOnly(const CScript &dest) const;
440  bool HaveWatchOnly() const;
442  bool RemoveWatchOnly(const CScript &dest);
443  bool AddWatchOnly(const CScript& dest, int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
444 
446  bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
447 
448  /* SigningProvider overrides */
449  bool HaveKey(const CKeyID &address) const override;
450  bool GetKey(const CKeyID &address, CKey& keyOut) const override;
451  bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
452  bool AddCScript(const CScript& redeemScript) override;
453  bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
454 
456  void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
457  bool NewKeyPool();
459 
460  bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
461  bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
462  bool ImportPubKeys(const std::vector<CKeyID>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const bool internal, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
463  bool ImportScriptPubKeys(const std::set<CScript>& script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
464 
465  /* Returns true if the wallet can generate new keys */
466  bool CanGenerateKeys() const;
467 
468  /* Generates a new HD seed (will not be activated) */
470 
471  /* Derives a new HD seed (will not be activated) */
472  CPubKey DeriveNewSeed(const CKey& key);
473 
474  /* Set the current HD seed (will reset the chain child index counters)
475  Sets the seed's version based on the current wallet version (so the
476  caller must ensure the current wallet version is correct before calling
477  this function). */
478  void SetHDSeed(const CPubKey& key);
479 
486  void LearnRelatedScripts(const CPubKey& key, OutputType);
487 
492  void LearnAllRelatedScripts(const CPubKey& key);
493 
498  const std::map<CKeyID, int64_t>& GetAllReserveKeys() const { return m_pool_key_to_index; }
499 
500  std::set<CKeyID> GetKeys() const override;
501 };
502 
505 {
506 private:
508 public:
509  explicit LegacySigningProvider(const LegacyScriptPubKeyMan& spk_man) : m_spk_man(spk_man) {}
510 
511  bool GetCScript(const CScriptID &scriptid, CScript& script) const override { return m_spk_man.GetCScript(scriptid, script); }
512  bool HaveCScript(const CScriptID &scriptid) const override { return m_spk_man.HaveCScript(scriptid); }
513  bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const override { return m_spk_man.GetPubKey(address, pubkey); }
514  bool GetKey(const CKeyID &address, CKey& key) const override { return false; }
515  bool HaveKey(const CKeyID &address) const override { return false; }
516  bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override { return m_spk_man.GetKeyOrigin(keyid, info); }
517 };
518 
520 {
521 private:
522  using ScriptPubKeyMap = std::map<CScript, int32_t>; // Map of scripts to descriptor range index
523  using PubKeyMap = std::map<CPubKey, int32_t>; // Map of pubkeys involved in scripts to descriptor range index
524  using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
525  using KeyMap = std::map<CKeyID, CKey>;
526 
527  ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
528  PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man);
529  int32_t m_max_cached_index = -1;
530 
531  KeyMap m_map_keys GUARDED_BY(cs_desc_man);
532  CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man);
533 
536 
537  bool AddDescriptorKeyWithDB(WalletBatch& batch, const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
538 
540 
541  // Fetch the SigningProvider for the given script and optionally include private keys
542  std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CScript& script, bool include_private = false) const;
543  // Fetch the SigningProvider for the given pubkey and always include private keys. This should only be called by signing code.
544  std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CPubKey& pubkey) const;
545  // Fetch the SigningProvider for a given index and optionally include private keys. Called by the above functions.
546  std::unique_ptr<FlatSigningProvider> GetSigningProvider(int32_t index, bool include_private = false) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
547 
548 protected:
549  WalletDescriptor m_wallet_descriptor GUARDED_BY(cs_desc_man);
550 
551 public:
553  : ScriptPubKeyMan(storage),
554  m_wallet_descriptor(descriptor)
555  {}
557  : ScriptPubKeyMan(storage)
558  {}
559 
561 
562  bool GetNewDestination(const OutputType type, CTxDestination& dest, std::string& error) override;
563  isminetype IsMine(const CScript& script) const override;
564 
565  bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
566  bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
567 
568  bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, std::string& error) override;
569  void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
570 
571  // Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
572  // and is used to expand the descriptor in GetNewDestination. DescriptorScriptPubKeyMan relies
573  // more on ephemeral data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
574  // (with or without private keys), the "keypool" is a single xpub.
575  bool TopUp(unsigned int size = 0) override;
576 
577  void MarkUnusedAddresses(const CScript& script) override;
578 
579  bool IsHDEnabled() const override;
580 
582  bool SetupDescriptorGeneration(const CExtKey& master_key, OutputType addr_type, bool internal);
583 
587  bool SetupDescriptor(std::unique_ptr<Descriptor>desc);
588 
589  bool HavePrivateKeys() const override;
590 
591  int64_t GetOldestKeyPoolTime() const override;
592  unsigned int GetKeyPoolSize() const override;
593 
594  int64_t GetTimeFirstKey() const override;
595 
596  std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
597 
598  bool CanGetAddresses(bool internal = false) const override;
599 
600  std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
601 
602  bool CanProvide(const CScript& script, SignatureData& sigdata) override;
603 
604  bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const override;
605  SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
606  TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const override;
607 
608  uint256 GetID() const override;
609 
610  void SetCache(const DescriptorCache& cache);
611 
612  bool AddKey(const CKeyID& key_id, const CKey& key);
613  bool AddCryptedKey(const CKeyID& key_id, const CPubKey& pubkey, const std::vector<unsigned char>& crypted_key);
614 
615  bool HasWalletDescriptor(const WalletDescriptor& desc) const;
616  void UpdateWalletDescriptor(WalletDescriptor& descriptor);
617  bool CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error);
618  void AddDescriptorKey(const CKey& key, const CPubKey &pubkey);
619  void WriteDescriptor();
620 
622  const std::vector<CScript> GetScriptPubKeys() const;
623 
624  bool GetDescriptorString(std::string& out) const;
625 
626  void UpgradeDescriptorCache();
627 };
628 
629 #endif // BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
void ReturnDestination(int64_t index, bool internal, const CTxDestination &) override
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) ...
bool NewKeyPool()
Mark old keypool keys as used, and generate all new keys.
bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey)
const CHDChain & GetHDChain() const
void LoadScriptMetadata(const CScriptID &script_id, const CKeyMetadata &metadata)
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.
void KeepDestination(int64_t index, const OutputType &type) override
bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey, const std::vector< unsigned char > &crypted_key)
const LegacyScriptPubKeyMan & m_spk_man
size_t operator()(const CKeyID &id) const
virtual TransactionError FillPSBT(PartiallySignedTransaction &psbt, const PrecomputedTransactionData &txdata, int sighash_type=1, bool sign=true, bool bip32derivs=false, int *n_signed=nullptr) const
Adds script and derivation path information to a PSBT, and optionally signs it.
void RewriteDB() override
The action to do when the DB needs rewrite.
bool GetNewDestination(const OutputType type, CTxDestination &dest, std::string &error) override
virtual const CKeyingMaterial & GetEncryptionKey() const =0
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
virtual void UnsetBlankWalletFlag(WalletBatch &)=0
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const override
void LearnAllRelatedScripts(const CPubKey &key)
Same as LearnRelatedScripts, but when the OutputType is not known (and could be anything).
bool Upgrade(int prev_version, int new_version, bilingual_str &error) override
Upgrades the wallet to the specified version.
void MarkReserveKeysAsUsed(int64_t keypool_id) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Marks all keys in the keypool up to and including reserve_key as used.
bool ImportScriptPubKeys(const std::set< CScript > &script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
bool LoadCScript(const CScript &redeemScript)
Adds a CScript to the store.
std::unordered_map< CKeyID, CHDChain, SaltedSipHasher > m_inactive_hd_chains
bool AddKeyOriginWithDB(WalletBatch &batch, const CPubKey &pubkey, const KeyOriginInfo &info)
Add a KeyOriginInfo to the wallet.
bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, std::string > &input_errors) const override
Creates new signatures and adds them to the transaction.
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
virtual const std::string GetDisplayName() const =0
A UTXO entry.
Definition: coins.h:30
Bilingual messages:
Definition: translation.h:16
isminetype IsMine(const CScript &script) const override
virtual ~ScriptPubKeyMan()
RecursiveMutex cs_KeyStore
uint256 GetID() const override
bool CheckDecryptionKey(const CKeyingMaterial &master_key, bool accept_no_keys=false) override
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
SigningResult
Definition: message.h:42
size_t KeypoolCountExternalKeys() const
int64_t GetOldestKeyPoolTime() const override
void AddKeypoolPubkeyWithDB(const CPubKey &pubkey, const bool internal, WalletBatch &batch)
Definition: key.h:156
bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const override
virtual void SetMinVersion(enum WalletFeature, WalletBatch *=nullptr)=0
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that...
std::set< CScript > WatchOnlySet
std::vector< unsigned char, secure_allocator< unsigned char > > CKeyingMaterial
Definition: crypter.h:61
boost::signals2::signal< void()> NotifyCanGetAddressesChanged
Keypool has new keys.
unsigned int GetKeyPoolSize() const override
bool CanGetAddresses(bool internal=false) const override
virtual void RewriteDB()
The action to do when the DB needs rewrite.
static const std::unordered_set< OutputType > LEGACY_OUTPUT_TYPES
OutputTypes supported by the LegacyScriptPubKeyMan.
bool GetKey(const CKeyID &address, CKey &key) const override
uint256 GetID() const override
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool, std::string &error) override
bool HaveKey(const CKeyID &address) const override
void LearnRelatedScripts(const CPubKey &key, OutputType)
Explicitly make the wallet learn the related scripts for outputs to the given key.
A version of CTransaction with the PSBT format.
Definition: psbt.h:391
void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata)
Load metadata (used by LoadWallet)
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
bool ImportPubKeys(const std::vector< CKeyID > &ordered_pubkeys, const std::map< CKeyID, CPubKey > &pubkey_map, const std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo >> &key_origins, const bool add_keypool, const bool internal, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > >> CryptedKeyMap
CPubKey GenerateNewKey(WalletBatch &batch, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Generate a new key.
boost::signals2::signal< void(bool fHaveWatchOnly)> NotifyWatchonlyChanged
Watch-only address added.
const WalletDescriptor GetWalletDescriptor() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
virtual WalletDatabase & GetDatabase() const =0
virtual bool IsWalletFlagSet(uint64_t) const =0
bool RemoveWatchOnly(const CScript &dest)
Remove a watch only script from the keystore.
virtual int64_t GetTimeFirstKey() const
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
KeyMap GetKeys() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
OutputType
Definition: outputtype.h:17
void Unserialize(Stream &s)
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:14
bool IsHDEnabled() const override
const std::map< CKeyID, int64_t > & GetAllReserveKeys() const
bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override
Adds a key to the store, and saves it to disk.
void AddInactiveHDChain(const CHDChain &chain)
virtual unsigned int GetKeyPoolSize() const
Access to the wallet database.
Definition: walletdb.h:176
void WalletLogPrintf(std::string fmt, Params... parameters) const
Prepends the wallet name in logging output to ease debugging in multi-wallet use cases.
void MarkPreSplitKeys() EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
const std::vector< CScript > GetScriptPubKeys() const
int64_t GetOldestKeyPoolTime() const override
bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
virtual void KeepDestination(int64_t index, const OutputType &type)
unsigned int GetKeyPoolSize() const override
bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal)
Like TopUp() but adds keys for inactive HD chains.
bool IsHDEnabled() const override
virtual bool CanProvide(const CScript &script, SignatureData &sigdata)
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that...
int64_t nTime
The time at which the key was generated. Set in AddKeypoolPubKeyWithDB.
void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Update wallet first key creation time.
virtual uint256 GetID() const
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that...
bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const
Fetches a pubkey from mapWatchKeys if it exists there.
ScriptPubKeyMan(WalletStorage &storage)
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
Adds an encrypted key to the store, and saves it to disk.
virtual bool Upgrade(int prev_version, int new_version, bilingual_str &error)
Upgrades the wallet to the specified version.
bool AddWatchOnlyInMem(const CScript &dest)
virtual ~WalletStorage()=default
void MarkUnusedAddresses(const CScript &script) override
Mark unused addresses as being used.
static const unsigned int DEFAULT_KEYPOOL_SIZE
Default for -keypool.
CKeyPool()
Definition: wallet.cpp:2879
bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
bool TopUp(unsigned int size=0) override
Fills internal address pool.
virtual bool IsHDEnabled() const
An encapsulated public key.
Definition: pubkey.h:32
std::map< CKeyID, CPubKey > WatchKeyMap
Fillable signing provider that keeps keys in an address->secret map.
virtual void MarkUnusedAddresses(const CScript &script)
Mark unused addresses as being used.
Wraps a LegacyScriptPubKeyMan so that it can be returned in a new unique_ptr.
LegacySigningProvider(const LegacyScriptPubKeyMan &spk_man)
bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor, std::string &error)
void SetHDSeed(const CPubKey &key)
void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr) override
std::map< CScript, int32_t > ScriptPubKeyMap
virtual bool CheckDecryptionKey(const CKeyingMaterial &master_key, bool accept_no_keys=false)
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
DescriptorScriptPubKeyMan(WalletStorage &storage)
bool m_pre_split
Whether this key was generated for a keypool before the wallet was upgraded to HD-split.
bool GetKey(const CKeyID &address, CKey &keyOut) const override
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
Definition: standard.h:157
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
Definition: ismine.h:38
void MarkUnusedAddresses(const CScript &script) override
Mark unused addresses as being used.
Descriptor with some wallet metadata.
Definition: walletutil.h:75
bool SetupDescriptor(std::unique_ptr< Descriptor >desc)
Provide a descriptor at setup time Returns false if already setup or setup fails, true if setup is su...
bool AddKey(const CKeyID &key_id, const CKey &key)
virtual bool HavePrivateKeys() const
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:26
bool LoadWatchOnly(const CScript &dest)
Adds a watch-only address to the store, without saving it to disk (used by LoadWallet) ...
ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man)
bool ReserveKeyFromKeyPool(int64_t &nIndex, CKeyPool &keypool, bool fRequestedInternal)
Reserves a key from the keypool and sets nIndex to its index.
bool GetKeyFromPool(CPubKey &key, const OutputType type, bool internal=false)
Fetches a key from the keypool.
virtual bool IsLocked() const =0
bool HasWalletDescriptor(const WalletDescriptor &desc) const
bool HavePrivateKeys() const override
std::map< int64_t, CKeyID > m_index_to_reserved_key
void Serialize(Stream &s) const
bool AddCScript(const CScript &redeemScript) override
int64_t GetTimeFirstKey() const override
virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr)
256-bit opaque blob.
Definition: uint256.h:124
CPubKey vchPubKey
The public key.
bool LoadKey(const CKey &key, const CPubKey &pubkey)
Adds a key to the store, without saving it to disk (used by LoadWallet)
virtual bool GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool, std::string &error)
virtual bool CanSupportFeature(enum WalletFeature) const =0
void SetCache(const DescriptorCache &cache)
bool HaveWatchOnly() const
Returns whether there are any watch-only things in the wallet.
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > >> CryptedKeyMap
virtual std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const
An interface to be implemented by keystores that support signing.
WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore)
virtual bool TopUp(unsigned int size=0)
Fills internal address pool.
const CChainParams & Params()
Return the currently selected parameters.
Cache for single descriptor&#39;s derived extended pubkeys.
Definition: descriptor.h:19
bool GetNewDestination(const OutputType type, CTxDestination &dest, std::string &error) override
bool HaveKey(const CKeyID &address) const override
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:404
std::map< CPubKey, int32_t > PubKeyMap
void UpdateWalletDescriptor(WalletDescriptor &descriptor)
void AddHDChain(const CHDChain &chain)
bool GetDescriptorString(std::string &out) const
bool HaveCScript(const CScriptID &scriptid) const override
std::unique_ptr< FlatSigningProvider > GetSigningProvider(const CScript &script, bool include_private=false) const
void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool)
Load a keypool entry.
virtual SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const
Sign a message with the given script.
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:22
virtual bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch)
bool CheckDecryptionKey(const CKeyingMaterial &master_key, bool accept_no_keys=false) override
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
bool CanGetAddresses(bool internal=false) const override
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
TransactionError
Definition: error.h:22
virtual bool HaveCScript(const CScriptID &hash) const override
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 UpgradeKeyMetadata()
Upgrade stored CKeyMetadata objects to store key origin info as KeyOriginInfo.
CPubKey DeriveNewSeed(const CKey &key)
virtual isminetype IsMine(const CScript &script) const
TransactionError FillPSBT(PartiallySignedTransaction &psbt, const PrecomputedTransactionData &txdata, int sighash_type=1, bool sign=true, bool bip32derivs=false, int *n_signed=nullptr) const override
Adds script and derivation path information to a PSBT, and optionally signs it.
int64_t GetTimeFirstKey() const override
A reference to a CScript: the Hash160 of its serialization (see script.h)
Definition: standard.h:25
virtual bool HasEncryptionKeys() const =0
A mutable version of CTransaction.
Definition: transaction.h:344
bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, std::string > &input_errors) const override
Creates new signatures and adds them to the transaction.
void DeriveNewChildKey(WalletBatch &batch, CKeyMetadata &metadata, CKey &secret, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
virtual int64_t GetOldestKeyPoolTime() const
TransactionError FillPSBT(PartiallySignedTransaction &psbt, const PrecomputedTransactionData &txdata, int sighash_type=1, bool sign=true, bool bip32derivs=false, int *n_signed=nullptr) const override
Adds script and derivation path information to a PSBT, and optionally signs it.
bool SetupGeneration(bool force=false) override
Sets up the key generation stuff, i.e.
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
bool HavePrivateKeys() const override
std::map< CKeyID, CKey > KeyMap
void AddDescriptorKey(const CKey &key, const CPubKey &pubkey)
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
An encapsulated private key.
Definition: key.h:27
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool, std::string &error) override
bool AddDescriptorKeyWithDB(WalletBatch &batch, const CKey &key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
bool TopUp(unsigned int size=0) override
Fills internal address pool.
WalletStorage & m_storage
bool m_decryption_thoroughly_checked
keeps track of whether Unlock has run a thorough check before
virtual bool GetNewDestination(const OutputType type, CTxDestination &dest, std::string &error)
bool ImportPrivKeys(const std::map< CKeyID, CKey > &privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
#define LogPrintf(...)
Definition: logging.h:184
int64_t GetTime()
Return system time (or mocked time, if set)
Definition: time.cpp:26
void LoadHDChain(const CHDChain &chain)
Load a HD chain model (used by LoadWallet)
virtual bool SetupGeneration(bool force=false)
Sets up the key generation stuff, i.e.
bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override
virtual std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const
bool error(const char *fmt, const Args &... args)
Definition: system.h:49
bool AddCScriptWithDB(WalletBatch &batch, const CScript &script)
Adds a script to the store and saves it to disk.
virtual bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, std::string > &input_errors) const
Creates new signatures and adds them to the transaction.
bool fDecryptionThoroughlyChecked
keeps track of whether Unlock has run a thorough check before
bool fInternal
Whether this keypool entry is in the internal keypool (for change outputs)
bool SetupDescriptorGeneration(const CExtKey &master_key, OutputType addr_type, bool internal)
Setup descriptors based on the given CExtkey.
std::set< CKeyID > GetKeys() const override
isminetype IsMine(const CScript &script) const override
bool ImportScripts(const std::set< CScript > scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
virtual bool CanGetAddresses(bool internal=false) const
std::vector< CKeyID > GetAffectedKeys(const CScript &spk, const SigningProvider &provider)
std::map< CKeyID, int64_t > m_pool_key_to_index
A key from a CWallet&#39;s keypool.
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
An instance of this class represents one database.
Definition: db.h:103