Bitcoin Core 28.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
118{
119public:
121 int64_t nTime;
128
129 CKeyPool();
130 CKeyPool(const CPubKey& vchPubKeyIn, bool internalIn);
131
132 template<typename Stream>
133 void Serialize(Stream& s) const
134 {
135 s << int{259900}; // Unused field, writes the highest client version ever written
137 }
138
139 template<typename Stream>
140 void Unserialize(Stream& s)
141 {
142 s >> int{}; // Discard unused field
143 s >> nTime >> vchPubKey;
144 try {
145 s >> fInternal;
146 } catch (std::ios_base::failure&) {
147 /* flag as external address if we can't read the internal boolean
148 (this will be the case for any wallet before the HD chain split version) */
149 fInternal = false;
150 }
151 try {
152 s >> m_pre_split;
153 } catch (std::ios_base::failure&) {
154 /* flag as postsplit address if we can't read the m_pre_split boolean
155 (this will be the case for any wallet that upgrades to HD chain split) */
156 m_pre_split = false;
157 }
158 }
159};
160
162{
164 std::optional<bool> internal;
165};
166
167/*
168 * A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
169 * It contains the scripts and keys related to the scriptPubKeys it manages.
170 * A ScriptPubKeyMan will be able to give out scriptPubKeys to be used, as well as marking
171 * when a scriptPubKey has been used. It also handles when and how to store a scriptPubKey
172 * and its related scripts and keys, including encryption.
173 */
175{
176protected:
178
179public:
180 explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
181 virtual ~ScriptPubKeyMan() = default;
182 virtual util::Result<CTxDestination> GetNewDestination(const OutputType type) { return util::Error{Untranslated("Not supported")}; }
183 virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
184
186 virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key) { return false; }
187 virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
188
189 virtual util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) { return util::Error{Untranslated("Not supported")}; }
190 virtual void KeepDestination(int64_t index, const OutputType& type) {}
191 virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
192
197 virtual bool TopUp(unsigned int size = 0) { return false; }
198
206 virtual std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) { return {}; }
207
212 virtual bool SetupGeneration(bool force = false) { return false; }
213
214 /* Returns true if HD is enabled */
215 virtual bool IsHDEnabled() const { return false; }
216
217 /* Returns true if the wallet can give out new addresses. This means it has keys in the keypool or can generate new keys */
218 virtual bool CanGetAddresses(bool internal = false) const { return false; }
219
221 virtual bool Upgrade(int prev_version, int new_version, bilingual_str& error) { return true; }
222
223 virtual bool HavePrivateKeys() const { return false; }
224 virtual bool HaveCryptedKeys() const { return false; }
225
227 virtual void RewriteDB() {}
228
229 virtual std::optional<int64_t> GetOldestKeyPoolTime() const { return GetTime(); }
230
231 virtual unsigned int GetKeyPoolSize() const { return 0; }
232
233 virtual int64_t GetTimeFirstKey() const { return 0; }
234
235 virtual std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const { return nullptr; }
236
237 virtual std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const { return nullptr; }
238
242 virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
243
245 virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const { return false; }
247 virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
249 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; }
250
251 virtual uint256 GetID() const { return uint256(); }
252
254 virtual std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const { return {}; };
255
257 template <typename... Params>
258 void WalletLogPrintf(util::ConstevalFormatString<sizeof...(Params)> wallet_fmt, const Params&... params) const
259 {
260 LogInfo("%s %s", m_storage.GetDisplayName(), tfm::format(wallet_fmt, params...));
261 };
262
264 boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
265
267 boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
268
270 boost::signals2::signal<void (const ScriptPubKeyMan* spkm, int64_t new_birth_time)> NotifyFirstKeyTimeChanged;
271};
272
274static const std::unordered_set<OutputType> LEGACY_OUTPUT_TYPES {
278};
279
280class DescriptorScriptPubKeyMan;
281
282// Manages the data for a LegacyScriptPubKeyMan.
283// This is the minimum necessary to load a legacy wallet so that it can be migrated.
285{
286protected:
287 using WatchOnlySet = std::set<CScript>;
288 using WatchKeyMap = std::map<CKeyID, CPubKey>;
289 using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
290
294
295 /* the HD chain data model (external chain counters) */
297 std::unordered_map<CKeyID, CHDChain, SaltedSipHasher> m_inactive_hd_chains;
298
301
302 bool AddWatchOnlyInMem(const CScript &dest);
303 virtual bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey);
304 bool AddCryptedKeyInner(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
305
306public:
308
309 // Map from Key ID to key metadata.
310 std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
311
312 // Map from Script ID to key metadata (for watch-only keys).
313 std::map<CScriptID, CKeyMetadata> m_script_metadata GUARDED_BY(cs_KeyStore);
314
315 // ScriptPubKeyMan overrides
316 bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
317 std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
318 std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
319 uint256 GetID() const override { return uint256::ONE; }
320 // TODO: Remove IsMine when deleting LegacyScriptPubKeyMan
321 isminetype IsMine(const CScript& script) const override;
322
323 // FillableSigningProvider overrides
324 bool HaveKey(const CKeyID &address) const override;
325 bool GetKey(const CKeyID &address, CKey& keyOut) const override;
326 bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
327 bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
328
329 std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
330 std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
331 std::set<int64_t> set_pre_split_keypool GUARDED_BY(cs_KeyStore);
332 int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore) = 0;
333 std::map<CKeyID, int64_t> m_pool_key_to_index;
334
336 virtual void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
337 virtual void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
338
340 bool LoadWatchOnly(const CScript &dest);
342 bool HaveWatchOnly(const CScript &dest) const;
344 bool HaveWatchOnly() const;
346 bool LoadKey(const CKey& key, const CPubKey &pubkey);
348 bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret, bool checksum_valid);
350 bool LoadCScript(const CScript& redeemScript);
352 void LoadHDChain(const CHDChain& chain);
353 void AddInactiveHDChain(const CHDChain& chain);
354 const CHDChain& GetHDChain() const { return m_hd_chain; }
356 void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
357
359 bool GetWatchPubKey(const CKeyID &address, CPubKey &pubkey_out) const;
360
365 std::unordered_set<CScript, SaltedSipHasher> GetNotMineScriptPubKeys() const;
366
369 std::optional<MigrationData> MigrateToDescriptor();
371 bool DeleteRecords();
372 bool DeleteRecordsWithDB(WalletBatch& batch);
373};
374
375// Implements the full legacy wallet behavior
377{
378private:
379 WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore) = nullptr;
380
381 // By default, do not scan any block until keys/scripts are generated/imported
382 int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore) = UNKNOWN_TIME;
383
386
387 bool AddKeyPubKeyInner(const CKey& key, const CPubKey &pubkey) override;
388
401 bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript& dest, int64_t create_time) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
402
404 bool AddKeyPubKeyWithDB(WalletBatch &batch,const CKey& key, const CPubKey &pubkey) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
405
406 void AddKeypoolPubkeyWithDB(const CPubKey& pubkey, const bool internal, WalletBatch& batch);
407
409 bool AddCScriptWithDB(WalletBatch& batch, const CScript& script);
410
412 bool AddKeyOriginWithDB(WalletBatch& batch, const CPubKey& pubkey, const KeyOriginInfo& info);
413
414 /* HD derive new child key (on internal or external chain) */
415 void DeriveNewChildKey(WalletBatch& batch, CKeyMetadata& metadata, CKey& secret, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
416
417 // Tracks keypool indexes to CKeyIDs of keys that have been taken out of the keypool but may be returned to it
419
421 bool GetKeyFromPool(CPubKey &key, const OutputType type);
422
437 bool ReserveKeyFromKeyPool(int64_t& nIndex, CKeyPool& keypool, bool fRequestedInternal);
438
449 bool TopUpInactiveHDChain(const CKeyID seed_id, int64_t index, bool internal);
450
451 bool TopUpChain(WalletBatch& batch, CHDChain& chain, unsigned int size);
452public:
453 LegacyScriptPubKeyMan(WalletStorage& storage, int64_t keypool_size) : LegacyDataSPKM(storage), m_keypool_size(keypool_size) {}
454
456
457 bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
458
459 util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) override;
460 void KeepDestination(int64_t index, const OutputType& type) override;
461 void ReturnDestination(int64_t index, bool internal, const CTxDestination&) override;
462
463 bool TopUp(unsigned int size = 0) override;
464
465 std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
466
468 void UpgradeKeyMetadata();
469
470 bool IsHDEnabled() const override;
471
472 bool SetupGeneration(bool force = false) override;
473
474 bool Upgrade(int prev_version, int new_version, bilingual_str& error) override;
475
476 bool HavePrivateKeys() const override;
477 bool HaveCryptedKeys() const override;
478
479 void RewriteDB() override;
480
481 std::optional<int64_t> GetOldestKeyPoolTime() const override;
482 size_t KeypoolCountExternalKeys() const;
483 unsigned int GetKeyPoolSize() const override;
484
485 int64_t GetTimeFirstKey() const override;
486
487 std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
488
489 bool CanGetAddresses(bool internal = false) const override;
490
491 bool CanProvide(const CScript& script, SignatureData& sigdata) override;
492
493 bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
494 SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
495 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;
496
497 uint256 GetID() const override;
498
500 bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override;
502 bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
505 void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata) override;
506 void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata) override;
508 CPubKey GenerateNewKey(WalletBatch& batch, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
509
510 /* Set the HD chain model (chain child index counters) and writes it to the database */
511 void AddHDChain(const CHDChain& chain);
512
514 bool RemoveWatchOnly(const CScript &dest);
515 bool AddWatchOnly(const CScript& dest, int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
516
517 /* SigningProvider overrides */
518 bool AddCScript(const CScript& redeemScript) override;
519
520 bool NewKeyPool();
522
523 bool ImportScripts(const std::set<CScript> scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
524 bool ImportPrivKeys(const std::map<CKeyID, CKey>& privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
525 bool ImportPubKeys(const std::vector<std::pair<CKeyID, bool>>& ordered_pubkeys, const std::map<CKeyID, CPubKey>& pubkey_map, const std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& key_origins, const bool add_keypool, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
526 bool ImportScriptPubKeys(const std::set<CScript>& script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
527
528 /* Returns true if the wallet can generate new keys */
529 bool CanGenerateKeys() const;
530
531 /* Generates a new HD seed (will not be activated) */
533
534 /* Derives a new HD seed (will not be activated) */
535 CPubKey DeriveNewSeed(const CKey& key);
536
537 /* Set the current HD seed (will reset the chain child index counters)
538 Sets the seed's version based on the current wallet version (so the
539 caller must ensure the current wallet version is correct before calling
540 this function). */
541 void SetHDSeed(const CPubKey& key);
542
549 void LearnRelatedScripts(const CPubKey& key, OutputType);
550
555 void LearnAllRelatedScripts(const CPubKey& key);
556
565 const std::map<CKeyID, int64_t>& GetAllReserveKeys() const { return m_pool_key_to_index; }
566
567 std::set<CKeyID> GetKeys() const override;
568};
569
572{
573private:
575public:
576 explicit LegacySigningProvider(const LegacyDataSPKM& spk_man) : m_spk_man(spk_man) {}
577
578 bool GetCScript(const CScriptID &scriptid, CScript& script) const override { return m_spk_man.GetCScript(scriptid, script); }
579 bool HaveCScript(const CScriptID &scriptid) const override { return m_spk_man.HaveCScript(scriptid); }
580 bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const override { return m_spk_man.GetPubKey(address, pubkey); }
581 bool GetKey(const CKeyID &address, CKey& key) const override { return false; }
582 bool HaveKey(const CKeyID &address) const override { return false; }
583 bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override { return m_spk_man.GetKeyOrigin(keyid, info); }
584};
585
587{
588 friend class LegacyDataSPKM;
589private:
590 using ScriptPubKeyMap = std::map<CScript, int32_t>; // Map of scripts to descriptor range index
591 using PubKeyMap = std::map<CPubKey, int32_t>; // Map of pubkeys involved in scripts to descriptor range index
592 using CryptedKeyMap = std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char>>>;
593 using KeyMap = std::map<CKeyID, CKey>;
594
595 ScriptPubKeyMap m_map_script_pub_keys GUARDED_BY(cs_desc_man);
597 int32_t m_max_cached_index = -1;
598
601
604
607
609
611
612 // Cached FlatSigningProviders to avoid regenerating them each time they are needed.
614 // Fetch the SigningProvider for the given script and optionally include private keys
615 std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CScript& script, bool include_private = false) const;
616 // Fetch the SigningProvider for a given index and optionally include private keys. Called by the above functions.
617 std::unique_ptr<FlatSigningProvider> GetSigningProvider(int32_t index, bool include_private = false) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
618
619protected:
621
623 bool TopUpWithDB(WalletBatch& batch, unsigned int size = 0);
624
625public:
626 DescriptorScriptPubKeyMan(WalletStorage& storage, WalletDescriptor& descriptor, int64_t keypool_size)
627 : ScriptPubKeyMan(storage),
628 m_keypool_size(keypool_size),
629 m_wallet_descriptor(descriptor)
630 {}
631 DescriptorScriptPubKeyMan(WalletStorage& storage, int64_t keypool_size)
632 : ScriptPubKeyMan(storage),
633 m_keypool_size(keypool_size)
634 {}
635
637
639 isminetype IsMine(const CScript& script) const override;
640
641 bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
642 bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
643
644 util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) override;
645 void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
646
647 // Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
648 // and is used to expand the descriptor in GetNewDestination. DescriptorScriptPubKeyMan relies
649 // more on ephemeral data than LegacyScriptPubKeyMan. For wallets using unhardened derivation
650 // (with or without private keys), the "keypool" is a single xpub.
651 bool TopUp(unsigned int size = 0) override;
652
653 std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
654
655 bool IsHDEnabled() const override;
656
658 bool SetupDescriptorGeneration(WalletBatch& batch, const CExtKey& master_key, OutputType addr_type, bool internal);
659
660 bool HavePrivateKeys() const override;
661 bool HasPrivKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
663 std::optional<CKey> GetKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
664 bool HaveCryptedKeys() const override;
665
666 std::optional<int64_t> GetOldestKeyPoolTime() const override;
667 unsigned int GetKeyPoolSize() const override;
668
669 int64_t GetTimeFirstKey() const override;
670
671 std::unique_ptr<CKeyMetadata> GetMetadata(const CTxDestination& dest) const override;
672
673 bool CanGetAddresses(bool internal = false) const override;
674
675 std::unique_ptr<SigningProvider> GetSolvingProvider(const CScript& script) const override;
676
677 bool CanProvide(const CScript& script, SignatureData& sigdata) override;
678
679 // Fetch the SigningProvider for the given pubkey and always include private keys. This should only be called by signing code.
680 std::unique_ptr<FlatSigningProvider> GetSigningProvider(const CPubKey& pubkey) const;
681
682 bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
683 SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
684 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;
685
686 uint256 GetID() const override;
687
688 void SetCache(const DescriptorCache& cache);
689
690 bool AddKey(const CKeyID& key_id, const CKey& key);
691 bool AddCryptedKey(const CKeyID& key_id, const CPubKey& pubkey, const std::vector<unsigned char>& crypted_key);
692
693 bool HasWalletDescriptor(const WalletDescriptor& desc) const;
695 bool CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error);
696 void AddDescriptorKey(const CKey& key, const CPubKey &pubkey);
697 void WriteDescriptor();
698
700 std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys() const override;
701 std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys(int32_t minimum_index) const;
702 int32_t GetEndRange() const;
703
704 [[nodiscard]] bool GetDescriptorString(std::string& out, const bool priv) const;
705
707};
708
711{
713 std::vector<std::pair<std::string, int64_t>> watch_descs;
714 std::vector<std::pair<std::string, int64_t>> solvable_descs;
715 std::vector<std::unique_ptr<DescriptorScriptPubKeyMan>> desc_spkms;
716 std::shared_ptr<CWallet> watchonly_wallet{nullptr};
717 std::shared_ptr<CWallet> solvable_wallet{nullptr};
718};
719
720} // namespace wallet
721
722#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:140
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:201
static const uint256 ONE
Definition: uint256.h:210
A key from a CWallet's keypool.
void Unserialize(Stream &s)
int64_t nTime
The time at which the key was generated. Set in AddKeypoolPubKeyWithDB.
CPubKey vchPubKey
The public key.
void Serialize(Stream &s) const
bool fInternal
Whether this keypool entry is in the internal keypool (for change outputs)
bool m_pre_split
Whether this key was generated for a keypool before the wallet was upgraded to HD-split.
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
util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool) 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)
PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man)
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
void UpdateWalletDescriptor(WalletDescriptor &descriptor)
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.
void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool)
Load a keypool entry.
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::set< int64_t > set_pre_split_keypool GUARDED_BY(cs_KeyStore)
std::set< int64_t > setExternalKeyPool GUARDED_BY(cs_KeyStore)
std::map< CKeyID, CKeyMetadata > mapKeyMetadata GUARDED_BY(cs_KeyStore)
void AddInactiveHDChain(const CHDChain &chain)
std::set< int64_t > setInternalKeyPool GUARDED_BY(cs_KeyStore)
bool HaveWatchOnly() const
Returns whether there are any watch-only things in the wallet.
int64_t m_max_keypool_index GUARDED_BY(cs_KeyStore)=0
bool fDecryptionThoroughlyChecked
keeps track of whether Unlock has run a thorough check before
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
std::map< CKeyID, int64_t > m_pool_key_to_index
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
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)
std::vector< CKeyPool > MarkReserveKeysAsUsed(int64_t keypool_id) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Marks all keys in the keypool up to and including the provided key as used.
const std::map< CKeyID, int64_t > & GetAllReserveKeys() const
void LoadScriptMetadata(const CScriptID &script_id, const CKeyMetadata &metadata) override
bool CanGetAddresses(bool internal=false) const override
bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) override
Adds a key to the store, and saves it to disk.
util::Result< CTxDestination > GetNewDestination(const OutputType type) override
bool GetKeyFromPool(CPubKey &key, const OutputType type)
Fetches a key from the keypool.
util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool) override
bool Encrypt(const CKeyingMaterial &master_key, WalletBatch *batch) override
void AddHDChain(const CHDChain &chain)
bool AddCScriptWithDB(WalletBatch &batch, const CScript &script)
Adds a script to the store and saves it to disk.
bool AddKeyOriginWithDB(WalletBatch &batch, const CPubKey &pubkey, const KeyOriginInfo &info)
Add a KeyOriginInfo to the wallet.
void MarkPreSplitKeys() EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
SigningResult SignMessage(const std::string &message, const PKHash &pkhash, std::string &str_sig) const override
Sign a message with the given script.
uint256 GetID() 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.
bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret)
Adds an encrypted key to the store, and saves it to disk.
bool ReserveKeyFromKeyPool(int64_t &nIndex, CKeyPool &keypool, bool fRequestedInternal)
Reserves a key from the keypool and sets nIndex to its index.
int64_t m_keypool_size GUARDED_BY(cs_KeyStore)
Number of pre-generated keys/scripts (part of the look-ahead process, used to detect payments)
void AddKeypoolPubkeyWithDB(const CPubKey &pubkey, const bool internal, WalletBatch &batch)
std::map< int64_t, CKeyID > m_index_to_reserved_key
bool ImportScripts(const std::set< CScript > scripts, int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
void UpgradeKeyMetadata()
Upgrade stored CKeyMetadata objects to store key origin info as KeyOriginInfo.
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 HavePrivateKeys() const override
int64_t nTimeFirstKey GUARDED_BY(cs_KeyStore)
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...
void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata) override
Load metadata (used by LoadWallet)
void UpdateTimeFirstKey(int64_t nCreateTime) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Update wallet first key creation time.
bool TopUp(unsigned int size=0) override
Fills internal address pool.
unsigned int GetKeyPoolSize() const override
bool AddKeyPubKeyInner(const CKey &key, const CPubKey &pubkey) override
bool ImportPubKeys(const std::vector< std::pair< CKeyID, bool > > &ordered_pubkeys, const std::map< CKeyID, CPubKey > &pubkey_map, const std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo > > &key_origins, const bool add_keypool, 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 CanProvide(const CScript &script, SignatureData &sigdata) override
Whether this ScriptPubKeyMan can provide a SigningProvider (via GetSolvingProvider) that,...
WalletBatch *encrypted_batch GUARDED_BY(cs_KeyStore)
std::set< CKeyID > GetKeys() const override
bool HaveCryptedKeys() const override
bool IsHDEnabled() const override
bool TopUpChain(WalletBatch &batch, CHDChain &chain, unsigned int size)
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.
bool AddCScript(const CScript &redeemScript) override
int64_t GetTimeFirstKey() const override
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.
bool NewKeyPool()
Mark old keypool keys as used, and generate all new keys.
bool SetupGeneration(bool force=false) override
Sets up the key generation stuff, i.e.
void LearnRelatedScripts(const CPubKey &key, OutputType)
Explicitly make the wallet learn the related scripts for outputs to the given key.
void LearnAllRelatedScripts(const CPubKey &key)
Same as LearnRelatedScripts, but when the OutputType is not known (and could be anything).
CPubKey DeriveNewSeed(const CKey &key)
void DeriveNewChildKey(WalletBatch &batch, CKeyMetadata &metadata, CKey &secret, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
void ReturnDestination(int64_t index, bool internal, const CTxDestination &) override
CPubKey GenerateNewKey(WalletBatch &batch, CHDChain &hd_chain, bool internal=false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
Generate a new key.
void SetHDSeed(const CPubKey &key)
bool AddWatchOnlyWithDB(WalletBatch &batch, const CScript &dest) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
bool ImportPrivKeys(const std::map< CKeyID, CKey > &privkey_map, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
std::unique_ptr< CKeyMetadata > GetMetadata(const CTxDestination &dest) const override
bool Upgrade(int prev_version, int new_version, bilingual_str &error) override
Upgrades the wallet to the specified version.
void KeepDestination(int64_t index, const OutputType &type) override
void RewriteDB() override
The action to do when the DB needs rewrite.
std::optional< int64_t > GetOldestKeyPoolTime() const override
bool RemoveWatchOnly(const CScript &dest)
Remove a watch only script from the keystore.
bool ImportScriptPubKeys(const std::set< CScript > &script_pub_keys, const bool have_solving_data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore)
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 util::Result< CTxDestination > GetReservedDestination(const OutputType type, bool internal, int64_t &index, CKeyPool &keypool)
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 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:196
An instance of this class represents one database.
Definition: db.h:131
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:62
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:951
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
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition: time.cpp:51
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:82
is a home for public enum and struct type definitions that are used by internally by wallet code,...