6 #include <bitcoin-build-config.h> 20 #include <util/time.h> 41 const std::string
FLAGS{
"flags"};
44 const std::string
KEY{
"key"};
48 const std::string
NAME{
"name"};
51 const std::string
POOL{
"pool"};
54 const std::string
TX{
"tx"};
120 const auto keypair_hash =
Hash(vchPubKey, vchPrivKey);
122 return WriteIC(std::make_pair(
DBKeys::KEY, vchPubKey), std::make_pair(vchPrivKey, keypair_hash),
false);
126 const std::vector<unsigned char>& vchCryptedSecret,
137 if (!
WriteIC(key, std::make_pair(vchCryptedSecret, checksum),
false)) {
139 std::vector<unsigned char> val;
140 if (!
m_batch->Read(key, val)) {
143 if (!
WriteIC(key, std::make_pair(val, checksum),
true)) {
208 return WriteIC(make_pair(key, type),
id);
214 return EraseIC(make_pair(key, type));
220 const auto keypair_hash =
Hash(pubkey, privkey);
242 xpub.
Encode(ser_xpub.data());
249 xpub.
Encode(ser_xpub.data());
256 xpub.
Encode(ser_xpub.data());
268 for (
const auto& derived_xpub_pair : derived_xpub_map_pair.second) {
298 if (!vchPubKey.IsValid())
300 strErr =
"Error reading wallet database: CPubKey corrupt";
318 catch (
const std::ios_base::failure&) {}
320 bool fSkipCheck =
false;
325 const auto keypair_hash =
Hash(vchPubKey, pkey);
327 if (keypair_hash != hash)
329 strErr =
"Error reading wallet database: CPubKey/CPrivKey corrupt";
336 if (!key.
Load(pkey, vchPubKey, fSkipCheck))
338 strErr =
"Error reading wallet database: CPrivKey corrupt";
343 strErr =
"Error reading wallet database: LegacyDataSPKM::LoadKey failed";
346 }
catch (
const std::exception& e) {
347 if (strErr.empty()) {
361 if (!vchPubKey.IsValid())
363 strErr =
"Error reading wallet database: CPubKey corrupt";
366 std::vector<unsigned char> vchPrivKey;
367 ssValue >> vchPrivKey;
370 bool checksum_valid =
false;
371 if (!ssValue.
empty()) {
374 if (!(checksum_valid =
Hash(vchPrivKey) == checksum)) {
375 strErr =
"Error reading wallet database: Encrypted key corrupt";
382 strErr =
"Error reading wallet database: LegacyDataSPKM::LoadCryptedKey failed";
385 }
catch (
const std::exception& e) {
386 if (strErr.empty()) {
402 ssValue >> kMasterKey;
405 strErr =
strprintf(
"Error reading wallet database: duplicate CMasterKey id %u", nID);
412 }
catch (
const std::exception& e) {
413 if (strErr.empty()) {
428 }
catch (
const std::exception& e) {
429 if (strErr.empty()) {
442 if (!pwallet->LoadWalletFlags(
flags)) {
443 pwallet->WalletLogPrintf(
"Error reading wallet database: Unknown non-tolerable wallet flags found\n");
461 using LoadFunc = std::function<DBErrors(CWallet* pwallet, DataStream& key, DataStream& value, std::string& err)>;
471 pwallet->
WalletLogPrintf(
"Error getting database cursor for '%s' records\n", key);
481 pwallet->
WalletLogPrintf(
"Error reading next '%s' record for wallet database\n", key);
489 DBErrors record_res = load_func(pwallet, ssKey, ssValue, error);
493 result.m_result = std::max(
result.m_result, record_res);
508 const auto& batch =
wallet.GetDatabase().MakeBatch();
523 throw std::runtime_error(
strprintf(
"Error getting database cursor for '%s' records", type));
542 pwallet->WalletLogPrintf(
"Error: Unexpected legacy entry found in descriptor wallet %s. The wallet might have been tampered with or created with malicious intent.\n", pwallet->GetName());
580 strErr =
"Error reading wallet database: LegacyDataSPKM::LoadCScript failed";
594 std::map<uint160, CHDChain> hd_chains;
608 bool internal =
false;
610 if (keyMeta.hdKeypath !=
"s" && keyMeta.hdKeypath !=
"m") {
611 std::vector<uint32_t> path;
612 if (keyMeta.has_key_origin) {
614 path = keyMeta.key_origin.path;
618 strErr =
"Error reading wallet database: keymeta with invalid HD keypath";
627 if (path.size() != 3) {
628 strErr =
"Error reading wallet database: keymeta found with unexpected path";
631 if (path[0] != 0x80000000) {
632 strErr =
strprintf(
"Unexpected path index of 0x%08x (expected 0x80000000) for the element at index 0", path[0]);
635 if (path[1] != 0x80000000 && path[1] != (1 | 0x80000000)) {
636 strErr =
strprintf(
"Unexpected path index of 0x%08x (expected 0x80000000 or 0x80000001) for the element at index 1", path[1]);
639 if ((path[2] & 0x80000000) == 0) {
640 strErr =
strprintf(
"Unexpected path index of 0x%08x (expected to be greater than or equal to 0x80000000)", path[2]);
643 internal = path[1] == (1 | 0x80000000);
644 index = path[2] & ~0x80000000;
648 auto [ins, inserted] = hd_chains.emplace(keyMeta.hd_seed_id,
CHDChain());
653 chain.
seed_id = keyMeta.hd_seed_id;
667 if (!hd_chains.empty()) {
670 for (
const auto& [hd_seed_id, chain] : hd_chains) {
676 pwallet->
WalletLogPrintf(
"Inactive HD Chains found but no Legacy ScriptPubKeyMan\n");
717 value >> default_pubkey;
718 }
catch (
const std::exception& e) {
722 if (!default_pubkey.
IsValid()) {
723 err =
"Error reading wallet database: Default Key corrupt";
733 err =
"Found unsupported 'wkey' record, try loading with version 0.18";
740 pwallet->
WalletLogPrintf(
"Legacy Wallet Keys: %u plaintext, %u encrypted, %u w/ metadata, %u total.\n",
747 template<
typename... Args>
771 }
catch (
const std::ios_base::failure& e) {
772 strErr =
strprintf(
"Error: Unrecognized descriptor found in wallet %s. ", pwallet->
GetName());
773 strErr += (last_client >
CLIENT_VERSION) ?
"The wallet might have been created on a newer version. " :
774 "The database might be corrupted or the software version is not compatible with one of your wallet descriptors. ";
775 strErr +=
"Please try running the latest software version";
777 strErr =
strprintf(
"%s\nDetails: %s", strErr, e.what());
783 if (
id != spkm.
GetID()) {
784 strErr =
"The descriptor ID calculated by the wallet differs from the one in DB";
796 uint32_t key_exp_index;
800 key >> key_exp_index;
813 xpub.
Decode(ser_xpub.data());
828 uint32_t key_exp_index;
831 key >> key_exp_index;
836 xpub.
Decode(ser_xpub.data());
845 spk_man->SetCache(cache);
856 if (!pubkey.IsValid())
858 strErr =
"Error reading wallet database: descriptor unencrypted key CPubKey corrupt";
869 const auto keypair_hash =
Hash(pubkey, pkey);
871 if (keypair_hash != hash)
873 strErr =
"Error reading wallet database: descriptor unencrypted key CPubKey/CPrivKey corrupt";
877 if (!privkey.
Load(pkey, pubkey,
true))
879 strErr =
"Error reading wallet database: descriptor unencrypted key CPrivKey corrupt";
882 spk_man->AddKey(pubkey.GetID(), privkey);
897 if (!pubkey.IsValid())
899 err =
"Error reading wallet database: descriptor encrypted key CPubKey corrupt";
902 std::vector<unsigned char> privkey;
905 spk_man->AddCryptedKey(pubkey.GetID(), pubkey, privkey);
916 pwallet->
WalletLogPrintf(
"Descriptors: %u, Descriptor Keys: %u plaintext, %u encrypted, %u total.\n",
917 desc_res.
m_records, num_keys, num_ckeys, num_keys + num_ckeys);
931 std::string strAddress;
935 pwallet->m_address_book[DecodeDestination(strAddress)].SetLabel(label);
936 return DBErrors::LOAD_OK;
943 std::string strAddress;
945 std::string purpose_str;
946 value >> purpose_str;
947 std::optional<AddressPurpose> purpose{PurposeFromString(purpose_str)};
949 pwallet->
WalletLogPrintf(
"Warning: nonstandard purpose string '%s' for address '%s'\n", purpose_str, strAddress);
959 std::string strAddress, strKey, strValue;
963 const CTxDestination& dest{DecodeDestination(strAddress)};
964 if (strKey.compare(
"used") == 0) {
971 pwallet->LoadAddressPreviouslySpent(dest);
972 }
else if (strKey.starts_with(
"rr")) {
975 pwallet->LoadAddressReceiveRequest(dest, strKey.substr(2), strValue);
990 any_unordered =
false;
993 DBErrors result = DBErrors::LOAD_OK;
998 auto fill_wtx = [&](CWalletTx& wtx, bool new_tx) {
1001 err =
"Error: Corrupt transaction found. This can be fixed by removing transactions from wallet and rescanning.";
1002 result = DBErrors::CORRUPT;
1006 if (wtx.GetHash() != hash)
1009 if (wtx.nOrderPos == -1)
1010 any_unordered = true;
1029 pwallet->LoadLockedCoin(COutPoint(hash, n), true);
1030 return DBErrors::LOAD_OK;
1039 value >> pwallet->nOrderPosNext;
1040 }
catch (
const std::exception& e) {
1042 return DBErrors::NONCRITICAL_ERROR;
1044 return DBErrors::LOAD_OK;
1050 for (
auto& [
id, wtx] : pwallet->mapWallet) {
1051 if (wtx.IsCoinBase() && wtx.isInactive()) {
1052 pwallet->AbandonTransaction(wtx);
1065 std::set<std::pair<OutputType, bool>> seen_spks;
1069 uint8_t output_type;
1075 auto [it,
insert] = seen_spks.emplace(static_cast<OutputType>(output_type),
internal);
1077 strErr =
"Multiple ScriptpubKeyMans specified for a single type";
1078 return DBErrors::CORRUPT;
1081 return DBErrors::LOAD_OK;
1096 return DBErrors::CORRUPT;
1098 return DBErrors::LOAD_OK;
1106 bool any_unordered =
false;
1113 if (has_last_client) pwallet->
WalletLogPrintf(
"Last client version = %d\n", last_client);
1120 #ifndef ENABLE_EXTERNAL_SIGNER 1122 pwallet->
WalletLogPrintf(
"Error: External signer wallet being loaded without external signer support compiled\n");
1123 return DBErrors::EXTERNAL_SIGNER_SUPPORT_REQUIRED;
1135 if (
result == DBErrors::UNKNOWN_DESCRIPTOR)
return result;
1148 }
catch (std::runtime_error& e) {
1154 result = DBErrors::CORRUPT;
1157 result = DBErrors::CORRUPT;
1162 if (
result != DBErrors::LOAD_OK)
1176 result = DBErrors::CORRUPT;
1184 pwallet->
WalletLogPrintf(
"Detected extraneous encryption keys in this wallet without private keys. Removing extraneous encryption keys.\n");
1186 if (!EraseMasterKey(
id)) {
1187 pwallet->
WalletLogPrintf(
"Error: Unable to remove extraneous encryption key '%u'. Wallet corrupt.\n",
id);
1188 return DBErrors::CORRUPT;
1226 bool WalletBatch::WriteAddressPreviouslySpent(
const CTxDestination& dest,
bool previously_spent)
1229 return previously_spent ? WriteIC(key, std::string(
"1")) : EraseIC(key);
1232 bool WalletBatch::WriteAddressReceiveRequest(
const CTxDestination& dest,
const std::string&
id,
const std::string& receive_request)
1237 bool WalletBatch::EraseAddressReceiveRequest(
const CTxDestination& dest,
const std::string&
id)
1246 return m_batch->ErasePrefix(
prefix);
1249 bool WalletBatch::WriteWalletFlags(
const uint64_t
flags)
1254 bool WalletBatch::EraseRecords(
const std::unordered_set<std::string>& types)
1256 return std::all_of(types.begin(), types.end(), [&](
const std::string& type) {
1257 return m_batch->ErasePrefix(
DataStream() << type);
1261 bool WalletBatch::TxnBegin()
1263 return m_batch->TxnBegin();
1266 bool WalletBatch::TxnCommit()
1268 bool res = m_batch->TxnCommit();
1270 for (
const auto& listener : m_txn_listeners) {
1271 listener.on_commit();
1274 m_txn_listeners.clear();
1279 bool WalletBatch::TxnAbort()
1281 bool res = m_batch->TxnAbort();
1283 for (
const auto& listener : m_txn_listeners) {
1284 listener.on_abort();
1287 m_txn_listeners.clear();
1294 assert(m_batch->HasActiveTxn());
1295 m_txn_listeners.emplace_back(l);
1302 exists = fs::symlink_status(path).type() != fs::file_type::not_found;
1303 }
catch (
const fs::filesystem_error& e) {
1305 status = DatabaseStatus::FAILED_BAD_PATH;
1309 std::optional<DatabaseFormat>
format;
1312 format = DatabaseFormat::BERKELEY_RO;
1317 status = DatabaseStatus::FAILED_BAD_FORMAT;
1320 format = DatabaseFormat::SQLITE;
1324 status = DatabaseStatus::FAILED_NOT_FOUND;
1330 status = DatabaseStatus::FAILED_BAD_FORMAT;
1336 status = DatabaseStatus::FAILED_ALREADY_EXISTS;
1342 error =
Untranslated(
strprintf(
"Failed to open database path '%s'. The wallet appears to be a Legacy wallet, please use the wallet migration tool (migratewallet RPC or the GUI option).",
fs::PathToString(path)));
1343 status = DatabaseStatus::FAILED_LEGACY_DISABLED;
1350 status = DatabaseStatus::FAILED_BAD_FORMAT;
1358 format = DatabaseFormat::SQLITE;
1361 if (
format == DatabaseFormat::SQLITE) {
1365 if (
format == DatabaseFormat::BERKELEY_RO) {
1370 status = DatabaseStatus::FAILED_BAD_FORMAT;
std::unique_ptr< WalletDatabase > MakeDatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
std::unordered_map< uint32_t, ExtPubKeyMap > GetCachedDerivedExtPubKeys() const
Retrieve all cached derived xpubs.
const std::string MASTER_KEY
Private key encryption is done based on a CMasterKey, which holds a salt and random encryption key...
std::optional< DatabaseFormat > require_format
const std::string BESTBLOCK_NOMERKLE
const std::string SETTINGS
const std::string CRYPTED_KEY
static DBErrors LoadDescriptorWalletRecords(CWallet *pwallet, DatabaseBatch &batch, int last_client) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
virtual std::unique_ptr< DatabaseCursor > GetNewPrefixCursor(std::span< const std::byte > prefix)=0
ExtPubKeyMap GetCachedParentExtPubKeys() const
Retrieve all cached parent xpubs.
const std::string HDCHAIN
bool HasEncryptionKeys() const override
std::unique_ptr< BerkeleyRODatabase > MakeBerkeleyRODatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
Return object giving access to Berkeley Read Only database at specified path.
const std::string ACENTRY
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
const std::string VERSION
void UpgradeDescriptorCache() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet)
Upgrade DescriptorCaches.
const std::string DESTDATA
static DBErrors LoadAddressBookRecords(CWallet *pwallet, DatabaseBatch &batch) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
std::unique_ptr< SQLiteDatabase > MakeSQLiteDatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
DBErrors
Overview of wallet database classes:
const std::string WALLETDESCRIPTORCKEY
bool WriteDescriptorCacheItems(const uint256 &desc_id, const DescriptorCache &cache)
bool RunWithinTxn(WalletDatabase &database, std::string_view process_desc, const std::function< bool(WalletBatch &)> &func)
Executes the provided function 'func' within a database transaction context.
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
const std::string BESTBLOCK
const std::string & GetName() const
Get a name for this wallet for logging/debugging purposes.
bool WriteCryptedDescriptorKey(const uint256 &desc_id, const CPubKey &pubkey, const std::vector< unsigned char > &secret)
uint32_t nExternalChainCounter
std::shared_ptr< CWallet > LoadWallet(WalletContext &context, const std::string &name, std::optional< bool > load_on_start, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error, std::vector< bilingual_str > &warnings)
bool LoadKey(const CKey &key, const CPubKey &pubkey)
Adds a key to the store, without saving it to disk (used by LoadWallet)
static DataStream PrefixStream(const Args &... args)
std::function< DBErrors(CWallet *pwallet, DataStream &key, DataStream &value, std::string &err)> LoadFunc
const std::string WALLETDESCRIPTOR
bool WriteMasterKey(unsigned int nID, const CMasterKey &kMasterKey)
MasterKeyMap mapMasterKeys
bool TxnAbort()
Abort current transaction.
static DBErrors LoadLegacyWalletRecords(CWallet *pwallet, DatabaseBatch &batch, int last_client) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
bool LoadHDChain(CWallet *pwallet, DataStream &ssValue, std::string &strErr)
RecursiveMutex cs_wallet
Main wallet lock.
std::string SQLiteDatabaseVersion()
void AddInactiveHDChain(const CHDChain &chain)
bool EraseWatchOnly(const CScript &script)
void insert(Tdst &dst, const Tsrc &src)
Simplification of std insertion.
bool WriteCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret, const CKeyMetadata &keyMeta)
bool WriteLockedUTXO(const COutPoint &output)
bool WriteKeyMetadata(const CKeyMetadata &meta, const CPubKey &pubkey, bool overwrite)
void LoadHDChain(const CHDChain &chain)
Load a HD chain model (used by LoadWallet)
Access to the wallet database.
ScriptPubKeyMan * GetScriptPubKeyMan(const OutputType &type, bool internal) const
Get the ScriptPubKeyMan for the given OutputType and internal/external chain.
const std::string CSCRIPT
static DBErrors LoadActiveSPKMs(CWallet *pwallet, DatabaseBatch &batch) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
bool WriteOrderPosNext(int64_t nOrderPosNext)
bool ReadBestBlock(CBlockLocator &locator)
const std::string PURPOSE
consteval auto _(util::TranslatedLiteral str)
const std::string MINVERSION
std::unique_ptr< DatabaseBatch > m_batch
bool WriteDescriptor(const uint256 &desc_id, const WalletDescriptor &descriptor)
bool WriteDescriptorKey(const uint256 &desc_id, const CPubKey &pubkey, const CPrivKey &privkey)
const std::string WALLETDESCRIPTORKEY
RAII class that provides access to a WalletDatabase.
const std::unordered_set< std::string > LEGACY_TYPES
fs::path SQLiteDataFile(const fs::path &path)
bool LoadWatchOnly(const CScript &dest)
Adds a watch-only address to the store, without saving it to disk (used by LoadWallet) ...
bool WriteBestBlock(const CBlockLocator &locator)
static DBErrors LoadWalletFlags(CWallet *pwallet, DatabaseBatch &batch) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
std::vector< unsigned char, secure_allocator< unsigned char > > CPrivKey
CPrivKey is a serialized private key, with all parameters included (SIZE bytes)
A transaction with a bunch of additional info that only the owner cares about.
const std::string WATCHMETA
bool EraseName(const std::string &strAddress)
Indicates that the wallet needs an external signer.
bool LoadEncryptionKey(CWallet *pwallet, DataStream &ssKey, DataStream &ssValue, std::string &strErr)
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
bool WriteWatchOnly(const CScript &script, const CKeyMetadata &keymeta)
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE])
bool TxnCommit()
Commit current transaction.
bool IsBDBFile(const fs::path &path)
bool WriteActiveScriptPubKeyMan(uint8_t type, const uint256 &id, bool internal)
bool WriteDescriptorDerivedCache(const CExtPubKey &xpub, const uint256 &desc_id, uint32_t key_exp_index, uint32_t der_index)
bool LoadCryptedKey(CWallet *pwallet, DataStream &ssKey, DataStream &ssValue, std::string &strErr)
Double ended buffer combining vector and stream-like interfaces.
bool WriteTx(const CWalletTx &wtx)
uint256 GetID() const override
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.
An encapsulated public key.
bool LoadToWallet(const Txid &hash, const UpdateWalletTxFn &fill_wtx) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet)
LegacyDataSPKM * GetOrCreateLegacyDataSPKM()
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) ...
Indicate that this wallet supports DescriptorScriptPubKeyMan.
uint32_t nInternalChainCounter
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
bool HasLegacyRecords(CWallet &wallet)
Returns true if there are any DBKeys::LEGACY_TYPES record in the wallet db.
static DBErrors LoadTxRecords(CWallet *pwallet, DatabaseBatch &batch, bool &any_unordered) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
std::vector< uint256 > vHave
virtual void LoadKeyMetadata(const CKeyID &keyID, const CKeyMetadata &metadata)
Load metadata (used by LoadWallet)
bool IsWalletFlagSet(uint64_t flag) const override
check if a certain wallet flag is set
An outpoint - a combination of a transaction hash and an index n into its vout.
constexpr bool IsNull() const
#define Assume(val)
Assume is the identity function.
bool ErasePurpose(const std::string &strAddress)
Descriptor with some wallet metadata.
const std::string ACTIVEINTERNALSPK
const std::string KEYMETA
bool WriteDescriptorParentCache(const CExtPubKey &xpub, const uint256 &desc_id, uint32_t key_exp_index)
void CacheLastHardenedExtPubKey(uint32_t key_exp_pos, const CExtPubKey &xpub)
Cache a last hardened xpub.
#define LogDebug(category,...)
virtual void LoadScriptMetadata(const CScriptID &script_id, const CKeyMetadata &metadata)
bool LoadKey(CWallet *pwallet, DataStream &ssKey, DataStream &ssValue, std::string &strErr)
catch(const std::exception &e)
const std::string WALLETDESCRIPTORCACHE
bool EraseIC(const K &key)
const Txid & GetHash() const LIFETIMEBOUND
#define EXCLUSIVE_LOCKS_REQUIRED(...)
const std::string ACTIVEEXTERNALSPK
bool ParseHDKeypath(const std::string &keypath_str, std::vector< uint32_t > &keypath)
Parse an HD keypaths like "m/7/0'/2000".
Cache for single descriptor's derived extended pubkeys.
Serialized script, used inside transaction inputs and outputs.
void LoadActiveScriptPubKeyMan(uint256 id, OutputType type, bool internal)
Loads an active ScriptPubKeyMan for the specified type and internal.
void CacheParentExtPubKey(uint32_t key_exp_pos, const CExtPubKey &xpub)
Cache a parent xpub.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
const unsigned int BIP32_EXTKEY_SIZE
fs::path BDBDataFile(const fs::path &wallet_path)
static LoadResult LoadRecords(CWallet *pwallet, DatabaseBatch &batch, const std::string &key, DataStream &prefix, LoadFunc load_func)
static std::string PathToString(const path &path)
Convert path object to a byte string.
bool TxnBegin()
Begin a new transaction.
bool HaveCryptedKeys() const
bool WriteKey(const CPubKey &vchPubKey, const CPrivKey &vchPrivKey, const CKeyMetadata &keyMeta)
DBErrors ReorderTransactions()
const std::string LOCKED_UTXO
bool IsSQLiteFile(const fs::path &path)
static const int VERSION_HD_BASE
A reference to a CScript: the Hash160 of its serialization.
const std::string WALLETDESCRIPTORLHCACHE
bool WriteName(const std::string &strAddress, const std::string &strName)
std::string EncodeDestination(const CTxDestination &dest)
void SerializeMany(Stream &s, const Args &... args)
Support for (un)serializing many things at once.
const uint256 & ToUint256() const LIFETIMEBOUND
#define STR_INTERNAL_BUG(msg)
bool WriteIC(const K &key, const T &value, bool fOverwrite=true)
const std::string DEFAULTKEY
An encapsulated private key.
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
bool EraseLockedUTXO(const COutPoint &output)
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
bool EraseActiveScriptPubKeyMan(uint8_t type, bool internal)
const std::string ORDERPOSNEXT
bool LoadCScript(const CScript &redeemScript)
Adds a CScript to the store.
unsigned int nMasterKeyMaxID
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
static const int CLIENT_VERSION
const CHDChain & GetHDChain() const
bool EraseMasterKey(unsigned int id)
bool WritePurpose(const std::string &strAddress, const std::string &purpose)
CKeyID seed_id
seed hash160
LegacyDataSPKM * GetLegacyDataSPKM() const
Get the LegacyScriptPubKeyMan which is used for all types, internal, and external.
DescriptorScriptPubKeyMan & LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor &desc)
Instantiate a descriptor ScriptPubKeyMan from the WalletDescriptor and load it.
void CacheDerivedExtPubKey(uint32_t key_exp_pos, uint32_t der_index, const CExtPubKey &xpub)
Cache an xpub derived at an index.
An instance of this class represents one database.
const std::string OLD_KEY
ExtPubKeyMap GetCachedLastHardenedExtPubKeys() const
Retrieve all cached last hardened xpubs.
static LoadResult LoadRecords(CWallet *pwallet, DatabaseBatch &batch, const std::string &key, LoadFunc load_func)
static DBErrors LoadDecryptionKeys(CWallet *pwallet, DatabaseBatch &batch) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
bool WriteDescriptorLastHardenedCache(const CExtPubKey &xpub, const uint256 &desc_id, uint32_t key_exp_index)
bool Load(const CPrivKey &privkey, const CPubKey &vchPubKey, bool fSkipCheck)
Load private key and check that public key matches.
static const int VERSION_HD_CHAIN_SPLIT