Bitcoin ABC 0.32.6
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>
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 <functional>
24#include <unordered_map>
25
26enum class OutputType;
27class CChainParams;
28struct bilingual_str;
29
30// Wallet storage things that ScriptPubKeyMans need in order to be able to store
31// things to the wallet database. It provides access to things that are part of
32// the entire wallet and not specific to a ScriptPubKeyMan such as wallet flags,
33// wallet version, encryption keys, encryption status, and the database itself.
34// This allows a ScriptPubKeyMan to have callbacks into CWallet without causing
35// a circular dependency. WalletStorage should be the same for all
36// ScriptPubKeyMans of a wallet.
38public:
39 virtual ~WalletStorage() = default;
40 virtual std::string GetDisplayName() const = 0;
42 virtual const CChainParams &GetChainParams() const = 0;
43 virtual bool IsWalletFlagSet(uint64_t) const = 0;
44 virtual void UnsetBlankWalletFlag(WalletBatch &) = 0;
45 virtual bool CanSupportFeature(enum WalletFeature) const = 0;
46 virtual void SetMinVersion(enum WalletFeature, WalletBatch * = nullptr,
47 bool = false) = 0;
49 virtual bool WithEncryptionKey(
50 const std::function<bool(const CKeyingMaterial &)> &cb) const = 0;
51 virtual bool HasEncryptionKeys() const = 0;
52 virtual bool IsLocked() const = 0;
53};
54
56static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
57
58std::vector<CKeyID> GetAffectedKeys(const CScript &spk,
59 const SigningProvider &provider);
60
111class CKeyPool {
112public:
114 int64_t nTime;
123
124 CKeyPool();
125 CKeyPool(const CPubKey &vchPubKeyIn, bool internalIn);
126
127 template <typename Stream> void Serialize(Stream &s) const {
128 // Unused field, writes the highest client version ever written
129 s << int{320400};
130 s << nTime << vchPubKey << fInternal << m_pre_split;
131 }
132
133 template <typename Stream> void Unserialize(Stream &s) {
134 // Discard unused field
135 s >> int{};
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
169protected:
171
172public:
173 explicit ScriptPubKeyMan(WalletStorage &storage) : m_storage(storage) {}
174 virtual ~ScriptPubKeyMan(){};
177 return util::Error{Untranslated("Not supported")};
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
316private:
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
428public:
430
431 util::Result<CTxDestination>
432 GetNewDestination(const OutputType type) 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.
498
499 // Map from Script ID to key metadata (for watch-only keys).
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
626private:
628
629public:
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
652private:
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
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
696public:
698 WalletDescriptor &descriptor)
699 : ScriptPubKeyMan(storage), m_wallet_descriptor(descriptor) {}
701 : ScriptPubKeyMan(storage), m_internal(internal) {}
702
704
706 GetNewDestination(const OutputType type) 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;
776 bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor,
777 std::string &error);
778 void AddDescriptorKey(const CKey &key, const CPubKey &pubkey);
779 void WriteDescriptor();
780
783 std::vector<CScript> GetScriptPubKeys() const;
784};
785
786#endif // BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
const CScript redeemScript
const CChainParams & Params()
Return the currently selected parameters.
Definition: chainparams.cpp:21
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
Definition: chainparams.h:86
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:3217
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 encapsulated public key.
Definition: pubkey.h:31
A reference to a CScript: the Hash160 of its serialization (see script.h)
Definition: standard.h:24
A UTXO entry.
Definition: coins.h:29
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
util::Result< CTxDestination > GetNewDestination(const OutputType type) 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
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
std::vector< CScript > GetScriptPubKeys() const
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.
WalletDescriptor GetWalletDescriptor() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
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
const CHDChain & GetHDChain() const
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)
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 AddWatchOnlyInMem(const CScript &dest)
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)
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
util::Result< CTxDestination > GetNewDestination(const OutputType type) 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)
WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore)
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 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.
const std::map< CKeyID, int64_t > & GetAllReserveKeys() const
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.
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 std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const
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 GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool)
virtual std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const
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.
WalletStorage & m_storage
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
virtual util::Result< CTxDestination > GetNewDestination(const OutputType type)
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:176
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 bool WithEncryptionKey(const std::function< bool(const CKeyingMaterial &)> &cb) const =0
Pass the encryption key to cb().
virtual WalletDatabase & GetDatabase()=0
virtual std::string GetDisplayName() const =0
virtual bool IsLocked() const =0
virtual void UnsetBlankWalletFlag(WalletBatch &)=0
virtual void SetMinVersion(enum WalletFeature, WalletBatch *=nullptr, bool=false)=0
virtual ~WalletStorage()=default
virtual const CChainParams & GetChainParams() const =0
virtual bool CanSupportFeature(enum WalletFeature) 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
#define LogPrintf(...)
Definition: logging.h:424
SigningResult
Definition: message.h:47
Implement std::hash so RCUPtr can be used as a key for maps or sets.
Definition: rcu.h:259
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)
std::variant< CNoDestination, PKHash, ScriptHash > CTxDestination
A txout script template with a specific destination.
Definition: standard.h:85
Definition: key.h:167
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()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition: time.cpp:105
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:36
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:14