Bitcoin Core 29.99.0
P2P Digital Currency
scriptpubkeyman.h
Go to the documentation of this file.
1// Copyright (c) 2019-2022 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 <addresstype.h>
9#include <common/messages.h>
10#include <common/signmessage.h>
11#include <common/types.h>
12#include <logging.h>
13#include <node/types.h>
14#include <psbt.h>
15#include <script/descriptor.h>
16#include <script/script.h>
18#include <util/result.h>
19#include <util/time.h>
20#include <wallet/crypter.h>
21#include <wallet/types.h>
22#include <wallet/walletdb.h>
23#include <wallet/walletutil.h>
24
25#include <boost/signals2/signal.hpp>
26
27#include <functional>
28#include <optional>
29#include <unordered_map>
30
31enum class OutputType;
32
33namespace wallet {
34struct MigrationData;
35class ScriptPubKeyMan;
36
37// Wallet storage things that ScriptPubKeyMans need in order to be able to store things to the wallet database.
38// It provides access to things that are part of the entire wallet and not specific to a ScriptPubKeyMan such as
39// wallet flags, wallet version, encryption keys, encryption status, and the database itself. This allows a
40// ScriptPubKeyMan to have callbacks into CWallet without causing a circular dependency.
41// WalletStorage should be the same for all ScriptPubKeyMans of a wallet.
43{
44public:
45 virtual ~WalletStorage() = default;
46 virtual std::string GetDisplayName() const = 0;
47 virtual WalletDatabase& GetDatabase() const = 0;
48 virtual bool IsWalletFlagSet(uint64_t) const = 0;
50 virtual bool CanSupportFeature(enum WalletFeature) const = 0;
51 virtual void SetMinVersion(enum WalletFeature, WalletBatch* = nullptr) = 0;
53 virtual bool WithEncryptionKey(std::function<bool (const CKeyingMaterial&)> cb) const = 0;
54 virtual bool HasEncryptionKeys() const = 0;
55 virtual bool IsLocked() const = 0;
57 virtual void TopUpCallback(const std::set<CScript>&, ScriptPubKeyMan*) = 0;
58};
59
61static constexpr int64_t UNKNOWN_TIME = std::numeric_limits<int64_t>::max();
62
64static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
65
66std::vector<CKeyID> GetAffectedKeys(const CScript& spk, const SigningProvider& provider);
67
69{
71 std::optional<bool> internal;
72};
73
74/*
75 * A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
76 * It contains the scripts and keys related to the scriptPubKeys it manages.
77 * A ScriptPubKeyMan will be able to give out scriptPubKeys to be used, as well as marking
78 * when a scriptPubKey has been used. It also handles when and how to store a scriptPubKey
79 * and its related scripts and keys, including encryption.
80 */
82{
83protected:
85
86public:
87 explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
88 virtual ~ScriptPubKeyMan() = default;
89 virtual util::Result<CTxDestination> GetNewDestination(const OutputType type) { return util::Error{Untranslated("Not supported")}; }
90 virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
91
93 virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key) { return false; }
94 virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
95
96 virtual util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index) { return util::Error{Untranslated("Not supported")}; }
97 virtual void KeepDestination(int64_t index, const OutputType& type) {}
98 virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
99
104 virtual bool TopUp(unsigned int size = 0) { return false; }
105
113 virtual std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) { return {}; }
114
119 virtual bool SetupGeneration(bool force = false) { return false; }
120
121 /* Returns true if HD is enabled */
122 virtual bool IsHDEnabled() const { return false; }
123
124 /* Returns true if the wallet can give out new addresses. This means it has keys in the keypool or can generate new keys */
125 virtual bool CanGetAddresses(bool internal = false) const { return false; }
126
128 virtual bool Upgrade(int prev_version, int new_version, bilingual_str& error) { return true; }
129
130 virtual bool HavePrivateKeys() const { return false; }
131 virtual bool HaveCryptedKeys() const { return false; }
132
134 virtual void RewriteDB() {}
135
136 virtual std::optional<int64_t> GetOldestKeyPoolTime() const { return GetTime(); }
137
138 virtual unsigned int GetKeyPoolSize() const { return 0; }
139
140 virtual int64_t GetTimeFirstKey() const { return 0; }
141
142 virtual std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const { return nullptr; }
143
144 virtual std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const { return nullptr; }
145
149 virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
150
152 virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const { return false; }
154 virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
156 virtual std::optional<common::PSBTError> FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = SIGHASH_DEFAULT, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr, bool finalize = true) const { return common::PSBTError::UNSUPPORTED; }
157
158 virtual uint256 GetID() const { return uint256(); }
159
161 virtual std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const { return {}; };
162
164 template <typename... Params>
165 void WalletLogPrintf(util::ConstevalFormatString<sizeof...(Params)> wallet_fmt, const Params&... params) const
166 {
167 LogInfo("%s %s", m_storage.GetDisplayName(), tfm::format(wallet_fmt, params...));
168 };
169
171 boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
172
174 boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
175
177 boost::signals2::signal<void (const ScriptPubKeyMan* spkm, int64_t new_birth_time)> NotifyFirstKeyTimeChanged;
178};
179
181static const std::unordered_set<OutputType> LEGACY_OUTPUT_TYPES {
185};
186
187// Manages the data for a LegacyScriptPubKeyMan.
188// This is the minimum necessary to load a legacy wallet so that it can be migrated.
190{
191private:
192 using WatchOnlySet = std::set<CScript>;
193 using WatchKeyMap = std::map<CKeyID, CPubKey>;
194 using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
195
199
200 /* the HD chain data model (external chain counters) */
202 std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
203
206
207 bool AddWatchOnlyInMem(const CScript &dest);
208 virtual bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
209 bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
210
211 // Helper function to retrieve a conservative superset of all output scripts that may be relevant to this LegacyDataSPKM.
212 // It may include scripts that are invalid or not actually watched by this LegacyDataSPKM.
213 // Used only in migration.
214 std::unordered_set<CScript, SaltedSipHasher> GetCandidateScriptPubKeys() const;
215
216 isminetype IsMine(const CScript& script) const override;
217 bool CanProvide(const CScript& script, SignatureData& sigdata) override;
218public:
220
221 // Map from Key ID to key metadata.
222 std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
223
224 // Map from Script ID to key metadata (for watch-only keys).
225 std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
226
227 // ScriptPubKeyMan overrides
228 bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
229 std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
230 std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
231 uint256 GetID() const override { return uint256::ONE; }
232
233 // FillableSigningProvider overrides
234 bool HaveKey(const CKeyID &address) const override;
235 bool GetKey(const CKeyID &address, CKey& keyOut) const override;
236 bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
237 bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
238
240 virtual void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
241 virtual void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
242
244 bool LoadWatchOnly(const CScript &dest);
246 bool HaveWatchOnly(const CScript &dest) const;
248 bool HaveWatchOnly() const;
250 bool LoadKey(const CKey& key, const CPubKey &pubkey);
252 bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
254 bool LoadCScript(const CScript& redeemScript);
256 void LoadHDChain(const CHDChain& chain);
257 void AddInactiveHDChain(const CHDChain& chain);
258 const CHDChain& GetHDChain() const { return m_hd_chain; }
259
261 bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
262
267 std::unordered_set<CScript, SaltedSipHasher> GetNotMineScriptPubKeys() const;
268
271 std::optional<MigrationData> MigrateToDescriptor();
273 bool DeleteRecords();
274 bool DeleteRecordsWithDB(WalletBatch& batch);
275};
276
279{
280private:
282public:
283 explicit LegacySigningProvider(const LegacyDataSPKM& spk_man) : m_spk_man(spk_man) {}
284
285 bool GetCScript(const CScriptID &scriptid, CScript& script) const override { return m_spk_man.GetCScript(scriptid, script); }
286 bool HaveCScript(const CScriptID &scriptid) const override { return m_spk_man.HaveCScript(scriptid); }
287 bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const override { return m_spk_man.GetPubKey(address, pubkey); }
288 bool GetKey(const CKeyID &address, CKey& key) const override { return false; }
289 bool HaveKey(const CKeyID &address) const override { return false; }
290 bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override { return m_spk_man.GetKeyOrigin(keyid, info); }
291};
292
294{
295 friend class LegacyDataSPKM;
296private:
297 using ScriptPubKeyMap = std::map<CScript, int32_t>; // Map of scripts to descriptor range index
298 using PubKeyMap = std::map<CPubKey, int32_t>; // Map of pubkeys involved in scripts to descriptor range index
299 using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
300 using KeyMap = std::map<CKeyID, CKey>;
301
302 ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
304 int32_t m_max_cached_index = -1;
305
308
311
314
316
318
319 // Cached FlatSigningProviders to avoid regenerating them each time they are needed.
321 // Fetch the SigningProvider for the given script and optionally include private keys
322 std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CScript& script, bool include_private = false) const;
323 // Fetch the SigningProvider for a given index and optionally include private keys. Called by the above functions.
324 std::unique_ptr<FlatSigningProvider> GetSigningProvider(int32_t index, bool include_private = false) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
325
326protected:
328
330 bool TopUpWithDB(WalletBatch& batch, unsigned int size = 0);
331
332public:
333 DescriptorScriptPubKeyMan(WalletStorage& storage, WalletDescriptor& descriptor, int64_t keypool_size)
334 : ScriptPubKeyMan(storage),
335 m_keypool_size(keypool_size),
336 m_wallet_descriptor(descriptor)
337 {}
338 DescriptorScriptPubKeyMan(WalletStorage& storage, int64_t keypool_size)
339 : ScriptPubKeyMan(storage),
340 m_keypool_size(keypool_size)
341 {}
342
344
346 isminetype IsMine(const CScript& script) const override;
347
348 bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
349 bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
350
351 util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index) override;
352 void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
353
354 // Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
355 // and is used to expand the descriptor in GetNewDestination. DescriptorScriptPubKeyMan relies
356 // more on ephemeral data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
357 // (with or without private keys), the "keypool" is a single xpub.
358 bool TopUp(unsigned int size = 0) override;
359
360 std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
361
362 bool IsHDEnabled() const override;
363
365 bool SetupDescriptorGeneration(WalletBatch& batch, const CExtKey& master_key, OutputType addr_type, bool internal);
366
367 bool HavePrivateKeys() const override;
368 bool HasPrivKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
370 std::optional<CKey> GetKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
371 bool HaveCryptedKeys() const override;
372
373 std::optional<int64_t> GetOldestKeyPoolTime() const override;
374 unsigned int GetKeyPoolSize() const override;
375
376 int64_t GetTimeFirstKey() const override;
377
378 std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
379
380 bool CanGetAddresses(bool internal = false) const override;
381
382 std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
383
384 bool CanProvide(const CScript& script, SignatureData& sigdata) override;
385
386 // Fetch the SigningProvider for the given pubkey and always include private keys. This should only be called by signing code.
387 std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CPubKey& pubkey) const;
388
389 bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
390 SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
391 std::optional<common::PSBTError> FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = SIGHASH_DEFAULT, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr, bool finalize = true) const override;
392
393 uint256 GetID() const override;
394
395 void SetCache(const DescriptorCache& cache);
396
397 bool AddKey(const CKeyID& key_id, const CKey& key);
398 bool AddCryptedKey(const CKeyID& key_id, const CPubKey& pubkey, const std::vector<unsigned char>& crypted_key);
399
400 bool HasWalletDescriptor(const WalletDescriptor& desc) const;
402 bool CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error);
403 void AddDescriptorKey(const CKey& key, const CPubKey &pubkey);
404 void WriteDescriptor();
405
407 std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
408 std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys(int32_t minimum_index) const;
409 int32_t GetEndRange() const;
410
411 [[nodiscard]] bool GetDescriptorString(std::string& out, const bool priv) const;
412
414};
415
418{
420 std::vector<std::pair<std::string, int64_t>> watch_descs;
421 std::vector<std::pair<std::string, int64_t>> solvable_descs;
422 std::vector<std::unique_ptr<DescriptorScriptPubKeyMan>> desc_spkms;
423 std::shared_ptr<CWallet> watchonly_wallet{nullptr};
424 std::shared_ptr<CWallet> solvable_wallet{nullptr};
425};
426
427} // namespace wallet
428
429#endif // BITCOIN_WALLET_SCRIPTPUBKEYMAN_H
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
Definition: addresstype.h:143
const CChainParams & Params()
Return the currently selected parameters.
An encapsulated private key.
Definition: key.h:35
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:24
An encapsulated public key.
Definition: pubkey.h:34
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:415
A reference to a CScript: the Hash160 of its serialization.
Definition: script.h:602
Cache for single descriptor's derived extended pubkeys.
Definition: descriptor.h:19
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
An interface to be implemented by keystores that support signing.
256-bit opaque blob.
Definition: uint256.h:196
static const uint256 ONE
Definition: uint256.h:205
KeyMap GetKeys() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
std::optional< common::PSBTError > FillPSBT(PartiallySignedTransaction &psbt, const PrecomputedTransactionData &txdata, int sighash_type=SIGHASH_DEFAULT, bool sign=true, bool bip32derivs=false, int *n_signed=nullptr, bool finalize=true) const override
Adds script and derivation path information to a PSBT, and optionally signs it.
void SetCache(const DescriptorCache &cache)
std::map< int32_t, FlatSigningProvider > m_map_signing_providers
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
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.
std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const override
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
WalletDescriptor GetWalletDescriptor() const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
std::map< CScript, int32_t > ScriptPubKeyMap
std::optional< CKey > GetKey(const CKeyID &keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
Retrieve the particular key if it is available. Returns nullopt if the key is not in the wallet,...
bool AddCryptedKey(const CKeyID &key_id, const CPubKey &pubkey, const std::vector< unsigned char > &crypted_key)
bool SetupDescriptorGeneration(WalletBatch &batch, const CExtKey &master_key, OutputType addr_type, bool internal)
Setup descriptors based on the given CExtkey.
bool TopUp(unsigned int size=0) override
Fills internal address pool.
bool m_decryption_thoroughly_checked
keeps track of whether Unlock has run a thorough check before
std::map< CKeyID, CKey > KeyMap
unsigned int GetKeyPoolSize() const override
int64_t GetTimeFirstKey() const override
std::unique_ptr< FlatSigningProvider > GetSigningProvider(const CScript &script, bool include_private=false) const
std::map< CPubKey, int32_t > PubKeyMap
bool CheckDecryptionKey(const CKeyingMaterial &master_key) override
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
bool CanGetAddresses(bool internal=false) const override
ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man)
bool CanUpdateToWalletDescriptor(const WalletDescriptor &descriptor, std::string &error)
bool GetDescriptorString(std::string &out, const bool priv) const
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
void AddDescriptorKey(const CKey &key, const CPubKey &pubkey)
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
DescriptorScriptPubKeyMan(WalletStorage &storage, int64_t keypool_size)
int64_t m_keypool_size GUARDED_BY(cs_desc_man)
Number of pre-generated keys/scripts (part of the look-ahead process, used to detect payments)
bool AddKey(const CKeyID &key_id, const CKey &key)
util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index) override
PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man)
util::Result< void > UpdateWalletDescriptor(WalletDescriptor &descriptor)
bool TopUpWithDB(WalletBatch &batch, unsigned int size=0)
Same as 'TopUp' but designed for use within a batch transaction context.
void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr) override
std::vector< WalletDestination > MarkUnusedAddresses(const CScript &script) override
Mark unused addresses as being used Affects all keys up to and including the one determined by provid...
CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man)
bool AddDescriptorKeyWithDB(WalletBatch &batch, const CKey &key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
bool HasWalletDescriptor(const WalletDescriptor &desc) const
std::optional< int64_t > GetOldestKeyPoolTime() const override
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
util::Result< CTxDestination > GetNewDestination(const OutputType type) override
isminetype IsMine(const CScript &script) const override
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > > > CryptedKeyMap
bool HasPrivKey(const CKeyID &keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man)
KeyMap m_map_keys GUARDED_BY(cs_desc_man)
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
bool DeleteRecordsWithDB(WalletBatch &batch)
std::set< CScript > WatchOnlySet
WatchKeyMap mapWatchKeys GUARDED_BY(cs_KeyStore)
isminetype IsMine(const CScript &script) const override
std::optional< MigrationData > MigrateToDescriptor()
Get the DescriptorScriptPubKeyMans (with private keys) that have the same scriptPubKeys as this Legac...
virtual bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey)
uint256 GetID() const override
bool DeleteRecords()
Delete all the records of this LegacyScriptPubKeyMan from disk.
std::unordered_set< CScript, SaltedSipHasher > GetCandidateScriptPubKeys() const
virtual void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata)
Load metadata (used by LoadWallet)
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)
WatchOnlySet setWatchOnly GUARDED_BY(cs_KeyStore)
std::map< CKeyID, CKeyMetadata > mapKeyMetadata GUARDED_BY(cs_KeyStore)
void AddInactiveHDChain(const CHDChain &chain)
bool HaveWatchOnly() const
Returns whether there are any watch-only things in the wallet.
bool fDecryptionThoroughlyChecked
keeps track of whether Unlock has run a thorough check before
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
std::map< CScriptID, CKeyMetadata > m_script_metadata GUARDED_BY(cs_KeyStore)
bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override
const CHDChain & GetHDChain() const
std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const override
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
CryptedKeyMap mapCryptedKeys GUARDED_BY(cs_KeyStore)
std::map< CKeyID, CPubKey > WatchKeyMap
std::unordered_set< CScript, SaltedSipHasher > GetNotMineScriptPubKeys() const
Retrieves scripts that were imported by bugs into the legacy spkm and are simply invalid,...
bool LoadKey(const CKey &key, const CPubKey &pubkey)
Adds a key to the store, without saving it to disk (used by LoadWallet)
bool AddWatchOnlyInMem(const CScript &dest)
bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const
Fetches a pubkey from mapWatchKeys if it exists there.
bool CheckDecryptionKey(const CKeyingMaterial &master_key) override
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > > > CryptedKeyMap
bool GetKey(const CKeyID &address, CKey &keyOut) const override
bool LoadCScript(const CScript &redeemScript)
Adds a CScript to the store.
virtual void LoadScriptMetadata(const CScriptID &script_id, const CKeyMetadata &metadata)
std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const override
bool CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
std::unordered_map< CKeyID, CHDChain, SaltedSipHasher > m_inactive_hd_chains
bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
bool LoadWatchOnly(const CScript &dest)
Adds a watch-only address to the store, without saving it to disk (used by LoadWallet)
bool HaveKey(const CKeyID &address) const override
void LoadHDChain(const CHDChain &chain)
Load a HD chain model (used by LoadWallet)
Wraps a LegacyScriptPubKeyMan so that it can be returned in a new unique_ptr.
const LegacyDataSPKM & m_spk_man
bool HaveKey(const CKeyID &address) const override
bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const override
bool GetKey(const CKeyID &address, CKey &key) const override
bool HaveCScript(const CScriptID &scriptid) const override
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
LegacySigningProvider(const LegacyDataSPKM &spk_man)
virtual ~ScriptPubKeyMan()=default
virtual uint256 GetID() const
virtual unsigned int GetKeyPoolSize() const
virtual int64_t GetTimeFirstKey() const
virtual bool TopUp(unsigned int size=0)
Fills internal address pool.
virtual void KeepDestination(int64_t index, const OutputType &type)
virtual bool Upgrade(int prev_version, int new_version, bilingual_str &error)
Upgrades the wallet to the specified version.
boost::signals2::signal< void(bool fHaveWatchOnly)> NotifyWatchonlyChanged
Watch-only address added.
virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination &addr)
virtual std::optional< int64_t > GetOldestKeyPoolTime() const
ScriptPubKeyMan(WalletStorage &storage)
virtual std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const
virtual std::unordered_set< CScript, SaltedSipHasher > GetScriptPubKeys() const
Returns a set of all the scriptPubKeys that this ScriptPubKeyMan watches.
virtual SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const
Sign a message with the given script.
boost::signals2::signal< void(const ScriptPubKeyMan *spkm, int64_t new_birth_time)> NotifyFirstKeyTimeChanged
Birth time changed.
virtual void RewriteDB()
The action to do when the DB needs rewrite.
virtual isminetype IsMine(const CScript &script) const
virtual bool HaveCryptedKeys() const
virtual std::optional< common::PSBTError > FillPSBT(PartiallySignedTransaction &psbt, const PrecomputedTransactionData &txdata, int sighash_type=SIGHASH_DEFAULT, bool sign=true, bool bip32derivs=false, int *n_signed=nullptr, bool finalize=true) const
Adds script and derivation path information to a PSBT, and optionally signs it.
virtual bool HavePrivateKeys() const
virtual bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch)
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 CanProvide(const CScript &script, SignatureData &sigdata)
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
virtual util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index)
virtual bool SetupGeneration(bool force=false)
Sets up the key generation stuff, i.e.
virtual util::Result< CTxDestination > GetNewDestination(const OutputType type)
virtual bool CheckDecryptionKey(const CKeyingMaterial &master_key)
Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the ke...
boost::signals2::signal< void()> NotifyCanGetAddressesChanged
Keypool has new keys.
virtual std::unique_ptr< SigningProvider > GetSolvingProvider(const CScript &script) const
virtual std::vector< WalletDestination > MarkUnusedAddresses(const CScript &script)
Mark unused addresses as being used Affects all keys up to and including the one determined by provid...
virtual bool IsHDEnabled() const
void WalletLogPrintf(util::ConstevalFormatString< sizeof...(Params)> wallet_fmt, const Params &... params) const
Prepends the wallet name in logging output to ease debugging in multi-wallet use cases.
virtual bool CanGetAddresses(bool internal=false) const
WalletStorage & m_storage
Access to the wallet database.
Definition: walletdb.h:189
An instance of this class represents one database.
Definition: db.h:130
Descriptor with some wallet metadata.
Definition: walletutil.h:85
virtual bool IsWalletFlagSet(uint64_t) const =0
virtual void TopUpCallback(const std::set< CScript > &, ScriptPubKeyMan *)=0
Callback function for after TopUp completes containing any scripts that were added by a SPKMan.
virtual void SetMinVersion(enum WalletFeature, WalletBatch *=nullptr)=0
virtual bool CanSupportFeature(enum WalletFeature) const =0
virtual std::string GetDisplayName() const =0
virtual WalletDatabase & GetDatabase() const =0
virtual void UnsetBlankWalletFlag(WalletBatch &)=0
virtual bool IsLocked() const =0
virtual ~WalletStorage()=default
virtual bool HasEncryptionKeys() const =0
virtual bool WithEncryptionKey(std::function< bool(const CKeyingMaterial &)> cb) const =0
Pass the encryption key to cb().
is a home for simple enum and struct type definitions that can be used internally by functions in the...
@ SIGHASH_DEFAULT
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
Definition: interpreter.h:35
#define LogInfo(...)
Definition: logging.h:261
is a home for simple string functions returning descriptive messages that are used in RPC and GUI int...
static int sign(const secp256k1_context *ctx, struct signer_secrets *signer_secrets, struct signer *signer, const secp256k1_musig_keyagg_cache *cache, const unsigned char *msg32, unsigned char *sig64)
Definition: musig.c:105
void format(std::ostream &out, FormatStringCheck< sizeof...(Args)> fmt, const Args &... args)
Format list of arguments to the stream according to given format string.
Definition: tinyformat.h:1079
std::vector< unsigned char, secure_allocator< unsigned char > > CKeyingMaterial
Definition: crypter.h:63
std::vector< CKeyID > GetAffectedKeys(const CScript &spk, const SigningProvider &provider)
static const unsigned int DEFAULT_KEYPOOL_SIZE
Default for -keypool.
static const std::unordered_set< OutputType > LEGACY_OUTPUT_TYPES
OutputTypes supported by the LegacyScriptPubKeyMan.
static constexpr int64_t UNKNOWN_TIME
Constant representing an unknown spkm creation time.
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
Definition: types.h:41
@ ISMINE_NO
Definition: types.h:42
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:16
is a home for public enum and struct type definitions that are used internally by node code,...
OutputType
Definition: outputtype.h:17
SigningResult
Definition: signmessage.h:43
Definition: key.h:227
A mutable version of CTransaction.
Definition: transaction.h:378
A version of CTransaction with the PSBT format.
Definition: psbt.h:1111
Bilingual messages:
Definition: translation.h:24
A wrapper for a compile-time partially validated format string.
Definition: string.h:92
struct containing information needed for migrating legacy wallets to descriptor wallets
std::vector< std::unique_ptr< DescriptorScriptPubKeyMan > > desc_spkms
std::vector< std::pair< std::string, int64_t > > solvable_descs
std::vector< std::pair< std::string, int64_t > > watch_descs
std::optional< bool > internal
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:82
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition: time.cpp:76
is a home for public enum and struct type definitions that are used by internally by wallet code,...