Bitcoin ABC 0.30.5
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/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 <functional>
23#include <unordered_map>
24
25enum class OutputType;
26class CChainParams;
27struct bilingual_str;
28
29// Wallet storage things that ScriptPubKeyMans need in order to be able to store
30// things to the wallet database. It provides access to things that are part of
31// the entire wallet and not specific to a ScriptPubKeyMan such as wallet flags,
32// wallet version, encryption keys, encryption status, and the database itself.
33// This allows a ScriptPubKeyMan to have callbacks into CWallet without causing
34// a circular dependency. WalletStorage should be the same for all
35// ScriptPubKeyMans of a wallet.
37public:
38 virtual ~WalletStorage() = default;
39 virtual const std::string GetDisplayName() const = 0;
41 virtual const CChainParams &GetChainParams() const = 0;
42 virtual bool IsWalletFlagSet(uint64_t) const = 0;
43 virtual void UnsetBlankWalletFlag(WalletBatch &) = 0;
44 virtual bool CanSupportFeature(enum WalletFeature) const = 0;
45 virtual void SetMinVersion(enum WalletFeature, WalletBatch * = nullptr,
46 bool = false) = 0;
48 virtual bool WithEncryptionKey(
49 const std::function<bool(const CKeyingMaterial &)> &cb) const = 0;
50 virtual bool HasEncryptionKeys() const = 0;
51 virtual bool IsLocked() const = 0;
52};
53
55static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
56
57std::vector<CKeyID> GetAffectedKeys(const CScript &spk,
58 const SigningProvider &provider);
59
110class CKeyPool {
111public:
113 int64_t nTime;
122
123 CKeyPool();
124 CKeyPool(const CPubKey &vchPubKeyIn, bool internalIn);
125
126 template <typename Stream> void Serialize(Stream &s) const {
127 int nVersion = s.GetVersion();
128 if (!(s.GetType() & SER_GETHASH)) {
129 s << nVersion;
130 }
131 s << nTime << vchPubKey << fInternal << m_pre_split;
132 }
133
134 template <typename Stream> void Unserialize(Stream &s) {
135 int nVersion = s.GetVersion();
136 if (!(s.GetType() & SER_GETHASH)) {
137 s >> nVersion;
138 }
139 s >> nTime >> vchPubKey;
140 try {
141 s >> fInternal;
142 } catch (std::ios_base::failure &) {
148 fInternal = false;
149 }
150 try {
151 s >> m_pre_split;
152 } catch (std::ios_base::failure &) {
158 m_pre_split = false;
159 }
160 }
161};
162
172protected:
174
175public:
176 explicit ScriptPubKeyMan(WalletStorage &storage) : m_storage(storage) {}
177 virtual ~ScriptPubKeyMan(){};
178 virtual bool GetNewDestination(const OutputType type, CTxDestination &dest,
179 std::string &error) {
180 return false;
181 }
182 virtual isminetype IsMine(const CScript &script) const { return ISMINE_NO; }
183
186 virtual bool CheckDecryptionKey(const CKeyingMaterial &master_key,
187 bool accept_no_keys = false) {
188 return false;
189 }
190 virtual bool Encrypt(const CKeyingMaterial &master_key,
191 WalletBatch *batch) {
192 return false;
193 }
194
195 virtual bool GetReservedDestination(const OutputType type, bool internal,
196 CTxDestination &address, int64_t &index,
197 CKeyPool &keypool) {
198 return false;
199 }
200 virtual void KeepDestination(int64_t index, const OutputType &type) {}
201 virtual void ReturnDestination(int64_t index, bool internal,
202 const CTxDestination &addr) {}
203
211 virtual bool TopUp(unsigned int size = 0) { return false; }
212
214 virtual void MarkUnusedAddresses(const CScript &script) {}
215
222 virtual bool SetupGeneration(bool force = false) { return false; }
223
224 /* Returns true if HD is enabled */
225 virtual bool IsHDEnabled() const { return false; }
226
231 virtual bool CanGetAddresses(bool internal = false) const { return false; }
232
234 virtual bool Upgrade(int prev_version, bilingual_str &error) {
235 return false;
236 }
237
238 virtual bool HavePrivateKeys() const { return false; }
239
241 virtual void RewriteDB() {}
242
243 virtual int64_t GetOldestKeyPoolTime() const { return GetTime(); }
244
245 virtual size_t KeypoolCountExternalKeys() const { return 0; }
246 virtual unsigned int GetKeyPoolSize() const { return 0; }
247
248 virtual int64_t GetTimeFirstKey() const { return 0; }
249
250 virtual std::unique_ptr<CKeyMetadata>
251 GetMetadata(const CTxDestination &dest) const {
252 return nullptr;
253 }
254
255 virtual std::unique_ptr<SigningProvider>
256 GetSolvingProvider(const CScript &script) const {
257 return nullptr;
258 }
259
265 virtual bool CanProvide(const CScript &script, SignatureData &sigdata) {
266 return false;
267 }
268
273 virtual bool
275 const std::map<COutPoint, Coin> &coins, SigHashType sighash,
276 std::map<int, std::string> &input_errors) const {
277 return false;
278 }
280 virtual SigningResult SignMessage(const std::string &message,
281 const PKHash &pkhash,
282 std::string &str_sig) const {
284 };
289 virtual TransactionError
291 SigHashType sighash_type = SigHashType().withForkId(),
292 bool sign = true, bool bip32derivs = false) const {
294 }
295
296 virtual uint256 GetID() const { return uint256(); }
297
298 virtual void SetInternal(bool internal) {}
299
304 template <typename... Params>
305 void WalletLogPrintf(std::string fmt, Params... parameters) const {
306 LogPrintf(("%s " + fmt).c_str(), m_storage.GetDisplayName(),
307 parameters...);
308 };
309
311 boost::signals2::signal<void(bool fHaveWatchOnly)> NotifyWatchonlyChanged;
312
314 boost::signals2::signal<void()> NotifyCanGetAddressesChanged;
315};
316
319private:
322
323 using WatchOnlySet = std::set<CScript>;
324 using WatchKeyMap = std::map<CKeyID, CPubKey>;
325
326 WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
327
329 std::map<CKeyID, std::pair<CPubKey, std::vector<uint8_t>>>;
330
334
335 int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = 0;
336
337 bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey);
338 bool AddCryptedKeyInner(const CPubKey &vchPubKey,
339 const std::vector<uint8_t> &vchCryptedSecret);
340
350 bool AddWatchOnly(const CScript &dest)
352 bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest)
354 bool AddWatchOnlyInMem(const CScript &dest);
356 bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest,
357 int64_t create_time)
359
361 bool AddKeyPubKeyWithDB(WalletBatch &batch, const CKey &key,
362 const CPubKey &pubkey)
364
365 void AddKeypoolPubkeyWithDB(const CPubKey &pubkey, const bool internal,
366 WalletBatch &batch);
367
369 bool AddCScriptWithDB(WalletBatch &batch, const CScript &script);
370
372 bool AddKeyOriginWithDB(WalletBatch &batch, const CPubKey &pubkey,
373 const KeyOriginInfo &info);
374
375 /* the HD chain data model (external chain counters) */
377 std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
378
379 /* HD derive new child key (on internal or external chain) */
380 void DeriveNewChildKey(WalletBatch &batch, CKeyMetadata &metadata,
381 CKey &secret, CHDChain &hd_chain,
382 bool internal = false)
384
385 std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
386 std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
387 std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
388 int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
390 // Tracks keypool indexes to CKeyIDs of keys that have been taken out of the
391 // keypool but may be returned to it
393
395 bool GetKeyFromPool(CPubKey &key, const OutputType type,
396 bool internal = false);
397
412 bool ReserveKeyFromKeyPool(int64_t &nIndex, CKeyPool &keypool,
413 bool fRequestedInternal);
414
428 bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index,
429 bool internal);
430
431public:
433
434 bool GetNewDestination(const OutputType type, CTxDestination &dest,
435 std::string &error) override;
436 isminetype IsMine(const CScript &script) const override;
437
438 bool CheckDecryptionKey(const CKeyingMaterial &master_key,
439 bool accept_no_keys = false) override;
440 bool Encrypt(const CKeyingMaterial &master_key,
441 WalletBatch *batch) override;
442
443 bool GetReservedDestination(const OutputType type, bool internal,
444 CTxDestination &address, int64_t &index,
445 CKeyPool &keypool) override;
446 void KeepDestination(int64_t index, const OutputType &type) override;
447 void ReturnDestination(int64_t index, bool internal,
448 const CTxDestination &) override;
449
450 bool TopUp(unsigned int size = 0) override;
451
452 void MarkUnusedAddresses(const CScript &script) override;
453
456 void UpgradeKeyMetadata();
457
458 bool IsHDEnabled() const override;
459
460 bool SetupGeneration(bool force = false) override;
461
462 bool Upgrade(int prev_version, bilingual_str &error) override;
463
464 bool HavePrivateKeys() const override;
465
466 void RewriteDB() override;
467
468 int64_t GetOldestKeyPoolTime() const override;
469 size_t KeypoolCountExternalKeys() const override;
470 unsigned int GetKeyPoolSize() const override;
471
472 int64_t GetTimeFirstKey() const override;
473
474 std::unique_ptr<CKeyMetadata>
475 GetMetadata(const CTxDestination &dest) const override;
476
477 bool CanGetAddresses(bool internal = false) const override;
478
479 std::unique_ptr<SigningProvider>
480 GetSolvingProvider(const CScript &script) const override;
481
482 bool CanProvide(const CScript &script, SignatureData &sigdata) override;
483
484 bool
486 const std::map<COutPoint, Coin> &coins, SigHashType sighash,
487 std::map<int, std::string> &input_errors) const override;
488 SigningResult SignMessage(const std::string &message, const PKHash &pkhash,
489 std::string &str_sig) const override;
492 SigHashType sighash_type = SigHashType().withForkId(),
493 bool sign = true, bool bip32derivs = false) const override;
494
495 uint256 GetID() const override;
496
497 void SetInternal(bool internal) override;
498
499 // Map from Key ID to key metadata.
501
502 // Map from Script ID to key metadata (for watch-only keys).
504
506 bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override;
508 bool LoadKey(const CKey &key, const CPubKey &pubkey);
510 bool AddCryptedKey(const CPubKey &vchPubKey,
511 const std::vector<uint8_t> &vchCryptedSecret);
514 bool LoadCryptedKey(const CPubKey &vchPubKey,
515 const std::vector<uint8_t> &vchCryptedSecret,
516 bool checksum_valid);
517 void UpdateTimeFirstKey(int64_t nCreateTime)
520 bool LoadCScript(const CScript &redeemScript);
522 void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata);
523 void LoadScriptMetadata(const CScriptID &script_id,
524 const CKeyMetadata &metadata);
526 CPubKey GenerateNewKey(WalletBatch &batch, CHDChain &hd_chain,
527 bool internal = false)
529
534 void AddHDChain(const CHDChain &chain);
536 void LoadHDChain(const CHDChain &chain);
537 const CHDChain &GetHDChain() const { return m_hd_chain; }
538 void AddInactiveHDChain(const CHDChain &chain);
539
542 bool LoadWatchOnly(const CScript &dest);
544 bool HaveWatchOnly(const CScript &dest) const;
546 bool HaveWatchOnly() const;
548 bool RemoveWatchOnly(const CScript &dest);
549 bool AddWatchOnly(const CScript &dest, int64_t nCreateTime)
551
553 bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
554
555 /* SigningProvider overrides */
556 bool HaveKey(const CKeyID &address) const override;
557 bool GetKey(const CKeyID &address, CKey &keyOut) const override;
558 bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override;
559 bool AddCScript(const CScript &redeemScript) override;
560 bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override;
561
563 void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
564 bool NewKeyPool();
566
567 bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp)
569 bool ImportPrivKeys(const std::map<CKeyID, CKey> &privkey_map,
570 const int64_t timestamp)
572 bool ImportPubKeys(
573 const std::vector<CKeyID> &ordered_pubkeys,
574 const std::map<CKeyID, CPubKey> &pubkey_map,
575 const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> &key_origins,
576 const bool add_keypool, const bool internal, const int64_t timestamp)
578 bool ImportScriptPubKeys(const std::set<CScript> &script_pub_keys,
579 const bool have_solving_data,
580 const int64_t timestamp)
582
583 /* Returns true if the wallet can generate new keys */
584 bool CanGenerateKeys() const;
585
586 /* Generates a new HD seed (will not be activated) */
588
589 /* Derives a new HD seed (will not be activated) */
590 CPubKey DeriveNewSeed(const CKey &key);
591
592 /* Set the current HD seed (will reset the chain child index counters)
593 Sets the seed's version based on the current wallet version (so the
594 caller must ensure the current wallet version is correct before calling
595 this function). */
596 void SetHDSeed(const CPubKey &key);
597
604 void LearnRelatedScripts(const CPubKey &key, OutputType);
605
610 void LearnAllRelatedScripts(const CPubKey &key);
611
615 void MarkReserveKeysAsUsed(int64_t keypool_id)
617 const std::map<CKeyID, int64_t> &GetAllReserveKeys() const {
618 return m_pool_key_to_index;
619 }
620
621 std::set<CKeyID> GetKeys() const override;
622};
623
629private:
631
632public:
634 : m_spk_man(spk_man) {}
635
636 bool GetCScript(const CScriptID &scriptid, CScript &script) const override {
637 return m_spk_man.GetCScript(scriptid, script);
638 }
639 bool HaveCScript(const CScriptID &scriptid) const override {
640 return m_spk_man.HaveCScript(scriptid);
641 }
642 bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const override {
643 return m_spk_man.GetPubKey(address, pubkey);
644 }
645 bool GetKey(const CKeyID &address, CKey &key) const override {
646 return false;
647 }
648 bool HaveKey(const CKeyID &address) const override { return false; }
649 bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override {
650 return m_spk_man.GetKeyOrigin(keyid, info);
651 }
652};
653
655private:
657
658 // Map of scripts to descriptor range index
659 using ScriptPubKeyMap = std::map<CScript, int32_t>;
660 // Map of pubkeys involved in scripts to descriptor range index
661 using PubKeyMap = std::map<CPubKey, int32_t>;
663 std::map<CKeyID, std::pair<CPubKey, std::vector<uint8_t>>>;
664 using KeyMap = std::map<CKeyID, CKey>;
665
666 ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
668 int32_t m_max_cached_index = -1;
669
670 bool m_internal = false;
671
674
677
678 bool AddDescriptorKeyWithDB(WalletBatch &batch, const CKey &key,
679 const CPubKey &pubkey)
681
683
684 // Fetch the SigningProvider for the given script and optionally include
685 // private keys
686 std::unique_ptr<FlatSigningProvider>
687 GetSigningProvider(const CScript &script,
688 bool include_private = false) const;
689 // Fetch the SigningProvider for the given pubkey and always include private
690 // keys. This should only be called by signing code.
691 std::unique_ptr<FlatSigningProvider>
692 GetSigningProvider(const CPubKey &pubkey) const;
693 // Fetch the SigningProvider for a given index and optionally include
694 // private keys. Called by the above functions.
695 std::unique_ptr<FlatSigningProvider>
696 GetSigningProvider(int32_t index, bool include_private = false) const
698
699public:
701 WalletDescriptor &descriptor)
702 : ScriptPubKeyMan(storage), m_wallet_descriptor(descriptor) {}
704 : ScriptPubKeyMan(storage), m_internal(internal) {}
705
707
708 bool GetNewDestination(const OutputType type, CTxDestination &dest,
709 std::string &error) override;
710 isminetype IsMine(const CScript &script) const override;
711
712 bool CheckDecryptionKey(const CKeyingMaterial &master_key,
713 bool accept_no_keys = false) override;
714 bool Encrypt(const CKeyingMaterial &master_key,
715 WalletBatch *batch) override;
716
717 bool GetReservedDestination(const OutputType type, bool internal,
718 CTxDestination &address, int64_t &index,
719 CKeyPool &keypool) override;
720 void ReturnDestination(int64_t index, bool internal,
721 const CTxDestination &addr) override;
722
723 // Tops up the descriptor cache and m_map_script_pub_keys. The cache is
724 // stored in the wallet file and is used to expand the descriptor in
725 // GetNewDestination. DescriptorScriptPubKeyMan relies more on ephemeral
726 // data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
727 // (with or without private keys), the "keypool" is a single xpub.
728 bool TopUp(unsigned int size = 0) override;
729
730 void MarkUnusedAddresses(const CScript &script) override;
731
732 bool IsHDEnabled() const override;
733
735 bool SetupDescriptorGeneration(const CExtKey &master_key,
736 OutputType addr_type);
737
738 bool HavePrivateKeys() const override;
739
740 int64_t GetOldestKeyPoolTime() const override;
741 size_t KeypoolCountExternalKeys() const override;
742 unsigned int GetKeyPoolSize() const override;
743
744 int64_t GetTimeFirstKey() const override;
745
746 std::unique_ptr<CKeyMetadata>
747 GetMetadata(const CTxDestination &dest) const override;
748
749 bool CanGetAddresses(bool internal = false) const override;
750
751 std::unique_ptr<SigningProvider>
752 GetSolvingProvider(const CScript &script) const override;
753
754 bool CanProvide(const CScript &script, SignatureData &sigdata) override;
755
756 bool
758 const std::map<COutPoint, Coin> &coins, SigHashType sighash,
759 std::map<int, std::string> &input_errors) const override;
760 SigningResult SignMessage(const std::string &message, const PKHash &pkhash,
761 std::string &str_sig) const override;
764 SigHashType sighash_type = SigHashType().withForkId(),
765 bool sign = true, bool bip32derivs = false) const override;
766
767 uint256 GetID() const override;
768
769 void SetInternal(bool internal) override;
770
771 void SetCache(const DescriptorCache &cache);
772
773 bool AddKey(const CKeyID &key_id, const CKey &key);
774 bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey,
775 const std::vector<uint8_t> &crypted_key);
776
777 bool HasWalletDescriptor(const WalletDescriptor &desc) const;
779 bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor,
780 std::string &error);
781 void AddDescriptorKey(const CKey &key, const CPubKey &pubkey);
782 void WriteDescriptor();
783
786 const std::vector<CScript> GetScriptPubKeys() const;
787};
788
789#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 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: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
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 GetNewDestination(const OutputType type, CTxDestination &dest, std::string &error) override
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
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 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 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
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 bool WithEncryptionKey(const std::function< bool(const CKeyingMaterial &)> &cb) const =0
Pass the encryption key to cb().
virtual WalletDatabase & GetDatabase()=0
virtual bool IsLocked() 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 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
bool error(const char *fmt, const Args &...args)
Definition: logging.h:226
#define LogPrintf(...)
Definition: logging.h:207
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)
@ 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: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:109
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:14