Bitcoin ABC  0.29.4
P2P Digital Currency
scriptpubkeyman.h
Go to the documentation of this file.
1 // Copyright (c) 2019 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 class CChainParams;
26 struct bilingual_str;
27 
28 // Wallet storage things that ScriptPubKeyMans need in order to be able to store
29 // things to the wallet database. It provides access to things that are part of
30 // the entire wallet and not specific to a ScriptPubKeyMan such as wallet flags,
31 // wallet version, encryption keys, encryption status, and the database itself.
32 // This allows a ScriptPubKeyMan to have callbacks into CWallet without causing
33 // a circular dependency. WalletStorage should be the same for all
34 // ScriptPubKeyMans of a wallet.
36 public:
37  virtual ~WalletStorage() = default;
38  virtual const std::string GetDisplayName() const = 0;
39  virtual WalletDatabase &GetDatabase() = 0;
40  virtual const CChainParams &GetChainParams() 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,
45  bool = false) = 0;
46  virtual const CKeyingMaterial &GetEncryptionKey() const = 0;
47  virtual bool HasEncryptionKeys() const = 0;
48  virtual bool IsLocked() const = 0;
49 };
50 
52 static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
53 
54 std::vector<CKeyID> GetAffectedKeys(const CScript &spk,
55  const SigningProvider &provider);
56 
107 class CKeyPool {
108 public:
110  int64_t nTime;
115  bool fInternal;
119 
120  CKeyPool();
121  CKeyPool(const CPubKey &vchPubKeyIn, bool internalIn);
122 
123  template <typename Stream> void Serialize(Stream &s) const {
124  int nVersion = s.GetVersion();
125  if (!(s.GetType() & SER_GETHASH)) {
126  s << nVersion;
127  }
128  s << nTime << vchPubKey << fInternal << m_pre_split;
129  }
130 
131  template <typename Stream> void Unserialize(Stream &s) {
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 &) {
145  fInternal = false;
146  }
147  try {
148  s >> m_pre_split;
149  } catch (std::ios_base::failure &) {
155  m_pre_split = false;
156  }
157  }
158 };
159 
169 protected:
171 
172 public:
173  explicit ScriptPubKeyMan(WalletStorage &storage) : m_storage(storage) {}
174  virtual ~ScriptPubKeyMan(){};
175  virtual bool GetNewDestination(const OutputType type, CTxDestination &dest,
176  std::string &error) {
177  return false;
178  }
179  virtual isminetype IsMine(const CScript &script) const { return ISMINE_NO; }
180 
183  virtual bool CheckDecryptionKey(const CKeyingMaterial &master_key,
184  bool accept_no_keys = false) {
185  return false;
186  }
187  virtual bool Encrypt(const CKeyingMaterial &master_key,
188  WalletBatch *batch) {
189  return false;
190  }
191 
192  virtual bool GetReservedDestination(const OutputType type, bool internal,
193  CTxDestination &address, int64_t &index,
194  CKeyPool &keypool) {
195  return false;
196  }
197  virtual void KeepDestination(int64_t index, const OutputType &type) {}
198  virtual void ReturnDestination(int64_t index, bool internal,
199  const CTxDestination &addr) {}
200 
208  virtual bool TopUp(unsigned int size = 0) { return false; }
209 
211  virtual void MarkUnusedAddresses(const CScript &script) {}
212 
219  virtual bool SetupGeneration(bool force = false) { return false; }
220 
221  /* Returns true if HD is enabled */
222  virtual bool IsHDEnabled() const { return false; }
223 
228  virtual bool CanGetAddresses(bool internal = false) const { return false; }
229 
231  virtual bool Upgrade(int prev_version, bilingual_str &error) {
232  return false;
233  }
234 
235  virtual bool HavePrivateKeys() const { return false; }
236 
238  virtual void RewriteDB() {}
239 
240  virtual int64_t GetOldestKeyPoolTime() const { return GetTime(); }
241 
242  virtual size_t KeypoolCountExternalKeys() const { return 0; }
243  virtual unsigned int GetKeyPoolSize() const { return 0; }
244 
245  virtual int64_t GetTimeFirstKey() const { return 0; }
246 
247  virtual std::unique_ptr<CKeyMetadata>
248  GetMetadata(const CTxDestination &dest) const {
249  return nullptr;
250  }
251 
252  virtual std::unique_ptr<SigningProvider>
253  GetSolvingProvider(const CScript &script) const {
254  return nullptr;
255  }
256 
262  virtual bool CanProvide(const CScript &script, SignatureData &sigdata) {
263  return false;
264  }
265 
270  virtual bool
272  const std::map<COutPoint, Coin> &coins, SigHashType sighash,
273  std::map<int, std::string> &input_errors) const {
274  return false;
275  }
277  virtual SigningResult SignMessage(const std::string &message,
278  const PKHash &pkhash,
279  std::string &str_sig) const {
281  };
286  virtual TransactionError
288  SigHashType sighash_type = SigHashType().withForkId(),
289  bool sign = true, bool bip32derivs = false) const {
291  }
292 
293  virtual uint256 GetID() const { return uint256(); }
294 
295  virtual void SetInternal(bool internal) {}
296 
301  template <typename... Params>
302  void WalletLogPrintf(std::string fmt, Params... parameters) const {
303  LogPrintf(("%s " + fmt).c_str(), m_storage.GetDisplayName(),
304  parameters...);
305  };
306 
308  boost::signals2::signal<void(bool fHaveWatchOnly)> NotifyWatchonlyChanged;
309 
311  boost::signals2::signal<void()> NotifyCanGetAddressesChanged;
312 };
313 
315  public FillableSigningProvider {
316 private:
319 
320  using WatchOnlySet = std::set<CScript>;
321  using WatchKeyMap = std::map<CKeyID, CPubKey>;
322 
323  WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
324 
326  std::map<CKeyID, std::pair<CPubKey, std::vector<uint8_t>>>;
327 
331 
332  int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = 0;
333 
334  bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey);
335  bool AddCryptedKeyInner(const CPubKey &vchPubKey,
336  const std::vector<uint8_t> &vchCryptedSecret);
337 
347  bool AddWatchOnly(const CScript &dest)
349  bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest)
351  bool AddWatchOnlyInMem(const CScript &dest);
353  bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest,
354  int64_t create_time)
356 
358  bool AddKeyPubKeyWithDB(WalletBatch &batch, const CKey &key,
359  const CPubKey &pubkey)
361 
362  void AddKeypoolPubkeyWithDB(const CPubKey &pubkey, const bool internal,
363  WalletBatch &batch);
364 
366  bool AddCScriptWithDB(WalletBatch &batch, const CScript &script);
367 
369  bool AddKeyOriginWithDB(WalletBatch &batch, const CPubKey &pubkey,
370  const KeyOriginInfo &info);
371 
372  /* the HD chain data model (external chain counters) */
374  std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
375 
376  /* HD derive new child key (on internal or external chain) */
377  void DeriveNewChildKey(WalletBatch &batch, CKeyMetadata &metadata,
378  CKey &secret, CHDChain &hd_chain,
379  bool internal = false)
381 
382  std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
383  std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
384  std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
385  int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
387  // Tracks keypool indexes to CKeyIDs of keys that have been taken out of the
388  // keypool but may be returned to it
390 
392  bool GetKeyFromPool(CPubKey &key, const OutputType type,
393  bool internal = false);
394 
409  bool ReserveKeyFromKeyPool(int64_t &nIndex, CKeyPool &keypool,
410  bool fRequestedInternal);
411 
425  bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index,
426  bool internal);
427 
428 public:
430 
431  bool GetNewDestination(const OutputType type, CTxDestination &dest,
432  std::string &error) override;
433  isminetype IsMine(const CScript &script) const override;
434 
435  bool CheckDecryptionKey(const CKeyingMaterial &master_key,
436  bool accept_no_keys = false) override;
437  bool Encrypt(const CKeyingMaterial &master_key,
438  WalletBatch *batch) override;
439 
440  bool GetReservedDestination(const OutputType type, bool internal,
441  CTxDestination &address, int64_t &index,
442  CKeyPool &keypool) override;
443  void KeepDestination(int64_t index, const OutputType &type) override;
444  void ReturnDestination(int64_t index, bool internal,
445  const CTxDestination &) override;
446 
447  bool TopUp(unsigned int size = 0) override;
448 
449  void MarkUnusedAddresses(const CScript &script) override;
450 
453  void UpgradeKeyMetadata();
454 
455  bool IsHDEnabled() const override;
456 
457  bool SetupGeneration(bool force = false) override;
458 
459  bool Upgrade(int prev_version, bilingual_str &error) override;
460 
461  bool HavePrivateKeys() const override;
462 
463  void RewriteDB() override;
464 
465  int64_t GetOldestKeyPoolTime() const override;
466  size_t KeypoolCountExternalKeys() const override;
467  unsigned int GetKeyPoolSize() const override;
468 
469  int64_t GetTimeFirstKey() const override;
470 
471  std::unique_ptr<CKeyMetadata>
472  GetMetadata(const CTxDestination &dest) const override;
473 
474  bool CanGetAddresses(bool internal = false) const override;
475 
476  std::unique_ptr<SigningProvider>
477  GetSolvingProvider(const CScript &script) const override;
478 
479  bool CanProvide(const CScript &script, SignatureData &sigdata) override;
480 
481  bool
483  const std::map<COutPoint, Coin> &coins, SigHashType sighash,
484  std::map<int, std::string> &input_errors) const override;
485  SigningResult SignMessage(const std::string &message, const PKHash &pkhash,
486  std::string &str_sig) const override;
489  SigHashType sighash_type = SigHashType().withForkId(),
490  bool sign = true, bool bip32derivs = false) const override;
491 
492  uint256 GetID() const override;
493 
494  void SetInternal(bool internal) override;
495 
496  // Map from Key ID to key metadata.
497  std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
498 
499  // Map from Script ID to key metadata (for watch-only keys).
500  std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
501 
503  bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override;
505  bool LoadKey(const CKey &key, const CPubKey &pubkey);
507  bool AddCryptedKey(const CPubKey &vchPubKey,
508  const std::vector<uint8_t> &vchCryptedSecret);
511  bool LoadCryptedKey(const CPubKey &vchPubKey,
512  const std::vector<uint8_t> &vchCryptedSecret,
513  bool checksum_valid);
514  void UpdateTimeFirstKey(int64_t nCreateTime)
517  bool LoadCScript(const CScript &redeemScript);
519  void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata);
520  void LoadScriptMetadata(const CScriptID &script_id,
521  const CKeyMetadata &metadata);
523  CPubKey GenerateNewKey(WalletBatch &batch, CHDChain &hd_chain,
524  bool internal = false)
526 
531  void AddHDChain(const CHDChain &chain);
533  void LoadHDChain(const CHDChain &chain);
534  const CHDChain &GetHDChain() const { return m_hd_chain; }
535  void AddInactiveHDChain(const CHDChain &chain);
536 
539  bool LoadWatchOnly(const CScript &dest);
541  bool HaveWatchOnly(const CScript &dest) const;
543  bool HaveWatchOnly() const;
545  bool RemoveWatchOnly(const CScript &dest);
546  bool AddWatchOnly(const CScript &dest, int64_t nCreateTime)
548 
550  bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
551 
552  /* SigningProvider overrides */
553  bool HaveKey(const CKeyID &address) const override;
554  bool GetKey(const CKeyID &address, CKey &keyOut) const override;
555  bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override;
556  bool AddCScript(const CScript &redeemScript) override;
557  bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override;
558 
560  void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
561  bool NewKeyPool();
563 
564  bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp)
566  bool ImportPrivKeys(const std::map<CKeyID, CKey> &privkey_map,
567  const int64_t timestamp)
569  bool ImportPubKeys(
570  const std::vector<CKeyID> &ordered_pubkeys,
571  const std::map<CKeyID, CPubKey> &pubkey_map,
572  const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> &key_origins,
573  const bool add_keypool, const bool internal, const int64_t timestamp)
575  bool ImportScriptPubKeys(const std::set<CScript> &script_pub_keys,
576  const bool have_solving_data,
577  const int64_t timestamp)
579 
580  /* Returns true if the wallet can generate new keys */
581  bool CanGenerateKeys() const;
582 
583  /* Generates a new HD seed (will not be activated) */
585 
586  /* Derives a new HD seed (will not be activated) */
587  CPubKey DeriveNewSeed(const CKey &key);
588 
589  /* Set the current HD seed (will reset the chain child index counters)
590  Sets the seed's version based on the current wallet version (so the
591  caller must ensure the current wallet version is correct before calling
592  this function). */
593  void SetHDSeed(const CPubKey &key);
594 
601  void LearnRelatedScripts(const CPubKey &key, OutputType);
602 
607  void LearnAllRelatedScripts(const CPubKey &key);
608 
612  void MarkReserveKeysAsUsed(int64_t keypool_id)
614  const std::map<CKeyID, int64_t> &GetAllReserveKeys() const {
615  return m_pool_key_to_index;
616  }
617 
618  std::set<CKeyID> GetKeys() const override;
619 };
620 
626 private:
628 
629 public:
631  : m_spk_man(spk_man) {}
632 
633  bool GetCScript(const CScriptID &scriptid, CScript &script) const override {
634  return m_spk_man.GetCScript(scriptid, script);
635  }
636  bool HaveCScript(const CScriptID &scriptid) const override {
637  return m_spk_man.HaveCScript(scriptid);
638  }
639  bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const override {
640  return m_spk_man.GetPubKey(address, pubkey);
641  }
642  bool GetKey(const CKeyID &address, CKey &key) const override {
643  return false;
644  }
645  bool HaveKey(const CKeyID &address) const override { return false; }
646  bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override {
647  return m_spk_man.GetKeyOrigin(keyid, info);
648  }
649 };
650 
652 private:
654 
655  // Map of scripts to descriptor range index
656  using ScriptPubKeyMap = std::map<CScript, int32_t>;
657  // Map of pubkeys involved in scripts to descriptor range index
658  using PubKeyMap = std::map<CPubKey, int32_t>;
660  std::map<CKeyID, std::pair<CPubKey, std::vector<uint8_t>>>;
661  using KeyMap = std::map<CKeyID, CKey>;
662 
663  ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
665  int32_t m_max_cached_index = -1;
666 
667  bool m_internal = false;
668 
670  CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man);
671 
674 
675  bool AddDescriptorKeyWithDB(WalletBatch &batch, const CKey &key,
676  const CPubKey &pubkey)
678 
680 
681  // Fetch the SigningProvider for the given script and optionally include
682  // private keys
683  std::unique_ptr<FlatSigningProvider>
684  GetSigningProvider(const CScript &script,
685  bool include_private = false) const;
686  // Fetch the SigningProvider for the given pubkey and always include private
687  // keys. This should only be called by signing code.
688  std::unique_ptr<FlatSigningProvider>
689  GetSigningProvider(const CPubKey &pubkey) const;
690  // Fetch the SigningProvider for a given index and optionally include
691  // private keys. Called by the above functions.
692  std::unique_ptr<FlatSigningProvider>
693  GetSigningProvider(int32_t index, bool include_private = false) const
695 
696 public:
698  WalletDescriptor &descriptor)
699  : ScriptPubKeyMan(storage), m_wallet_descriptor(descriptor) {}
700  DescriptorScriptPubKeyMan(WalletStorage &storage, bool internal)
701  : ScriptPubKeyMan(storage), m_internal(internal) {}
702 
704 
705  bool GetNewDestination(const OutputType type, CTxDestination &dest,
706  std::string &error) override;
707  isminetype IsMine(const CScript &script) const override;
708 
709  bool CheckDecryptionKey(const CKeyingMaterial &master_key,
710  bool accept_no_keys = false) override;
711  bool Encrypt(const CKeyingMaterial &master_key,
712  WalletBatch *batch) override;
713 
714  bool GetReservedDestination(const OutputType type, bool internal,
715  CTxDestination &address, int64_t &index,
716  CKeyPool &keypool) override;
717  void ReturnDestination(int64_t index, bool internal,
718  const CTxDestination &addr) override;
719 
720  // Tops up the descriptor cache and m_map_script_pub_keys. The cache is
721  // stored in the wallet file and is used to expand the descriptor in
722  // GetNewDestination. DescriptorScriptPubKeyMan relies more on ephemeral
723  // data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
724  // (with or without private keys), the "keypool" is a single xpub.
725  bool TopUp(unsigned int size = 0) override;
726 
727  void MarkUnusedAddresses(const CScript &script) override;
728 
729  bool IsHDEnabled() const override;
730 
732  bool SetupDescriptorGeneration(const CExtKey &master_key,
733  OutputType addr_type);
734 
735  bool HavePrivateKeys() const override;
736 
737  int64_t GetOldestKeyPoolTime() const override;
738  size_t KeypoolCountExternalKeys() const override;
739  unsigned int GetKeyPoolSize() const override;
740 
741  int64_t GetTimeFirstKey() const override;
742 
743  std::unique_ptr<CKeyMetadata>
744  GetMetadata(const CTxDestination &dest) const override;
745 
746  bool CanGetAddresses(bool internal = false) const override;
747 
748  std::unique_ptr<SigningProvider>
749  GetSolvingProvider(const CScript &script) const override;
750 
751  bool CanProvide(const CScript &script, SignatureData &sigdata) override;
752 
753  bool
755  const std::map<COutPoint, Coin> &coins, SigHashType sighash,
756  std::map<int, std::string> &input_errors) const override;
757  SigningResult SignMessage(const std::string &message, const PKHash &pkhash,
758  std::string &str_sig) const override;
761  SigHashType sighash_type = SigHashType().withForkId(),
762  bool sign = true, bool bip32derivs = false) const override;
763 
764  uint256 GetID() const override;
765 
766  void SetInternal(bool internal) override;
767 
768  void SetCache(const DescriptorCache &cache);
769 
770  bool AddKey(const CKeyID &key_id, const CKey &key);
771  bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey,
772  const std::vector<uint8_t> &crypted_key);
773 
774  bool HasWalletDescriptor(const WalletDescriptor &desc) const;
775  void UpdateWalletDescriptor(WalletDescriptor &descriptor);
776  bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor,
777  std::string &error);
778  void AddDescriptorKey(const CKey &key, const CPubKey &pubkey);
779  void WriteDescriptor();
780 
783  const std::vector<CScript> GetScriptPubKeys() const;
784 };
785 
786 #endif // BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
const CChainParams & Params()
Return the currently selected parameters.
Definition: chainparams.cpp:19
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
Definition: chainparams.h:80
An encapsulated secp256k1 private key.
Definition: key.h:28
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:22
A key from a CWallet's keypool.
bool fInternal
Whether this keypool entry is in the internal keypool (for change outputs)
void Unserialize(Stream &s)
CPubKey vchPubKey
The public key.
int64_t nTime
The time at which the key was generated. Set in AddKeypoolPubKeyWithDB.
CKeyPool()
Definition: wallet.cpp:3101
bool m_pre_split
Whether this key was generated for a keypool before the wallet was upgraded to HD-split.
void Serialize(Stream &s) const
A mutable version of CTransaction.
Definition: transaction.h:274
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:20
An encapsulated public key.
Definition: pubkey.h:31
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:431
A reference to a CScript: the Hash160 of its serialization (see script.h)
Definition: standard.h:24
A UTXO entry.
Definition: coins.h:28
Cache for single descriptor's derived extended pubkeys.
Definition: descriptor.h:19
std::map< CPubKey, int32_t > PubKeyMap
WalletDescriptor m_wallet_descriptor GUARDED_BY(cs_desc_man)
int64_t GetOldestKeyPoolTime() const override
DescriptorScriptPubKeyMan(WalletStorage &storage, bool internal)
void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr) override
bool AddKey(const CKeyID &key_id, const CKey &key)
void MarkUnusedAddresses(const CScript &script) override
Mark unused addresses as being used.
bool HavePrivateKeys() const override
bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey, const std::vector< uint8_t > &crypted_key)
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor, std::string &error)
TransactionError FillPSBT(PartiallySignedTransaction &psbt, SigHashType sighash_type=SigHashType().withForkId(), bool sign=true, bool bip32derivs=false) const override
Adds script and derivation path information to a PSBT, and optionally signs it.
ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man)
bool TopUp(unsigned int size=0) override
Fills internal address pool.
void SetInternal(bool internal) override
std::map< CKeyID, std::pair< CPubKey, std::vector< uint8_t > >> CryptedKeyMap
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
std::map< CScript, int32_t > ScriptPubKeyMap
bool HasWalletDescriptor(const WalletDescriptor &desc) const
int64_t GetTimeFirstKey() const override
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool) override
bool GetNewDestination(const OutputType type, CTxDestination &dest, std::string &error) override
unsigned int GetKeyPoolSize() const override
bool SetupDescriptorGeneration(const CExtKey &master_key, OutputType addr_type)
Setup descriptors based on the given CExtkey.
void AddDescriptorKey(const CKey &key, const CPubKey &pubkey)
CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man)
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
size_t KeypoolCountExternalKeys() const override
bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, SigHashType sighash, std::map< int, std::string > &input_errors) const override
Creates new signatures and adds them to the transaction.
bool m_decryption_thoroughly_checked
keeps track of whether Unlock has run a thorough check before
KeyMap GetKeys() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
std::unique_ptr< FlatSigningProvider > GetSigningProvider(const CScript &script, bool include_private=false) const
const std::vector< CScript > GetScriptPubKeys() const
PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man)
std::map< CKeyID, CKey > KeyMap
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
bool AddDescriptorKeyWithDB(WalletBatch &batch, const CKey &key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
void UpdateWalletDescriptor(WalletDescriptor &descriptor)
void SetCache(const DescriptorCache &cache)
KeyMap m_map_keys GUARDED_BY(cs_desc_man)
uint256 GetID() const override
const WalletDescriptor GetWalletDescriptor() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
isminetype IsMine(const CScript &script) 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.
bool IsHDEnabled() const override
bool CanGetAddresses(bool internal=false) const override
Returns true if the wallet can give out new addresses.
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
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
std::map< int64_t, CKeyID > m_index_to_reserved_key
void UpgradeKeyMetadata()
Upgrade stored CKeyMetadata objects to store key origin info as KeyOriginInfo.
bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector< uint8_t > &vchCryptedSecret)
bool fDecryptionThoroughlyChecked
keeps track of whether Unlock has run a thorough check before
int64_t GetOldestKeyPoolTime() const override
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool) override
uint256 GetID() const override
bool LoadWatchOnly(const CScript &dest)
Adds a watch-only address to the store, without saving it to disk (used by LoadWallet)
CryptedKeyMap mapCryptedKeys GUARDED_BY(cs_KeyStore)
WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore)
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
void MarkUnusedAddresses(const CScript &script) override
Mark unused addresses as being used.
bool HaveWatchOnly() const
Returns whether there are any watch-only things in the wallet.
bool RemoveWatchOnly(const CScript &dest)
Remove a watch only script from the keystore.
bool GetNewDestination(const OutputType type, CTxDestination &dest, std::string &error) override
bool AddWatchOnlyInMem(const CScript &dest)
const CHDChain & GetHDChain() const
void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Update wallet first key creation time.
void AddKeypoolPubkeyWithDB(const CPubKey &pubkey, const bool internal, WalletBatch &batch)
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)
size_t KeypoolCountExternalKeys() const override
void ReturnDestination(int64_t index, bool internal, const CTxDestination &) override
void SetHDSeed(const CPubKey &key)
bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector< uint8_t > &vchCryptedSecret, bool checksum_valid)
Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
std::unordered_map< CKeyID, CHDChain, SaltedSipHasher > m_inactive_hd_chains
bool GetKey(const CKeyID &address, CKey &keyOut) const override
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).
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
isminetype IsMine(const CScript &script) const override
bool ImportScripts(const std::set< CScript > scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore)=0
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
bool HaveKey(const CKeyID &address) const override
bool ImportPrivKeys(const std::map< CKeyID, CKey > &privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal)
Like TopUp() but adds keys for inactive HD chains.
bool CanGetAddresses(bool internal=false) const override
Returns true if the wallet can give out new addresses.
bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey)
void AddHDChain(const CHDChain &chain)
Set the HD chain model (chain child index counters) and writes it to the database.
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.
void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool)
Load a keypool entry.
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector< uint8_t > &vchCryptedSecret)
Adds an encrypted key to the store, and saves it to disk.
std::map< CKeyID, CPubKey > WatchKeyMap
std::set< CScript > WatchOnlySet
bool Upgrade(int prev_version, bilingual_str &error) override
Upgrades the wallet to the specified version.
bool IsHDEnabled() const override
bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
WatchOnlySet setWatchOnly GUARDED_BY(cs_KeyStore)
bool LoadKey(const CKey &key, const CPubKey &pubkey)
Adds a key to the store, without saving it to disk (used by LoadWallet)
bool AddKeyOriginWithDB(WalletBatch &batch, const CPubKey &pubkey, const KeyOriginInfo &info)
Add a KeyOriginInfo to the wallet.
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 TopUp(unsigned int size=0) override
Fills internal address pool.
void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata)
Load metadata (used by LoadWallet)
std::map< CKeyID, std::pair< CPubKey, std::vector< uint8_t > >> CryptedKeyMap
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.
void LoadHDChain(const CHDChain &chain)
Load a HD chain model (used by LoadWallet)
bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override
void AddInactiveHDChain(const CHDChain &chain)
bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const
Fetches a pubkey from mapWatchKeys if it exists there.
TransactionError FillPSBT(PartiallySignedTransaction &psbt, SigHashType sighash_type=SigHashType().withForkId(), bool sign=true, bool bip32derivs=false) const override
Adds script and derivation path information to a PSBT, and optionally signs it.
void LearnRelatedScripts(const CPubKey &key, OutputType)
Explicitly make the wallet learn the related scripts for outputs to the given key.
bool NewKeyPool()
Mark old keypool keys as used, and generate all new keys.
bool ReserveKeyFromKeyPool(int64_t &nIndex, CKeyPool &keypool, bool fRequestedInternal)
Reserves a key from the keypool and sets nIndex to its index.
std::set< CKeyID > GetKeys() const override
void KeepDestination(int64_t index, const OutputType &type) override
bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override
Adds a key to the store, and saves it to disk.
CPubKey GenerateNewKey(WalletBatch &batch, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Generate a new key.
void MarkPreSplitKeys() EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
unsigned int GetKeyPoolSize() const override
bool HavePrivateKeys() const override
void SetInternal(bool internal) override
bool SetupGeneration(bool force=false) override
Sets up the key generation stuff, i.e.
bool ImportScriptPubKeys(const std::set< CScript > &script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
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.
const std::map< CKeyID, int64_t > & GetAllReserveKeys() const
void RewriteDB() override
The action to do when the DB needs rewrite.
CPubKey DeriveNewSeed(const CKey &key)
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
int64_t GetTimeFirstKey() const override
bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, SigHashType sighash, std::map< int, std::string > &input_errors) const override
Creates new signatures and adds them to the transaction.
void LoadScriptMetadata(const CScriptID &script_id, const CKeyMetadata &metadata)
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
bool LoadCScript(const CScript &redeemScript)
Adds a CScript to the store.
bool AddCScript(const CScript &redeemScript) override
bool AddCScriptWithDB(WalletBatch &batch, const CScript &script)
Adds a script to the store and saves it to disk.
std::map< CKeyID, int64_t > m_pool_key_to_index
bool GetKeyFromPool(CPubKey &key, const OutputType type, bool internal=false)
Fetches a key from the keypool.
void DeriveNewChildKey(WalletBatch &batch, CKeyMetadata &metadata, CKey &secret, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Wraps a LegacyScriptPubKeyMan so that it can be returned in a new unique_ptr.
bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const override
bool HaveCScript(const CScriptID &scriptid) const override
bool GetKey(const CKeyID &address, CKey &key) const override
bool HaveKey(const CKeyID &address) 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
A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
virtual bool TopUp(unsigned int size=0)
Fills internal address pool.
virtual bool Upgrade(int prev_version, bilingual_str &error)
Upgrades the wallet to the specified version.
virtual bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, SigHashType sighash, std::map< int, std::string > &input_errors) const
Creates new signatures and adds them to the transaction.
virtual void SetInternal(bool internal)
virtual bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch)
virtual void MarkUnusedAddresses(const CScript &script)
Mark unused addresses as being used.
virtual int64_t GetOldestKeyPoolTime() const
virtual size_t KeypoolCountExternalKeys() const
virtual SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const
Sign a message with the given script.
virtual unsigned int GetKeyPoolSize() const
virtual bool SetupGeneration(bool force=false)
Sets up the key generation stuff, i.e.
virtual bool GetNewDestination(const OutputType type, CTxDestination &dest, std::string &error)
virtual bool GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool)
virtual TransactionError FillPSBT(PartiallySignedTransaction &psbt, SigHashType sighash_type=SigHashType().withForkId(), bool sign=true, bool bip32derivs=false) const
Adds script and derivation path information to a PSBT, and optionally signs it.
virtual isminetype IsMine(const CScript &script) const
virtual bool IsHDEnabled() 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.
virtual std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const
WalletStorage & m_storage
virtual std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const
virtual void KeepDestination(int64_t index, const OutputType &type)
virtual bool CanGetAddresses(bool internal=false) const
Returns true if the wallet can give out new addresses.
virtual ~ScriptPubKeyMan()
virtual uint256 GetID() const
virtual bool CanProvide(const CScript &script, SignatureData &sigdata)
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
virtual void RewriteDB()
The action to do when the DB needs rewrite.
virtual bool HavePrivateKeys() const
virtual int64_t GetTimeFirstKey() const
ScriptPubKeyMan(WalletStorage &storage)
virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr)
boost::signals2::signal< void()> NotifyCanGetAddressesChanged
Keypool has new keys.
boost::signals2::signal< void(bool fHaveWatchOnly)> NotifyWatchonlyChanged
Watch-only address added.
void WalletLogPrintf(std::string fmt, Params... parameters) const
Prepends the wallet name in logging output to ease debugging in multi-wallet use cases.
Signature hash type wrapper class.
Definition: sighashtype.h:37
An interface to be implemented by keystores that support signing.
Access to the wallet database.
Definition: walletdb.h:175
An instance of this class represents one database.
Definition: db.h:100
Descriptor with some wallet metadata.
Definition: walletutil.h:80
virtual bool IsWalletFlagSet(uint64_t) const =0
virtual bool HasEncryptionKeys() const =0
virtual WalletDatabase & GetDatabase()=0
virtual bool IsLocked() const =0
virtual const CKeyingMaterial & GetEncryptionKey() const =0
virtual void UnsetBlankWalletFlag(WalletBatch &)=0
virtual void SetMinVersion(enum WalletFeature, WalletBatch *=nullptr, bool=false)=0
virtual const std::string GetDisplayName() const =0
virtual ~WalletStorage()=default
virtual bool CanSupportFeature(enum WalletFeature) const =0
virtual const CChainParams & GetChainParams() const =0
256-bit opaque blob.
Definition: uint256.h:129
std::vector< uint8_t, secure_allocator< uint8_t > > CKeyingMaterial
Definition: crypter.h:57
TransactionError
Definition: error.h:22
isminetype
IsMine() return codes.
Definition: ismine.h:18
@ ISMINE_NO
Definition: ismine.h:19
bool error(const char *fmt, const Args &...args)
Definition: logging.h:225
#define LogPrintf(...)
Definition: logging.h:206
SigningResult
Definition: message.h:47
Implement std::hash so RCUPtr can be used as a key for maps or sets.
Definition: rcu.h:257
OutputType
Definition: outputtype.h:16
static const unsigned int DEFAULT_KEYPOOL_SIZE
Default for -keypool.
std::vector< CKeyID > GetAffectedKeys(const CScript &spk, const SigningProvider &provider)
@ SER_GETHASH
Definition: serialize.h:154
std::variant< CNoDestination, PKHash, ScriptHash > CTxDestination
A txout script template with a specific destination.
Definition: standard.h:85
Definition: key.h:164
A version of CTransaction with the PSBT format.
Definition: psbt.h:334
Bilingual messages:
Definition: translation.h:17
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:56
int64_t GetTime()
Definition: time.cpp:109
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:14