Bitcoin ABC 0.32.12
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 <common/messages.h>
10#include <common/types.h>
11#include <psbt.h>
12#include <script/descriptor.h>
14#include <script/standard.h>
15#include <util/result.h>
16#include <util/time.h>
17#include <wallet/crypter.h>
18#include <wallet/ismine.h>
19#include <wallet/walletdb.h>
20#include <wallet/walletutil.h>
21
22#include <boost/signals2/signal.hpp>
23
24#include <functional>
25#include <unordered_map>
26
27enum class OutputType;
28class CChainParams;
29struct bilingual_str;
30
31// Wallet storage things that ScriptPubKeyMans need in order to be able to store
32// things to the wallet database. It provides access to things that are part of
33// the entire wallet and not specific to a ScriptPubKeyMan such as wallet flags,
34// wallet version, encryption keys, encryption status, and the database itself.
35// This allows a ScriptPubKeyMan to have callbacks into CWallet without causing
36// a circular dependency. WalletStorage should be the same for all
37// ScriptPubKeyMans of a wallet.
39public:
40 virtual ~WalletStorage() = default;
41 virtual std::string GetDisplayName() const = 0;
43 virtual const CChainParams &GetChainParams() const = 0;
44 virtual bool IsWalletFlagSet(uint64_t) const = 0;
45 virtual void UnsetBlankWalletFlag(WalletBatch &) = 0;
46 virtual bool CanSupportFeature(enum WalletFeature) const = 0;
47 virtual void SetMinVersion(enum WalletFeature, WalletBatch * = nullptr,
48 bool = false) = 0;
50 virtual bool WithEncryptionKey(
51 const std::function<bool(const CKeyingMaterial &)> &cb) const = 0;
52 virtual bool HasEncryptionKeys() const = 0;
53 virtual bool IsLocked() const = 0;
54};
55
57static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
58
59std::vector<CKeyID> GetAffectedKeys(const CScript &spk,
60 const SigningProvider &provider);
61
112class CKeyPool {
113public:
115 int64_t nTime;
124
125 CKeyPool();
126 CKeyPool(const CPubKey &vchPubKeyIn, bool internalIn);
127
128 template <typename Stream> void Serialize(Stream &s) const {
129 // Unused field, writes the highest client version ever written
130 s << int{320400};
131 s << nTime << vchPubKey << fInternal << m_pre_split;
132 }
133
134 template <typename Stream> void Unserialize(Stream &s) {
135 // Discard unused field
136 s >> int{};
137 s >> nTime >> vchPubKey;
138 try {
139 s >> fInternal;
140 } catch (std::ios_base::failure &) {
146 fInternal = false;
147 }
148 try {
149 s >> m_pre_split;
150 } catch (std::ios_base::failure &) {
156 m_pre_split = false;
157 }
158 }
159};
160
170protected:
172
173public:
174 explicit ScriptPubKeyMan(WalletStorage &storage) : m_storage(storage) {}
175 virtual ~ScriptPubKeyMan(){};
178 return util::Error{Untranslated("Not supported")};
179 }
180 virtual isminetype IsMine(const CScript &script) const { return ISMINE_NO; }
181
184 virtual bool CheckDecryptionKey(const CKeyingMaterial &master_key,
185 bool accept_no_keys = false) {
186 return false;
187 }
188 virtual bool Encrypt(const CKeyingMaterial &master_key,
189 WalletBatch *batch) {
190 return false;
191 }
192
193 virtual bool GetReservedDestination(const OutputType type, bool internal,
194 CTxDestination &address, int64_t &index,
195 CKeyPool &keypool) {
196 return false;
197 }
198 virtual void KeepDestination(int64_t index, const OutputType &type) {}
199 virtual void ReturnDestination(int64_t index, bool internal,
200 const CTxDestination &addr) {}
201
209 virtual bool TopUp(unsigned int size = 0) { return false; }
210
212 virtual void MarkUnusedAddresses(const CScript &script) {}
213
220 virtual bool SetupGeneration(bool force = false) { return false; }
221
222 /* Returns true if HD is enabled */
223 virtual bool IsHDEnabled() const { return false; }
224
229 virtual bool CanGetAddresses(bool internal = false) const { return false; }
230
232 virtual bool Upgrade(int prev_version, bilingual_str &error) {
233 return false;
234 }
235
236 virtual bool HavePrivateKeys() const { return false; }
237
239 virtual void RewriteDB() {}
240
241 virtual int64_t GetOldestKeyPoolTime() const { return GetTime(); }
242
243 virtual size_t KeypoolCountExternalKeys() const { return 0; }
244 virtual unsigned int GetKeyPoolSize() const { return 0; }
245
246 virtual int64_t GetTimeFirstKey() const { return 0; }
247
248 virtual std::unique_ptr<CKeyMetadata>
249 GetMetadata(const CTxDestination &dest) const {
250 return nullptr;
251 }
252
253 virtual std::unique_ptr<SigningProvider>
254 GetSolvingProvider(const CScript &script) const {
255 return nullptr;
256 }
257
263 virtual bool CanProvide(const CScript &script, SignatureData &sigdata) {
264 return false;
265 }
266
271 virtual bool
273 const std::map<COutPoint, Coin> &coins, SigHashType sighash,
274 std::map<int, std::string> &input_errors) const {
275 return false;
276 }
278 virtual SigningResult SignMessage(const std::string &message,
279 const PKHash &pkhash,
280 std::string &str_sig) const {
282 };
287 virtual std::optional<common::PSBTError>
289 SigHashType sighash_type = SigHashType().withForkId(),
290 bool sign = true, bool bip32derivs = false) const {
292 }
293
294 virtual uint256 GetID() const { return uint256(); }
295
296 virtual void SetInternal(bool internal) {}
297
302 template <typename... Params>
303 void WalletLogPrintf(std::string fmt, Params... parameters) const {
304 LogPrintf(("%s " + fmt).c_str(), m_storage.GetDisplayName(),
305 parameters...);
306 };
307
309 boost::signals2::signal<void(bool fHaveWatchOnly)> NotifyWatchonlyChanged;
310
312 boost::signals2::signal<void()> NotifyCanGetAddressesChanged;
313};
314
317private:
320
321 using WatchOnlySet = std::set<CScript>;
322 using WatchKeyMap = std::map<CKeyID, CPubKey>;
323
324 WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
325
327 std::map<CKeyID, std::pair<CPubKey, std::vector<uint8_t>>>;
328
332
333 int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = 0;
334
335 bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey);
336 bool AddCryptedKeyInner(const CPubKey &vchPubKey,
337 const std::vector<uint8_t> &vchCryptedSecret);
338
348 bool AddWatchOnly(const CScript &dest)
350 bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest)
352 bool AddWatchOnlyInMem(const CScript &dest);
354 bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest,
355 int64_t create_time)
357
359 bool AddKeyPubKeyWithDB(WalletBatch &batch, const CKey &key,
360 const CPubKey &pubkey)
362
363 void AddKeypoolPubkeyWithDB(const CPubKey &pubkey, const bool internal,
364 WalletBatch &batch);
365
367 bool AddCScriptWithDB(WalletBatch &batch, const CScript &script);
368
370 bool AddKeyOriginWithDB(WalletBatch &batch, const CPubKey &pubkey,
371 const KeyOriginInfo &info);
372
373 /* the HD chain data model (external chain counters) */
375 std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
376
377 /* HD derive new child key (on internal or external chain) */
378 void DeriveNewChildKey(WalletBatch &batch, CKeyMetadata &metadata,
379 CKey &secret, CHDChain &hd_chain,
380 bool internal = false)
382
383 std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
384 std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
385 std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
386 int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
388 // Tracks keypool indexes to CKeyIDs of keys that have been taken out of the
389 // keypool but may be returned to it
391
393 bool GetKeyFromPool(CPubKey &key, const OutputType type,
394 bool internal = false);
395
410 bool ReserveKeyFromKeyPool(int64_t &nIndex, CKeyPool &keypool,
411 bool fRequestedInternal);
412
426 bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index,
427 bool internal);
428
429public:
431
432 util::Result<CTxDestination>
433 GetNewDestination(const OutputType type) override;
434 isminetype IsMine(const CScript &script) const override;
435
436 bool CheckDecryptionKey(const CKeyingMaterial &master_key,
437 bool accept_no_keys = false) override;
438 bool Encrypt(const CKeyingMaterial &master_key,
439 WalletBatch *batch) override;
440
441 bool GetReservedDestination(const OutputType type, bool internal,
442 CTxDestination &address, int64_t &index,
443 CKeyPool &keypool) override;
444 void KeepDestination(int64_t index, const OutputType &type) override;
445 void ReturnDestination(int64_t index, bool internal,
446 const CTxDestination &) override;
447
448 bool TopUp(unsigned int size = 0) override;
449
450 void MarkUnusedAddresses(const CScript &script) override;
451
454 void UpgradeKeyMetadata();
455
456 bool IsHDEnabled() const override;
457
458 bool SetupGeneration(bool force = false) override;
459
460 bool Upgrade(int prev_version, bilingual_str &error) override;
461
462 bool HavePrivateKeys() const override;
463
464 void RewriteDB() override;
465
466 int64_t GetOldestKeyPoolTime() const override;
467 size_t KeypoolCountExternalKeys() const override;
468 unsigned int GetKeyPoolSize() const override;
469
470 int64_t GetTimeFirstKey() const override;
471
472 std::unique_ptr<CKeyMetadata>
473 GetMetadata(const CTxDestination &dest) const override;
474
475 bool CanGetAddresses(bool internal = false) const override;
476
477 std::unique_ptr<SigningProvider>
478 GetSolvingProvider(const CScript &script) const override;
479
480 bool CanProvide(const CScript &script, SignatureData &sigdata) override;
481
482 bool
484 const std::map<COutPoint, Coin> &coins, SigHashType sighash,
485 std::map<int, std::string> &input_errors) const override;
486 SigningResult SignMessage(const std::string &message, const PKHash &pkhash,
487 std::string &str_sig) const override;
488 std::optional<common::PSBTError>
490 SigHashType sighash_type = SigHashType().withForkId(),
491 bool sign = true, bool bip32derivs = false) const override;
492
493 uint256 GetID() const override;
494
495 void SetInternal(bool internal) override;
496
497 // Map from Key ID to key metadata.
499
500 // Map from Script ID to key metadata (for watch-only keys).
502
504 bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override;
506 bool LoadKey(const CKey &key, const CPubKey &pubkey);
508 bool AddCryptedKey(const CPubKey &vchPubKey,
509 const std::vector<uint8_t> &vchCryptedSecret);
512 bool LoadCryptedKey(const CPubKey &vchPubKey,
513 const std::vector<uint8_t> &vchCryptedSecret,
514 bool checksum_valid);
515 void UpdateTimeFirstKey(int64_t nCreateTime)
518 bool LoadCScript(const CScript &redeemScript);
520 void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata);
521 void LoadScriptMetadata(const CScriptID &script_id,
522 const CKeyMetadata &metadata);
524 CPubKey GenerateNewKey(WalletBatch &batch, CHDChain &hd_chain,
525 bool internal = false)
527
532 void AddHDChain(const CHDChain &chain);
534 void LoadHDChain(const CHDChain &chain);
535 const CHDChain &GetHDChain() const { return m_hd_chain; }
536 void AddInactiveHDChain(const CHDChain &chain);
537
540 bool LoadWatchOnly(const CScript &dest);
542 bool HaveWatchOnly(const CScript &dest) const;
544 bool HaveWatchOnly() const;
546 bool RemoveWatchOnly(const CScript &dest);
547 bool AddWatchOnly(const CScript &dest, int64_t nCreateTime)
549
551 bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
552
553 /* SigningProvider overrides */
554 bool HaveKey(const CKeyID &address) const override;
555 bool GetKey(const CKeyID &address, CKey &keyOut) const override;
556 bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override;
557 bool AddCScript(const CScript &redeemScript) override;
558 bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override;
559
561 void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
562 bool NewKeyPool();
564
565 bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp)
567 bool ImportPrivKeys(const std::map<CKeyID, CKey> &privkey_map,
568 const int64_t timestamp)
570 bool ImportPubKeys(
571 const std::vector<CKeyID> &ordered_pubkeys,
572 const std::map<CKeyID, CPubKey> &pubkey_map,
573 const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> &key_origins,
574 const bool add_keypool, const bool internal, const int64_t timestamp)
576 bool ImportScriptPubKeys(const std::set<CScript> &script_pub_keys,
577 const bool have_solving_data,
578 const int64_t timestamp)
580
581 /* Returns true if the wallet can generate new keys */
582 bool CanGenerateKeys() const;
583
584 /* Generates a new HD seed (will not be activated) */
586
587 /* Derives a new HD seed (will not be activated) */
588 CPubKey DeriveNewSeed(const CKey &key);
589
590 /* Set the current HD seed (will reset the chain child index counters)
591 Sets the seed's version based on the current wallet version (so the
592 caller must ensure the current wallet version is correct before calling
593 this function). */
594 void SetHDSeed(const CPubKey &key);
595
602 void LearnRelatedScripts(const CPubKey &key, OutputType);
603
608 void LearnAllRelatedScripts(const CPubKey &key);
609
613 void MarkReserveKeysAsUsed(int64_t keypool_id)
615 const std::map<CKeyID, int64_t> &GetAllReserveKeys() const {
616 return m_pool_key_to_index;
617 }
618
619 std::set<CKeyID> GetKeys() const override;
620};
621
627private:
629
630public:
632 : m_spk_man(spk_man) {}
633
634 bool GetCScript(const CScriptID &scriptid, CScript &script) const override {
635 return m_spk_man.GetCScript(scriptid, script);
636 }
637 bool HaveCScript(const CScriptID &scriptid) const override {
638 return m_spk_man.HaveCScript(scriptid);
639 }
640 bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const override {
641 return m_spk_man.GetPubKey(address, pubkey);
642 }
643 bool GetKey(const CKeyID &address, CKey &key) const override {
644 return false;
645 }
646 bool HaveKey(const CKeyID &address) const override { return false; }
647 bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override {
648 return m_spk_man.GetKeyOrigin(keyid, info);
649 }
650};
651
653private:
655
656 // Map of scripts to descriptor range index
657 using ScriptPubKeyMap = std::map<CScript, int32_t>;
658 // Map of pubkeys involved in scripts to descriptor range index
659 using PubKeyMap = std::map<CPubKey, int32_t>;
661 std::map<CKeyID, std::pair<CPubKey, std::vector<uint8_t>>>;
662 using KeyMap = std::map<CKeyID, CKey>;
663
664 ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
666 int32_t m_max_cached_index = -1;
667
668 bool m_internal = false;
669
672
675
676 bool AddDescriptorKeyWithDB(WalletBatch &batch, const CKey &key,
677 const CPubKey &pubkey)
679
681
682 // Fetch the SigningProvider for the given script and optionally include
683 // private keys
684 std::unique_ptr<FlatSigningProvider>
685 GetSigningProvider(const CScript &script,
686 bool include_private = false) const;
687 // Fetch the SigningProvider for the given pubkey and always include private
688 // keys. This should only be called by signing code.
689 std::unique_ptr<FlatSigningProvider>
690 GetSigningProvider(const CPubKey &pubkey) const;
691 // Fetch the SigningProvider for a given index and optionally include
692 // private keys. Called by the above functions.
693 std::unique_ptr<FlatSigningProvider>
694 GetSigningProvider(int32_t index, bool include_private = false) const
696
697public:
699 WalletDescriptor &descriptor)
700 : ScriptPubKeyMan(storage), m_wallet_descriptor(descriptor) {}
702 : ScriptPubKeyMan(storage), m_internal(internal) {}
703
705
707 GetNewDestination(const OutputType type) override;
708 isminetype IsMine(const CScript &script) const override;
709
710 bool CheckDecryptionKey(const CKeyingMaterial &master_key,
711 bool accept_no_keys = false) override;
712 bool Encrypt(const CKeyingMaterial &master_key,
713 WalletBatch *batch) override;
714
715 bool GetReservedDestination(const OutputType type, bool internal,
716 CTxDestination &address, int64_t &index,
717 CKeyPool &keypool) override;
718 void ReturnDestination(int64_t index, bool internal,
719 const CTxDestination &addr) override;
720
721 // Tops up the descriptor cache and m_map_script_pub_keys. The cache is
722 // stored in the wallet file and is used to expand the descriptor in
723 // GetNewDestination. DescriptorScriptPubKeyMan relies more on ephemeral
724 // data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
725 // (with or without private keys), the "keypool" is a single xpub.
726 bool TopUp(unsigned int size = 0) override;
727
728 void MarkUnusedAddresses(const CScript &script) override;
729
730 bool IsHDEnabled() const override;
731
733 bool SetupDescriptorGeneration(const CExtKey &master_key,
734 OutputType addr_type);
735
736 bool HavePrivateKeys() const override;
737
738 int64_t GetOldestKeyPoolTime() const override;
739 size_t KeypoolCountExternalKeys() const override;
740 unsigned int GetKeyPoolSize() const override;
741
742 int64_t GetTimeFirstKey() const override;
743
744 std::unique_ptr<CKeyMetadata>
745 GetMetadata(const CTxDestination &dest) const override;
746
747 bool CanGetAddresses(bool internal = false) const override;
748
749 std::unique_ptr<SigningProvider>
750 GetSolvingProvider(const CScript &script) const override;
751
752 bool CanProvide(const CScript &script, SignatureData &sigdata) override;
753
754 bool
756 const std::map<COutPoint, Coin> &coins, SigHashType sighash,
757 std::map<int, std::string> &input_errors) const override;
758 SigningResult SignMessage(const std::string &message, const PKHash &pkhash,
759 std::string &str_sig) const override;
760 std::optional<common::PSBTError>
762 SigHashType sighash_type = SigHashType().withForkId(),
763 bool sign = true, bool bip32derivs = false) const override;
764
765 uint256 GetID() const override;
766
767 void SetInternal(bool internal) override;
768
769 void SetCache(const DescriptorCache &cache);
770
771 bool AddKey(const CKeyID &key_id, const CKey &key);
772 bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey,
773 const std::vector<uint8_t> &crypted_key);
774
775 bool HasWalletDescriptor(const WalletDescriptor &desc) const;
777 bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor,
778 std::string &error);
779 void AddDescriptorKey(const CKey &key, const CPubKey &pubkey);
780 void WriteDescriptor();
781
784 std::vector<CScript> GetScriptPubKeys() const;
785};
786
787#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:3223
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)
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
std::optional< common::PSBTError > 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.
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.
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.
std::optional< common::PSBTError > 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.
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 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.
virtual std::optional< common::PSBTError > 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.
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
is a home for simple enum and struct type definitions that can be used internally by functions in the...
std::vector< uint8_t, secure_allocator< uint8_t > > CKeyingMaterial
Definition: crypter.h:57
isminetype
IsMine() return codes.
Definition: ismine.h:18
@ ISMINE_NO
Definition: ismine.h:19
#define LogPrintf(...)
Definition: logging.h:424
Definition: args.cpp:864
PSBTError
Definition: types.h:17
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)
SigningResult
Definition: signmessage.h:47
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:62
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