Bitcoin Core  24.99.0
P2P Digital Currency
scriptpubkeyman.h
Go to the documentation of this file.
1 // Copyright (c) 2019-2021 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/result.h>
15 #include <util/time.h>
16 #include <wallet/crypter.h>
17 #include <wallet/ismine.h>
18 #include <wallet/walletdb.h>
19 #include <wallet/walletutil.h>
20 
21 #include <boost/signals2/signal.hpp>
22 
23 #include <optional>
24 #include <unordered_map>
25 
26 enum class OutputType;
27 struct bilingual_str;
28 
29 namespace wallet {
30 // Wallet storage things that ScriptPubKeyMans need in order to be able to store things to the wallet database.
31 // It provides access to things that are part of the entire wallet and not specific to a ScriptPubKeyMan such as
32 // wallet flags, wallet version, encryption keys, encryption status, and the database itself. This allows a
33 // ScriptPubKeyMan to have callbacks into CWallet without causing a circular dependency.
34 // WalletStorage should be the same for all ScriptPubKeyMans of a wallet.
36 {
37 public:
38  virtual ~WalletStorage() = default;
39  virtual const std::string GetDisplayName() const = 0;
40  virtual WalletDatabase& GetDatabase() const = 0;
41  virtual bool IsWalletFlagSet(uint64_t) const = 0;
42  virtual void UnsetBlankWalletFlag(WalletBatch&) = 0;
43  virtual bool CanSupportFeature(enum WalletFeature) const = 0;
44  virtual void SetMinVersion(enum WalletFeature, WalletBatch* = nullptr) = 0;
45  virtual const CKeyingMaterial& GetEncryptionKey() const = 0;
46  virtual bool HasEncryptionKeys() const = 0;
47  virtual bool IsLocked() const = 0;
48 };
49 
51 static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
52 
53 std::vector<CKeyID> GetAffectedKeys(const CScript& spk, const SigningProvider& provider);
54 
104 class CKeyPool
105 {
106 public:
108  int64_t nTime;
112  bool fInternal;
115 
116  CKeyPool();
117  CKeyPool(const CPubKey& vchPubKeyIn, bool internalIn);
118 
119  template<typename Stream>
120  void Serialize(Stream& s) const
121  {
122  int nVersion = s.GetVersion();
123  if (!(s.GetType() & SER_GETHASH)) {
124  s << nVersion;
125  }
126  s << nTime << vchPubKey << fInternal << m_pre_split;
127  }
128 
129  template<typename Stream>
130  void Unserialize(Stream& s)
131  {
132  int nVersion = s.GetVersion();
133  if (!(s.GetType() & SER_GETHASH)) {
134  s >> nVersion;
135  }
136  s >> nTime >> vchPubKey;
137  try {
138  s >> fInternal;
139  } catch (std::ios_base::failure&) {
140  /* flag as external address if we can't read the internal boolean
141  (this will be the case for any wallet before the HD chain split version) */
142  fInternal = false;
143  }
144  try {
145  s >> m_pre_split;
146  } catch (std::ios_base::failure&) {
147  /* flag as postsplit address if we can't read the m_pre_split boolean
148  (this will be the case for any wallet that upgrades to HD chain split) */
149  m_pre_split = false;
150  }
151  }
152 };
153 
155 {
157  std::optional<bool> internal;
158 };
159 
160 /*
161  * A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
162  * It contains the scripts and keys related to the scriptPubKeys it manages.
163  * A ScriptPubKeyMan will be able to give out scriptPubKeys to be used, as well as marking
164  * when a scriptPubKey has been used. It also handles when and how to store a scriptPubKey
165  * and its related scripts and keys, including encryption.
166  */
168 {
169 protected:
171 
172 public:
173  explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
174  virtual ~ScriptPubKeyMan() {};
175  virtual util::Result<CTxDestination> GetNewDestination(const OutputType type) { return util::Error{Untranslated("Not supported")}; }
176  virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
177 
179  virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) { return false; }
180  virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
181 
182  virtual util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) { return util::Error{Untranslated("Not supported")}; }
183  virtual void KeepDestination(int64_t index, const OutputType& type) {}
184  virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
185 
190  virtual bool TopUp(unsigned int size = 0) { return false; }
191 
199  virtual std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) { return {}; }
200 
205  virtual bool SetupGeneration(bool force = false) { return false; }
206 
207  /* Returns true if HD is enabled */
208  virtual bool IsHDEnabled() const { return false; }
209 
210  /* Returns true if the wallet can give out new addresses. This means it has keys in the keypool or can generate new keys */
211  virtual bool CanGetAddresses(bool internal = false) const { return false; }
212 
214  virtual bool Upgrade(int prev_version, int new_version, bilingual_str& error) { return true; }
215 
216  virtual bool HavePrivateKeys() const { return false; }
217 
219  virtual void RewriteDB() {}
220 
221  virtual std::optional<int64_t> GetOldestKeyPoolTime() const { return GetTime(); }
222 
223  virtual unsigned int GetKeyPoolSize() const { return 0; }
224 
225  virtual int64_t GetTimeFirstKey() const { return 0; }
226 
227  virtual std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const { return nullptr; }
228 
229  virtual std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const { return nullptr; }
230 
234  virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
235 
237  virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const { return false; }
239  virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
241  virtual TransactionError 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 TransactionError::INVALID_PSBT; }
242 
243  virtual uint256 GetID() const { return uint256(); }
244 
246  virtual const std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const { return {}; };
247 
249  template<typename... Params>
250  void WalletLogPrintf(std::string fmt, Params... parameters) const {
251  LogPrintf(("%s " + fmt).c_str(), m_storage.GetDisplayName(), parameters...);
252  };
253 
255  boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
256 
258  boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
259 };
260 
262 static const std::unordered_set<OutputType> LEGACY_OUTPUT_TYPES {
266 };
267 
268 class DescriptorScriptPubKeyMan;
269 
271 {
272 private:
275 
276  using WatchOnlySet = std::set<CScript>;
277  using WatchKeyMap = std::map<CKeyID, CPubKey>;
278 
279  WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
280 
281  using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
282 
286 
287  int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = 0;
288 
289  bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
290  bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
291 
303  bool AddWatchOnlyInMem(const CScript &dest);
305  bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript& dest, int64_t create_time) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
306 
308  bool AddKeyPubKeyWithDB(WalletBatch &batch,const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
309 
310  void AddKeypoolPubkeyWithDB(const CPubKey& pubkey, const bool internal, WalletBatch& batch);
311 
313  bool AddCScriptWithDB(WalletBatch& batch, const CScript& script);
314 
316  bool AddKeyOriginWithDB(WalletBatch& batch, const CPubKey& pubkey, const KeyOriginInfo& info);
317 
318  /* the HD chain data model (external chain counters) */
320  std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
321 
322  /* HD derive new child key (on internal or external chain) */
323  void DeriveNewChildKey(WalletBatch& batch, CKeyMetadata& metadata, CKey& secret, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
324 
325  std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
326  std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
327  std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
328  int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
330  // Tracks keypool indexes to CKeyIDs of keys that have been taken out of the keypool but may be returned to it
332 
334  bool GetKeyFromPool(CPubKey &key, const OutputType type, bool internal = false);
335 
350  bool ReserveKeyFromKeyPool(int64_t& nIndex, CKeyPool& keypool, bool fRequestedInternal);
351 
362  bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal);
363 
364  bool TopUpChain(CHDChain& chain, unsigned int size);
365 public:
367 
368  util::Result<CTxDestination> GetNewDestination(const OutputType type) override;
369  isminetype IsMine(const CScript& script) const override;
370 
371  bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
372  bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
373 
374  util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) override;
375  void KeepDestination(int64_t index, const OutputType& type) override;
376  void ReturnDestination(int64_t index, bool internal, const CTxDestination&) override;
377 
378  bool TopUp(unsigned int size = 0) override;
379 
380  std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
381 
383  void UpgradeKeyMetadata();
384 
385  bool IsHDEnabled() const override;
386 
387  bool SetupGeneration(bool force = false) override;
388 
389  bool Upgrade(int prev_version, int new_version, bilingual_str& error) override;
390 
391  bool HavePrivateKeys() const override;
392 
393  void RewriteDB() override;
394 
395  std::optional<int64_t> GetOldestKeyPoolTime() const override;
396  size_t KeypoolCountExternalKeys() const;
397  unsigned int GetKeyPoolSize() const override;
398 
399  int64_t GetTimeFirstKey() const override;
400 
401  std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
402 
403  bool CanGetAddresses(bool internal = false) const override;
404 
405  std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
406 
407  bool CanProvide(const CScript& script, SignatureData& sigdata) override;
408 
409  bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
410  SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
411  TransactionError 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;
412 
413  uint256 GetID() const override;
414 
415  // Map from Key ID to key metadata.
416  std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
417 
418  // Map from Script ID to key metadata (for watch-only keys).
419  std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
420 
422  bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override;
424  bool LoadKey(const CKey& key, const CPubKey &pubkey);
426  bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
428  bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
429  void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
431  bool LoadCScript(const CScript& redeemScript);
433  void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
434  void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
436  CPubKey GenerateNewKey(WalletBatch& batch, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
437 
438  /* Set the HD chain model (chain child index counters) and writes it to the database */
439  void AddHDChain(const CHDChain& chain);
441  void LoadHDChain(const CHDChain& chain);
442  const CHDChain& GetHDChain() const { return m_hd_chain; }
443  void AddInactiveHDChain(const CHDChain& chain);
444 
446  bool LoadWatchOnly(const CScript &dest);
448  bool HaveWatchOnly(const CScript &dest) const;
450  bool HaveWatchOnly() const;
452  bool RemoveWatchOnly(const CScript &dest);
453  bool AddWatchOnly(const CScript& dest, int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
454 
456  bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
457 
458  /* SigningProvider overrides */
459  bool HaveKey(const CKeyID &address) const override;
460  bool GetKey(const CKeyID &address, CKey& keyOut) const override;
461  bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
462  bool AddCScript(const CScript& redeemScript) override;
463  bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
464 
466  void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
467  bool NewKeyPool();
469 
470  bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
471  bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
472  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);
473  bool ImportScriptPubKeys(const std::set<CScript>& script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
474 
475  /* Returns true if the wallet can generate new keys */
476  bool CanGenerateKeys() const;
477 
478  /* Generates a new HD seed (will not be activated) */
480 
481  /* Derives a new HD seed (will not be activated) */
482  CPubKey DeriveNewSeed(const CKey& key);
483 
484  /* Set the current HD seed (will reset the chain child index counters)
485  Sets the seed's version based on the current wallet version (so the
486  caller must ensure the current wallet version is correct before calling
487  this function). */
488  void SetHDSeed(const CPubKey& key);
489 
496  void LearnRelatedScripts(const CPubKey& key, OutputType);
497 
502  void LearnAllRelatedScripts(const CPubKey& key);
503 
512  const std::map<CKeyID, int64_t>& GetAllReserveKeys() const { return m_pool_key_to_index; }
513 
514  std::set<CKeyID> GetKeys() const override;
515  const std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
516 
519  std::optional<MigrationData> MigrateToDescriptor();
521  bool DeleteRecords();
522 };
523 
526 {
527 private:
529 public:
530  explicit LegacySigningProvider(const LegacyScriptPubKeyMan& spk_man) : m_spk_man(spk_man) {}
531 
532  bool GetCScript(const CScriptID &scriptid, CScript& script) const override { return m_spk_man.GetCScript(scriptid, script); }
533  bool HaveCScript(const CScriptID &scriptid) const override { return m_spk_man.HaveCScript(scriptid); }
534  bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const override { return m_spk_man.GetPubKey(address, pubkey); }
535  bool GetKey(const CKeyID &address, CKey& key) const override { return false; }
536  bool HaveKey(const CKeyID &address) const override { return false; }
537  bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override { return m_spk_man.GetKeyOrigin(keyid, info); }
538 };
539 
541 {
542 private:
543  using ScriptPubKeyMap = std::map<CScript, int32_t>; // Map of scripts to descriptor range index
544  using PubKeyMap = std::map<CPubKey, int32_t>; // Map of pubkeys involved in scripts to descriptor range index
545  using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
546  using KeyMap = std::map<CKeyID, CKey>;
547 
548  ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
550  int32_t m_max_cached_index = -1;
551 
553  CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man);
554 
557 
558  bool AddDescriptorKeyWithDB(WalletBatch& batch, const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
559 
561 
562  // Cached FlatSigningProviders to avoid regenerating them each time they are needed.
564  // Fetch the SigningProvider for the given script and optionally include private keys
565  std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CScript& script, bool include_private = false) const;
566  // Fetch the SigningProvider for the given pubkey and always include private keys. This should only be called by signing code.
567  std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CPubKey& pubkey) const;
568  // Fetch the SigningProvider for a given index and optionally include private keys. Called by the above functions.
569  std::unique_ptr<FlatSigningProvider> GetSigningProvider(int32_t index, bool include_private = false) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
570 
571 protected:
573 
574 public:
576  : ScriptPubKeyMan(storage),
577  m_wallet_descriptor(descriptor)
578  {}
580  : ScriptPubKeyMan(storage)
581  {}
582 
584 
586  isminetype IsMine(const CScript& script) const override;
587 
588  bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
589  bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
590 
591  util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) override;
592  void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
593 
594  // Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
595  // and is used to expand the descriptor in GetNewDestination. DescriptorScriptPubKeyMan relies
596  // more on ephemeral data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
597  // (with or without private keys), the "keypool" is a single xpub.
598  bool TopUp(unsigned int size = 0) override;
599 
600  std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
601 
602  bool IsHDEnabled() const override;
603 
605  bool SetupDescriptorGeneration(const CExtKey& master_key, OutputType addr_type, bool internal);
606 
610  bool SetupDescriptor(std::unique_ptr<Descriptor>desc);
611 
612  bool HavePrivateKeys() const override;
613 
614  std::optional<int64_t> GetOldestKeyPoolTime() const override;
615  unsigned int GetKeyPoolSize() const override;
616 
617  int64_t GetTimeFirstKey() const override;
618 
619  std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
620 
621  bool CanGetAddresses(bool internal = false) const override;
622 
623  std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
624 
625  bool CanProvide(const CScript& script, SignatureData& sigdata) override;
626 
627  bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
628  SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
629  TransactionError 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;
630 
631  uint256 GetID() const override;
632 
633  void SetCache(const DescriptorCache& cache);
634 
635  bool AddKey(const CKeyID& key_id, const CKey& key);
636  bool AddCryptedKey(const CKeyID& key_id, const CPubKey& pubkey, const std::vector<unsigned char>& crypted_key);
637 
638  bool HasWalletDescriptor(const WalletDescriptor& desc) const;
639  void UpdateWalletDescriptor(WalletDescriptor& descriptor);
640  bool CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error);
641  void AddDescriptorKey(const CKey& key, const CPubKey &pubkey);
642  void WriteDescriptor();
643 
645  const std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
646 
647  bool GetDescriptorString(std::string& out, const bool priv) const;
648 
649  void UpgradeDescriptorCache();
650 };
651 } // namespace wallet
652 
653 #endif // BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
const CChainParams & Params()
Return the currently selected parameters.
An encapsulated private key.
Definition: key.h:27
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:24
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:35
An encapsulated public key.
Definition: pubkey.h:34
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:411
A reference to a CScript: the Hash160 of its serialization (see script.h)
Definition: standard.h:27
A UTXO entry.
Definition: coins.h:31
Cache for single descriptor's derived extended pubkeys.
Definition: descriptor.h:19
Fillable signing provider that keeps keys in an address->secret map.
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const override
virtual bool HaveCScript(const CScriptID &hash) const override
RecursiveMutex cs_KeyStore
An interface to be implemented by keystores that support signing.
256-bit opaque blob.
Definition: uint256.h:119
A key from a CWallet's keypool.
void Unserialize(Stream &s)
int64_t nTime
The time at which the key was generated. Set in AddKeypoolPubKeyWithDB.
CPubKey vchPubKey
The public key.
void Serialize(Stream &s) const
bool fInternal
Whether this keypool entry is in the internal keypool (for change outputs)
bool m_pre_split
Whether this key was generated for a keypool before the wallet was upgraded to HD-split.
KeyMap GetKeys() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
bool SetupDescriptorGeneration(const CExtKey &master_key, OutputType addr_type, bool internal)
Setup descriptors based on the given CExtkey.
void SetCache(const DescriptorCache &cache)
std::map< int32_t, FlatSigningProvider > m_map_signing_providers
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
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.
std::map< CScript, int32_t > ScriptPubKeyMap
DescriptorScriptPubKeyMan(WalletStorage &storage)
const WalletDescriptor GetWalletDescriptor() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey, const std::vector< unsigned char > &crypted_key)
bool TopUp(unsigned int size=0) override
Fills internal address pool.
bool m_decryption_thoroughly_checked
keeps track of whether Unlock has run a thorough check before
std::map< CKeyID, CKey > KeyMap
unsigned int GetKeyPoolSize() const override
int64_t GetTimeFirstKey() const override
std::unique_ptr< FlatSigningProvider > GetSigningProvider(const CScript &script, bool include_private=false) const
std::map< CPubKey, int32_t > PubKeyMap
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 CanGetAddresses(bool internal=false) const override
ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man)
bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor, std::string &error)
bool GetDescriptorString(std::string &out, const bool priv) const
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool) override
const std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const override
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
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...
void AddDescriptorKey(const CKey &key, const CPubKey &pubkey)
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
bool AddKey(const CKeyID &key_id, const CKey &key)
PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man)
void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr) 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...
CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man)
bool AddDescriptorKeyWithDB(WalletBatch &batch, const CKey &key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
bool HasWalletDescriptor(const WalletDescriptor &desc) const
void UpdateWalletDescriptor(WalletDescriptor &descriptor)
std::optional< int64_t > GetOldestKeyPoolTime() const override
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
util::Result< CTxDestination > GetNewDestination(const OutputType type) override
TransactionError 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.
isminetype IsMine(const CScript &script) const override
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > >> CryptedKeyMap
KeyMap m_map_keys GUARDED_BY(cs_desc_man)
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
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.
bool DeleteRecords()
Delete all the records ofthis LegacyScriptPubKeyMan from disk.
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
bool CanGetAddresses(bool internal=false) const override
bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override
Adds a key to the store, and saves it to disk.
util::Result< CTxDestination > GetNewDestination(const OutputType type) override
WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore)
util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool) override
void AddInactiveHDChain(const CHDChain &chain)
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
void AddHDChain(const CHDChain &chain)
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 AddCScriptWithDB(WalletBatch &batch, const CScript &script)
Adds a script to the store and saves it to disk.
std::unordered_map< CKeyID, CHDChain, SaltedSipHasher > m_inactive_hd_chains
bool GetKey(const CKeyID &address, CKey &keyOut) const override
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > >> CryptedKeyMap
bool AddKeyOriginWithDB(WalletBatch &batch, const CPubKey &pubkey, const KeyOriginInfo &info)
Add a KeyOriginInfo to the wallet.
void MarkPreSplitKeys() EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
uint256 GetID() const override
bool AddWatchOnlyInMem(const CScript &dest)
bool HaveWatchOnly() const
Returns whether there are any watch-only things in the wallet.
std::map< CKeyID, CPubKey > WatchKeyMap
void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata)
Load metadata (used by LoadWallet)
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 CHDChain & GetHDChain() const
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
Adds an encrypted key to the store, and saves it to disk.
bool ReserveKeyFromKeyPool(int64_t &nIndex, CKeyPool &keypool, bool fRequestedInternal)
Reserves a key from the keypool and sets nIndex to its index.
void AddKeypoolPubkeyWithDB(const CPubKey &pubkey, const bool internal, WalletBatch &batch)
std::map< int64_t, CKeyID > m_index_to_reserved_key
bool fDecryptionThoroughlyChecked
keeps track of whether Unlock has run a thorough check before
bool ImportScripts(const std::set< CScript > scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
void UpgradeKeyMetadata()
Upgrade stored CKeyMetadata objects to store key origin info as KeyOriginInfo.
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...
bool HavePrivateKeys() const override
std::set< CScript > WatchOnlySet
void LoadScriptMetadata(const CScriptID &script_id, const CKeyMetadata &metadata)
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
TransactionError 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.
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 LoadKey(const CKey &key, const CPubKey &pubkey)
Adds a key to the store, without saving it to disk (used by LoadWallet)
void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Update wallet first key creation time.
bool TopUp(unsigned int size=0) override
Fills internal address pool.
unsigned int GetKeyPoolSize() const override
bool LoadWatchOnly(const CScript &dest)
Adds a watch-only address to the store, without saving it to disk (used by LoadWallet)
bool TopUpChain(CHDChain &chain, unsigned int size)
void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool)
Load a keypool entry.
bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal)
Like TopUp() but adds keys for inactive HD chains.
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
void LoadHDChain(const CHDChain &chain)
Load a HD chain model (used by LoadWallet)
std::set< CKeyID > GetKeys() const override
bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey)
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 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)
bool IsHDEnabled() const override
bool GetKeyFromPool(CPubKey &key, const OutputType type, bool internal=false)
Fetches a key from the keypool.
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 GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const
Fetches a pubkey from mapWatchKeys if it exists there.
isminetype IsMine(const CScript &script) const override
bool AddCScript(const CScript &redeemScript) override
int64_t GetTimeFirstKey() const override
const std::map< CKeyID, int64_t > & GetAllReserveKeys() const
bool NewKeyPool()
Mark old keypool keys as used, and generate all new keys.
CryptedKeyMap mapCryptedKeys GUARDED_BY(cs_KeyStore)
bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override
bool SetupGeneration(bool force=false) override
Sets up the key generation stuff, i.e.
void LearnRelatedScripts(const CPubKey &key, OutputType)
Explicitly make the wallet learn the related scripts for outputs to the given key.
WatchKeyMap mapWatchKeys GUARDED_BY(cs_KeyStore)
void LearnAllRelatedScripts(const CPubKey &key)
Same as LearnRelatedScripts, but when the OutputType is not known (and could be anything).
CPubKey DeriveNewSeed(const CKey &key)
std::optional< MigrationData > MigrateToDescriptor()
Get the DescriptorScriptPubKeyMans (with private keys) that have the same scriptPubKeys as this Legac...
int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore)=0
void DeriveNewChildKey(WalletBatch &batch, CKeyMetadata &metadata, CKey &secret, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
bool LoadCScript(const CScript &redeemScript)
Adds a CScript to the store.
void ReturnDestination(int64_t index, bool internal, const CTxDestination &) override
std::map< CKeyID, int64_t > m_pool_key_to_index
CPubKey GenerateNewKey(WalletBatch &batch, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Generate a new key.
void SetHDSeed(const CPubKey &key)
bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
const std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const override
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
bool ImportPrivKeys(const std::map< CKeyID, CKey > &privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
bool Upgrade(int prev_version, int new_version, bilingual_str &error) override
Upgrades the wallet to the specified version.
void KeepDestination(int64_t index, const OutputType &type) override
void RewriteDB() override
The action to do when the DB needs rewrite.
std::optional< int64_t > GetOldestKeyPoolTime() const override
bool RemoveWatchOnly(const CScript &dest)
Remove a watch only script from the keystore.
WatchOnlySet setWatchOnly GUARDED_BY(cs_KeyStore)
bool HaveKey(const CKeyID &address) const override
bool ImportScriptPubKeys(const std::set< CScript > &script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Wraps a LegacyScriptPubKeyMan so that it can be returned in a new unique_ptr.
bool HaveKey(const CKeyID &address) const override
bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const override
bool GetKey(const CKeyID &address, CKey &key) const override
bool HaveCScript(const CScriptID &scriptid) const override
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
LegacySigningProvider(const LegacyScriptPubKeyMan &spk_man)
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
const LegacyScriptPubKeyMan & m_spk_man
virtual uint256 GetID() const
virtual unsigned int GetKeyPoolSize() const
virtual TransactionError 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.
virtual int64_t GetTimeFirstKey() const
virtual bool TopUp(unsigned int size=0)
Fills internal address pool.
virtual std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const
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...
virtual void KeepDestination(int64_t index, const OutputType &type)
virtual bool Upgrade(int prev_version, int new_version, bilingual_str &error)
Upgrades the wallet to the specified version.
boost::signals2::signal< void(bool fHaveWatchOnly)> NotifyWatchonlyChanged
Watch-only address added.
virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr)
ScriptPubKeyMan(WalletStorage &storage)
virtual SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const
Sign a message with the given script.
virtual std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const
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...
virtual void RewriteDB()
The action to do when the DB needs rewrite.
virtual isminetype IsMine(const CScript &script) const
void WalletLogPrintf(std::string fmt, Params... parameters) const
Prepends the wallet name in logging output to ease debugging in multi-wallet use cases.
virtual util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool)
virtual std::optional< int64_t > GetOldestKeyPoolTime() const
virtual util::Result< CTxDestination > GetNewDestination(const OutputType type)
virtual bool HavePrivateKeys() const
virtual bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch)
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.
virtual const std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
virtual bool CanProvide(const CScript &script, SignatureData &sigdata)
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
virtual bool SetupGeneration(bool force=false)
Sets up the key generation stuff, i.e.
boost::signals2::signal< void()> NotifyCanGetAddressesChanged
Keypool has new keys.
virtual bool IsHDEnabled() const
virtual bool CanGetAddresses(bool internal=false) const
WalletStorage & m_storage
Access to the wallet database.
Definition: walletdb.h:188
An instance of this class represents one database.
Definition: db.h:106
Descriptor with some wallet metadata.
Definition: walletutil.h:77
virtual bool IsWalletFlagSet(uint64_t) const =0
virtual void SetMinVersion(enum WalletFeature, WalletBatch *=nullptr)=0
virtual bool CanSupportFeature(enum WalletFeature) const =0
virtual const CKeyingMaterial & GetEncryptionKey() const =0
virtual WalletDatabase & GetDatabase() const =0
virtual void UnsetBlankWalletFlag(WalletBatch &)=0
virtual bool IsLocked() const =0
virtual const std::string GetDisplayName() const =0
virtual ~WalletStorage()=default
virtual bool HasEncryptionKeys() const =0
TransactionError
Definition: error.h:22
@ SIGHASH_DEFAULT
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
Definition: interpreter.h:33
#define LogPrintf(...)
Definition: logging.h:234
SigningResult
Definition: message.h:43
Definition: overloaded.h:8
Definition: node.h:39
std::vector< unsigned char, secure_allocator< unsigned char > > CKeyingMaterial
Definition: crypter.h:62
std::vector< CKeyID > GetAffectedKeys(const CScript &spk, const SigningProvider &provider)
static const unsigned int DEFAULT_KEYPOOL_SIZE
Default for -keypool.
static const std::unordered_set< OutputType > LEGACY_OUTPUT_TYPES
OutputTypes supported by the LegacyScriptPubKeyMan.
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
Definition: ismine.h:41
@ ISMINE_NO
Definition: ismine.h:42
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:16
OutputType
Definition: outputtype.h:17
@ SER_GETHASH
Definition: serialize.h:133
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
Definition: standard.h:149
Definition: key.h:161
A mutable version of CTransaction.
Definition: transaction.h:373
A version of CTransaction with the PSBT format.
Definition: psbt.h:952
Bilingual messages:
Definition: translation.h:18
bool error(const char *fmt, const Args &... args)
Definition: system.h:48
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
int64_t GetTime()
Definition: time.cpp:115
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:48