Bitcoin Core 22.99.0
P2P Digital Currency
scriptpubkeyman.h
Go to the documentation of this file.
1// Copyright (c) 2019-2020 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 <unordered_map>
23
24enum class OutputType;
25struct bilingual_str;
26
27// Wallet storage things that ScriptPubKeyMans need in order to be able to store things to the wallet database.
28// It provides access to things that are part of the entire wallet and not specific to a ScriptPubKeyMan such as
29// wallet flags, wallet version, encryption keys, encryption status, and the database itself. This allows a
30// ScriptPubKeyMan to have callbacks into CWallet without causing a circular dependency.
31// WalletStorage should be the same for all ScriptPubKeyMans of a wallet.
33{
34public:
35 virtual ~WalletStorage() = default;
36 virtual const std::string GetDisplayName() const = 0;
37 virtual WalletDatabase& GetDatabase() const = 0;
38 virtual bool IsWalletFlagSet(uint64_t) const = 0;
40 virtual bool CanSupportFeature(enum WalletFeature) const = 0;
41 virtual void SetMinVersion(enum WalletFeature, WalletBatch* = nullptr) = 0;
42 virtual const CKeyingMaterial& GetEncryptionKey() const = 0;
43 virtual bool HasEncryptionKeys() const = 0;
44 virtual bool IsLocked() const = 0;
45};
46
48static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
49
50std::vector<CKeyID> GetAffectedKeys(const CScript& spk, const SigningProvider& provider);
51
102{
103public:
105 int64_t nTime;
112
113 CKeyPool();
114 CKeyPool(const CPubKey& vchPubKeyIn, bool internalIn);
115
116 template<typename Stream>
117 void Serialize(Stream& s) const
118 {
119 int nVersion = s.GetVersion();
120 if (!(s.GetType() & SER_GETHASH)) {
121 s << nVersion;
122 }
123 s << nTime << vchPubKey << fInternal << m_pre_split;
124 }
125
126 template<typename Stream>
127 void Unserialize(Stream& s)
128 {
129 int nVersion = s.GetVersion();
130 if (!(s.GetType() & SER_GETHASH)) {
131 s >> nVersion;
132 }
133 s >> nTime >> vchPubKey;
134 try {
135 s >> fInternal;
136 } catch (std::ios_base::failure&) {
137 /* flag as external address if we can't read the internal boolean
138 (this will be the case for any wallet before the HD chain split version) */
139 fInternal = false;
140 }
141 try {
142 s >> m_pre_split;
143 } catch (std::ios_base::failure&) {
144 /* flag as postsplit address if we can't read the m_pre_split boolean
145 (this will be the case for any wallet that upgrades to HD chain split) */
146 m_pre_split = false;
147 }
148 }
149};
150
151/*
152 * A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
153 * It contains the scripts and keys related to the scriptPubKeys it manages.
154 * A ScriptPubKeyMan will be able to give out scriptPubKeys to be used, as well as marking
155 * when a scriptPubKey has been used. It also handles when and how to store a scriptPubKey
156 * and its related scripts and keys, including encryption.
157 */
159{
160protected:
162
163public:
164 explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
165 virtual ~ScriptPubKeyMan() {};
166 virtual bool GetNewDestination(const OutputType type, CTxDestination& dest, bilingual_str& error) { return false; }
167 virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
168
170 virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) { return false; }
171 virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
172
173 virtual bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, bilingual_str& error) { return false; }
174 virtual void KeepDestination(int64_t index, const OutputType& type) {}
175 virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
176
181 virtual bool TopUp(unsigned int size = 0) { return false; }
182
184 virtual void MarkUnusedAddresses(const CScript& script) {}
185
190 virtual bool SetupGeneration(bool force = false) { return false; }
191
192 /* Returns true if HD is enabled */
193 virtual bool IsHDEnabled() const { return false; }
194
195 /* Returns true if the wallet can give out new addresses. This means it has keys in the keypool or can generate new keys */
196 virtual bool CanGetAddresses(bool internal = false) const { return false; }
197
199 virtual bool Upgrade(int prev_version, int new_version, bilingual_str& error) { return true; }
200
201 virtual bool HavePrivateKeys() const { return false; }
202
204 virtual void RewriteDB() {}
205
206 virtual int64_t GetOldestKeyPoolTime() const { return GetTime(); }
207
208 virtual unsigned int GetKeyPoolSize() const { return 0; }
209
210 virtual int64_t GetTimeFirstKey() const { return 0; }
211
212 virtual std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const { return nullptr; }
213
214 virtual std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const { return nullptr; }
215
219 virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
220
222 virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const { return false; }
224 virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
226 virtual TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const { return TransactionError::INVALID_PSBT; }
227
228 virtual uint256 GetID() const { return uint256(); }
229
231 template<typename... Params>
232 void WalletLogPrintf(std::string fmt, Params... parameters) const {
233 LogPrintf(("%s " + fmt).c_str(), m_storage.GetDisplayName(), parameters...);
234 };
235
237 boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
238
240 boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
241};
242
244static const std::unordered_set<OutputType> LEGACY_OUTPUT_TYPES {
248};
249
251{
252private:
255
256 using WatchOnlySet = std::set<CScript>;
257 using WatchKeyMap = std::map<CKeyID, CPubKey>;
258
259 WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
260
261 using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
262
266
267 int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = 0;
268
269 bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
270 bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
271
283 bool AddWatchOnlyInMem(const CScript &dest);
285 bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript& dest, int64_t create_time) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
286
288 bool AddKeyPubKeyWithDB(WalletBatch &batch,const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
289
290 void AddKeypoolPubkeyWithDB(const CPubKey& pubkey, const bool internal, WalletBatch& batch);
291
293 bool AddCScriptWithDB(WalletBatch& batch, const CScript& script);
294
296 bool AddKeyOriginWithDB(WalletBatch& batch, const CPubKey& pubkey, const KeyOriginInfo& info);
297
298 /* the HD chain data model (external chain counters) */
300 std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
301
302 /* HD derive new child key (on internal or external chain) */
303 void DeriveNewChildKey(WalletBatch& batch, CKeyMetadata& metadata, CKey& secret, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
304
305 std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
306 std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
307 std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
308 int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
309 std::map<CKeyID, int64_t> m_pool_key_to_index;
310 // Tracks keypool indexes to CKeyIDs of keys that have been taken out of the keypool but may be returned to it
311 std::map<int64_t, CKeyID> m_index_to_reserved_key;
312
314 bool GetKeyFromPool(CPubKey &key, const OutputType type, bool internal = false);
315
330 bool ReserveKeyFromKeyPool(int64_t& nIndex, CKeyPool& keypool, bool fRequestedInternal);
331
342 bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal);
343
344public:
346
347 bool GetNewDestination(const OutputType type, CTxDestination& dest, bilingual_str& error) override;
348 isminetype IsMine(const CScript& script) const override;
349
350 bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
351 bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
352
353 bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, bilingual_str& error) override;
354 void KeepDestination(int64_t index, const OutputType& type) override;
355 void ReturnDestination(int64_t index, bool internal, const CTxDestination&) override;
356
357 bool TopUp(unsigned int size = 0) override;
358
359 void MarkUnusedAddresses(const CScript& script) override;
360
362 void UpgradeKeyMetadata();
363
364 bool IsHDEnabled() const override;
365
366 bool SetupGeneration(bool force = false) override;
367
368 bool Upgrade(int prev_version, int new_version, bilingual_str& error) override;
369
370 bool HavePrivateKeys() const override;
371
372 void RewriteDB() override;
373
374 int64_t GetOldestKeyPoolTime() const override;
375 size_t KeypoolCountExternalKeys() const;
376 unsigned int GetKeyPoolSize() const override;
377
378 int64_t GetTimeFirstKey() const override;
379
380 std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
381
382 bool CanGetAddresses(bool internal = false) const override;
383
384 std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
385
386 bool CanProvide(const CScript& script, SignatureData& sigdata) override;
387
388 bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
389 SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
390 TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const override;
391
392 uint256 GetID() const override;
393
394 // Map from Key ID to key metadata.
395 std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
396
397 // Map from Script ID to key metadata (for watch-only keys).
398 std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
399
401 bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override;
403 bool LoadKey(const CKey& key, const CPubKey &pubkey);
405 bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
407 bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
410 bool LoadCScript(const CScript& redeemScript);
412 void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
413 void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
415 CPubKey GenerateNewKey(WalletBatch& batch, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
416
417 /* Set the HD chain model (chain child index counters) and writes it to the database */
418 void AddHDChain(const CHDChain& chain);
420 void LoadHDChain(const CHDChain& chain);
421 const CHDChain& GetHDChain() const { return m_hd_chain; }
422 void AddInactiveHDChain(const CHDChain& chain);
423
425 bool LoadWatchOnly(const CScript &dest);
427 bool HaveWatchOnly(const CScript &dest) const;
429 bool HaveWatchOnly() const;
431 bool RemoveWatchOnly(const CScript &dest);
432 bool AddWatchOnly(const CScript& dest, int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
433
435 bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
436
437 /* SigningProvider overrides */
438 bool HaveKey(const CKeyID &address) const override;
439 bool GetKey(const CKeyID &address, CKey& keyOut) const override;
440 bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
441 bool AddCScript(const CScript& redeemScript) override;
442 bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
443
445 void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
446 bool NewKeyPool();
448
449 bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
450 bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
451 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);
452 bool ImportScriptPubKeys(const std::set<CScript>& script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
453
454 /* Returns true if the wallet can generate new keys */
455 bool CanGenerateKeys() const;
456
457 /* Generates a new HD seed (will not be activated) */
459
460 /* Derives a new HD seed (will not be activated) */
461 CPubKey DeriveNewSeed(const CKey& key);
462
463 /* Set the current HD seed (will reset the chain child index counters)
464 Sets the seed's version based on the current wallet version (so the
465 caller must ensure the current wallet version is correct before calling
466 this function). */
467 void SetHDSeed(const CPubKey& key);
468
475 void LearnRelatedScripts(const CPubKey& key, OutputType);
476
481 void LearnAllRelatedScripts(const CPubKey& key);
482
487 const std::map<CKeyID, int64_t>& GetAllReserveKeys() const { return m_pool_key_to_index; }
488
489 std::set<CKeyID> GetKeys() const override;
490};
491
494{
495private:
497public:
498 explicit LegacySigningProvider(const LegacyScriptPubKeyMan& spk_man) : m_spk_man(spk_man) {}
499
500 bool GetCScript(const CScriptID &scriptid, CScript& script) const override { return m_spk_man.GetCScript(scriptid, script); }
501 bool HaveCScript(const CScriptID &scriptid) const override { return m_spk_man.HaveCScript(scriptid); }
502 bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const override { return m_spk_man.GetPubKey(address, pubkey); }
503 bool GetKey(const CKeyID &address, CKey& key) const override { return false; }
504 bool HaveKey(const CKeyID &address) const override { return false; }
505 bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override { return m_spk_man.GetKeyOrigin(keyid, info); }
506};
507
509{
510private:
511 using ScriptPubKeyMap = std::map<CScript, int32_t>; // Map of scripts to descriptor range index
512 using PubKeyMap = std::map<CPubKey, int32_t>; // Map of pubkeys involved in scripts to descriptor range index
513 using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
514 using KeyMap = std::map<CKeyID, CKey>;
515
516 ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
518 int32_t m_max_cached_index = -1;
519
522
525
527
529
530 // Fetch the SigningProvider for the given script and optionally include private keys
531 std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CScript& script, bool include_private = false) const;
532 // Fetch the SigningProvider for the given pubkey and always include private keys. This should only be called by signing code.
533 std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CPubKey& pubkey) const;
534 // Fetch the SigningProvider for a given index and optionally include private keys. Called by the above functions.
535 std::unique_ptr<FlatSigningProvider> GetSigningProvider(int32_t index, bool include_private = false) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
536
537protected:
539
540public:
542 : ScriptPubKeyMan(storage),
543 m_wallet_descriptor(descriptor)
544 {}
546 : ScriptPubKeyMan(storage)
547 {}
548
550
551 bool GetNewDestination(const OutputType type, CTxDestination& dest, bilingual_str& error) override;
552 isminetype IsMine(const CScript& script) const override;
553
554 bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
555 bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
556
557 bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, bilingual_str& error) override;
558 void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
559
560 // Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
561 // and is used to expand the descriptor in GetNewDestination. DescriptorScriptPubKeyMan relies
562 // more on ephemeral data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
563 // (with or without private keys), the "keypool" is a single xpub.
564 bool TopUp(unsigned int size = 0) override;
565
566 void MarkUnusedAddresses(const CScript& script) override;
567
568 bool IsHDEnabled() const override;
569
571 bool SetupDescriptorGeneration(const CExtKey& master_key, OutputType addr_type, bool internal);
572
576 bool SetupDescriptor(std::unique_ptr<Descriptor>desc);
577
578 bool HavePrivateKeys() const override;
579
580 int64_t GetOldestKeyPoolTime() const override;
581 unsigned int GetKeyPoolSize() const override;
582
583 int64_t GetTimeFirstKey() const override;
584
585 std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
586
587 bool CanGetAddresses(bool internal = false) const override;
588
589 std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
590
591 bool CanProvide(const CScript& script, SignatureData& sigdata) override;
592
593 bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
594 SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
595 TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const override;
596
597 uint256 GetID() const override;
598
599 void SetCache(const DescriptorCache& cache);
600
601 bool AddKey(const CKeyID& key_id, const CKey& key);
602 bool AddCryptedKey(const CKeyID& key_id, const CPubKey& pubkey, const std::vector<unsigned char>& crypted_key);
603
604 bool HasWalletDescriptor(const WalletDescriptor& desc) const;
606 bool CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error);
607 void AddDescriptorKey(const CKey& key, const CPubKey &pubkey);
608 void WriteDescriptor();
609
611 const std::vector<CScript> GetScriptPubKeys() const;
612
613 bool GetDescriptorString(std::string& out, const bool priv) const;
614
616};
617
618#endif // BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
const CChainParams & Params()
Return the currently selected parameters.
An encapsulated private key.
Definition: key.h:27
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:23
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:2929
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
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:27
An encapsulated public key.
Definition: pubkey.h:33
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:406
A reference to a CScript: the Hash160 of its serialization (see script.h)
Definition: standard.h:26
A UTXO entry.
Definition: coins.h:31
Cache for single descriptor's derived extended pubkeys.
Definition: descriptor.h:19
std::map< CPubKey, int32_t > PubKeyMap
int64_t GetOldestKeyPoolTime() const override
void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr) override
bool AddKey(const CKeyID &key_id, const CKey &key)
bool SetupDescriptor(std::unique_ptr< Descriptor >desc)
Provide a descriptor at setup time Returns false if already setup or setup fails, true if setup is su...
void MarkUnusedAddresses(const CScript &script) override
Mark unused addresses as being used.
bool HavePrivateKeys() const override
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)
bool GetNewDestination(const OutputType type, CTxDestination &dest, bilingual_str &error) override
ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man)
bool TopUp(unsigned int size=0) override
Fills internal address pool.
DescriptorScriptPubKeyMan(WalletStorage &storage)
bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey, const std::vector< unsigned char > &crypted_key)
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 SetupDescriptorGeneration(const CExtKey &master_key, OutputType addr_type, bool internal)
Setup descriptors based on the given CExtkey.
unsigned int GetKeyPoolSize() const override
bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, bilingual_str > &input_errors) const override
Creates new signatures and adds them to the transaction.
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
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > > > CryptedKeyMap
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)
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool, bilingual_str &error) override
TransactionError FillPSBT(PartiallySignedTransaction &psbt, const PrecomputedTransactionData &txdata, int sighash_type=1, bool sign=true, bool bip32derivs=false, int *n_signed=nullptr) const override
Adds script and derivation path information to a PSBT, and optionally signs it.
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. it decrypts all of the ke...
bool GetDescriptorString(std::string &out, const bool priv) const
bool IsHDEnabled() const override
bool CanGetAddresses(bool internal=false) const override
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 fDecryptionThoroughlyChecked
keeps track of whether Unlock has run a thorough check before
int64_t GetOldestKeyPoolTime() const 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)
void ReturnDestination(int64_t index, bool internal, const CTxDestination &) override
void SetHDSeed(const CPubKey &key)
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
bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey)
void AddHDChain(const CHDChain &chain)
bool CheckDecryptionKey(const CKeyingMaterial &master_key, bool accept_no_keys=false) override
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool)
Load a keypool entry.
std::map< CKeyID, CPubKey > WatchKeyMap
std::set< CScript > WatchOnlySet
bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
Adds an encrypted key to the store, and saves it to disk.
bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret, bool checksum_valid)
Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
bool 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
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > > > CryptedKeyMap
void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata)
Load metadata (used by LoadWallet)
TransactionError FillPSBT(PartiallySignedTransaction &psbt, const PrecomputedTransactionData &txdata, int sighash_type=1, bool sign=true, bool bip32derivs=false, int *n_signed=nullptr) const override
Adds script and derivation path information to a PSBT, and optionally signs it.
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 Upgrade(int prev_version, int new_version, bilingual_str &error) override
Upgrades the wallet to the specified version.
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 SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, bilingual_str > &input_errors) const override
Creates new signatures and adds them to the transaction.
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.
bool GetNewDestination(const OutputType type, CTxDestination &dest, bilingual_str &error) override
void MarkPreSplitKeys() EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
unsigned int GetKeyPoolSize() const override
bool HavePrivateKeys() const 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 GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool, bilingual_str &error) override
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.
size_t KeypoolCountExternalKeys() const
void RewriteDB() override
The action to do when the DB needs rewrite.
CPubKey DeriveNewSeed(const CKey &key)
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
int64_t GetTimeFirstKey() const override
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
virtual bool TopUp(unsigned int size=0)
Fills internal address pool.
virtual std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const
virtual bool GetNewDestination(const OutputType type, CTxDestination &dest, bilingual_str &error)
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 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 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. it decrypts all of the ke...
virtual bool SignTransaction(CMutableTransaction &tx, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, bilingual_str > &input_errors) const
Creates new signatures and adds them to the transaction.
virtual bool Upgrade(int prev_version, int new_version, bilingual_str &error)
Upgrades the wallet to the specified version.
WalletStorage & m_storage
virtual void KeepDestination(int64_t index, const OutputType &type)
virtual TransactionError FillPSBT(PartiallySignedTransaction &psbt, const PrecomputedTransactionData &txdata, int sighash_type=1, bool sign=true, bool bip32derivs=false, int *n_signed=nullptr) const
Adds script and derivation path information to a PSBT, and optionally signs it.
virtual bool CanGetAddresses(bool internal=false) const
boost::signals2::signal< void()> NotifyCanGetAddressesChanged
Keypool has new keys.
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
boost::signals2::signal< void(bool fHaveWatchOnly)> NotifyWatchonlyChanged
Watch-only address added.
virtual int64_t GetTimeFirstKey() const
ScriptPubKeyMan(WalletStorage &storage)
virtual bool GetReservedDestination(const OutputType type, bool internal, CTxDestination &address, int64_t &index, CKeyPool &keypool, bilingual_str &error)
virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr)
void WalletLogPrintf(std::string fmt, Params... parameters) const
Prepends the wallet name in logging output to ease debugging in multi-wallet use cases.
An interface to be implemented by keystores that support signing.
Access to the wallet database.
Definition: walletdb.h:179
An instance of this class represents one database.
Definition: db.h:104
Descriptor with some wallet metadata.
Definition: walletutil.h:76
virtual bool IsWalletFlagSet(uint64_t) const =0
virtual bool HasEncryptionKeys() const =0
virtual const CKeyingMaterial & GetEncryptionKey() const =0
virtual bool IsLocked() const =0
virtual void SetMinVersion(enum WalletFeature, WalletBatch *=nullptr)=0
virtual void UnsetBlankWalletFlag(WalletBatch &)=0
virtual WalletDatabase & GetDatabase() const =0
virtual const std::string GetDisplayName() const =0
virtual ~WalletStorage()=default
virtual bool CanSupportFeature(enum WalletFeature) const =0
256-bit opaque blob.
Definition: uint256.h:124
std::vector< unsigned char, secure_allocator< unsigned char > > CKeyingMaterial
Definition: crypter.h:61
TransactionError
Definition: error.h:22
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
Definition: ismine.h:39
@ ISMINE_NO
Definition: ismine.h:40
#define LogPrintf(...)
Definition: logging.h:187
SigningResult
Definition: message.h:42
static unsigned const char sighash[]
Definition: sighash.json.h:2
OutputType
Definition: outputtype.h:18
static const unsigned int DEFAULT_KEYPOOL_SIZE
Default for -keypool.
std::vector< CKeyID > GetAffectedKeys(const CScript &spk, const SigningProvider &provider)
static const std::unordered_set< OutputType > LEGACY_OUTPUT_TYPES
OutputTypes supported by the LegacyScriptPubKeyMan.
@ SER_GETHASH
Definition: serialize.h:140
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
Definition: standard.h:157
Definition: key.h:161
A mutable version of CTransaction.
Definition: transaction.h:345
A version of CTransaction with the PSBT format.
Definition: psbt.h:392
Bilingual messages:
Definition: translation.h:16
bool error(const char *fmt, const Args &... args)
Definition: system.h:49
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
int64_t GetTime()
DEPRECATED Use either GetTimeSeconds (not mockable) or GetTime<T> (mockable)
Definition: time.cpp:26
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:15