6#include <bitcoin-build-config.h>
41const std::string
FLAGS{
"flags"};
44const std::string
KEY{
"key"};
48const std::string
NAME{
"name"};
51const std::string
POOL{
"pool"};
54const std::string
TX{
"tx"};
103 for (
const auto& [wtxid, tx] : wtx.
GetTxs()) {
133 const auto keypair_hash =
Hash(vchPubKey, vchPrivKey);
135 return WriteIC(std::make_pair(
DBKeys::KEY, vchPubKey), std::make_pair(vchPrivKey, keypair_hash),
false);
139 const std::vector<unsigned char>& vchCryptedSecret,
150 if (!
WriteIC(key, std::make_pair(vchCryptedSecret, checksum),
false)) {
152 std::vector<unsigned char> val;
153 if (!
m_batch->Read(key, val)) {
156 if (!
WriteIC(key, std::make_pair(val, checksum),
true)) {
213 return WriteIC(make_pair(key, type),
id);
219 return EraseIC(make_pair(key, type));
225 const auto keypair_hash =
Hash(pubkey, privkey);
247 xpub.
Encode(ser_xpub.data());
254 xpub.
Encode(ser_xpub.data());
261 xpub.
Encode(ser_xpub.data());
273 for (
const auto& derived_xpub_pair : derived_xpub_map_pair.second) {
305 strErr =
"Error reading wallet database: CPubKey corrupt";
323 catch (
const std::ios_base::failure&) {}
325 bool fSkipCheck =
false;
330 const auto keypair_hash =
Hash(vchPubKey, pkey);
332 if (keypair_hash != hash)
334 strErr =
"Error reading wallet database: CPubKey/CPrivKey corrupt";
341 if (!key.
Load(pkey, vchPubKey, fSkipCheck))
343 strErr =
"Error reading wallet database: CPrivKey corrupt";
348 strErr =
"Error reading wallet database: LegacyDataSPKM::LoadKey failed";
351 }
catch (
const std::exception& e) {
352 if (strErr.empty()) {
368 strErr =
"Error reading wallet database: CPubKey corrupt";
371 std::vector<unsigned char> vchPrivKey;
372 ssValue >> vchPrivKey;
375 bool checksum_valid =
false;
376 if (!ssValue.
empty()) {
379 if (!(checksum_valid =
Hash(vchPrivKey) == checksum)) {
380 strErr =
"Error reading wallet database: Encrypted key corrupt";
387 strErr =
"Error reading wallet database: LegacyDataSPKM::LoadCryptedKey failed";
390 }
catch (
const std::exception& e) {
391 if (strErr.empty()) {
407 ssValue >> kMasterKey;
410 strErr =
strprintf(
"Error reading wallet database: duplicate CMasterKey id %u", nID);
417 }
catch (
const std::exception& e) {
418 if (strErr.empty()) {
433 }
catch (
const std::exception& e) {
434 if (strErr.empty()) {
447 if (!pwallet->LoadWalletFlags(
flags)) {
448 pwallet->WalletLogPrintf(
"Error reading wallet database: Unknown non-tolerable wallet flags found\n");
476 pwallet->
WalletLogPrintf(
"Error getting database cursor for '%s' records\n", key);
486 pwallet->
WalletLogPrintf(
"Error reading next '%s' record for wallet database\n", key);
494 DBErrors record_res = load_func(pwallet, ssKey, ssValue, error);
513 const auto& batch =
wallet.GetDatabase().MakeBatch();
528 throw std::runtime_error(
strprintf(
"Error getting database cursor for '%s' records", type));
547 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());
560 result = std::max(result, hd_chain_res.
m_result);
567 result = std::max(result, key_res.
m_result);
574 result = std::max(result, ckey_res.
m_result);
585 strErr =
"Error reading wallet database: LegacyDataSPKM::LoadCScript failed";
586 return DBErrors::NONCRITICAL_ERROR;
590 result = std::max(result, script_res.
m_result);
593 std::map<uint160, CHDChain> hd_chains;
607 bool internal = false;
609 if (keyMeta.hdKeypath !=
"s" && keyMeta.hdKeypath !=
"m") {
610 std::vector<uint32_t> path;
611 if (keyMeta.has_key_origin) {
613 path = keyMeta.key_origin.path;
616 if (!ParseHDKeypath(keyMeta.hdKeypath, path)) {
617 strErr =
"Error reading wallet database: keymeta with invalid HD keypath";
618 return DBErrors::NONCRITICAL_ERROR;
626 if (path.size() != 3) {
627 strErr =
"Error reading wallet database: keymeta found with unexpected path";
628 return DBErrors::NONCRITICAL_ERROR;
630 if (path[0] != BIP32_HARDENED_FLAG) {
631 strErr = strprintf(
"Unexpected path index of 0x%08x (expected 0x80000000) for the element at index 0", path[0]);
632 return DBErrors::NONCRITICAL_ERROR;
634 if (path[1] != BIP32_HARDENED_FLAG && path[1] != (1 | BIP32_HARDENED_FLAG)) {
635 strErr = strprintf(
"Unexpected path index of 0x%08x (expected 0x80000000 or 0x80000001) for the element at index 1", path[1]);
636 return DBErrors::NONCRITICAL_ERROR;
638 if ((path[2] & BIP32_HARDENED_FLAG) == 0) {
639 strErr = strprintf(
"Unexpected path index of 0x%08x (expected to be greater than or equal to 0x80000000)", path[2]);
640 return DBErrors::NONCRITICAL_ERROR;
642 internal = path[1] == (1 | BIP32_HARDENED_FLAG);
643 index = path[2] & ~BIP32_HARDENED_FLAG;
663 result = std::max(result, keymeta_res.m_result);
666 if (!hd_chains.empty()) {
667 LegacyDataSPKM* legacy_spkm = pwallet->GetLegacyDataSPKM();
669 for (
const auto& [hd_seed_id, chain] : hd_chains) {
670 if (hd_seed_id != legacy_spkm->GetHDChain().seed_id) {
671 legacy_spkm->AddInactiveHDChain(chain);
675 pwallet->WalletLogPrintf(
"Inactive HD chains found but no LegacyDataSPKM\n");
688 pwallet->GetOrCreateLegacyDataSPKM()->LoadWatchOnly(
script);
692 result = std::max(result, watch_script_res.m_result);
699 CKeyMetadata keyMeta;
701 pwallet->GetOrCreateLegacyDataSPKM()->LoadScriptMetadata(
CScriptID(
script), keyMeta);
704 result = std::max(result, watch_meta_res.m_result);
716 value >> default_pubkey;
717 }
catch (
const std::exception& e) {
721 if (!default_pubkey.
IsValid()) {
722 err =
"Error reading wallet database: Default Key corrupt";
723 return DBErrors::CORRUPT;
727 result = std::max(result, default_key_res.m_result);
732 err =
"Found unsupported 'wkey' record, try loading with version 0.18";
735 result = std::max(result, wkey_res.m_result);
739 pwallet->WalletLogPrintf(
"Legacy Wallet Keys: %u plaintext, %u encrypted, %u w/ metadata, %u total.\n",
740 key_res.m_records, ckey_res.m_records, keymeta_res.m_records, key_res.m_records + ckey_res.m_records);
746template<
typename... Args>
763 DBErrors result = DBErrors::LOAD_OK;
770 }
catch (
const std::ios_base::failure& e) {
771 strErr =
strprintf(
"Error: Unrecognized descriptor found in wallet %s. ", pwallet->
GetName());
772 strErr += (last_client >
CLIENT_VERSION) ?
"The wallet might have been created on a newer version. " :
773 "The database might be corrupted or the software version is not compatible with one of your wallet descriptors. ";
774 strErr +=
"Please try running the latest software version";
776 strErr =
strprintf(
"%s\nDetails: %s", strErr, e.what());
777 return DBErrors::UNKNOWN_DESCRIPTOR;
781 strErr =
"The descriptor ID calculated by the wallet differs from the one in DB";
782 return DBErrors::CORRUPT;
793 uint32_t key_exp_index;
797 key >> key_exp_index;
810 xpub.
Decode(ser_xpub.data());
816 return DBErrors::LOAD_OK;
818 result = std::max(result, key_cache_res.
m_result);
825 uint32_t key_exp_index;
828 key >> key_exp_index;
833 xpub.
Decode(ser_xpub.data());
835 return DBErrors::LOAD_OK;
837 result = std::max(result, lh_cache_res.
m_result);
854 strErr =
"Error reading wallet database: descriptor unencrypted key CPubKey corrupt";
855 return DBErrors::CORRUPT;
865 const auto keypair_hash =
Hash(pubkey, pkey);
867 if (keypair_hash != hash)
869 strErr =
"Error reading wallet database: descriptor unencrypted key CPubKey/CPrivKey corrupt";
870 return DBErrors::CORRUPT;
873 if (!privkey.
Load(pkey, pubkey,
true))
875 strErr =
"Error reading wallet database: descriptor unencrypted key CPrivKey corrupt";
876 return DBErrors::CORRUPT;
879 return DBErrors::LOAD_OK;
881 result = std::max(result, key_res.
m_result);
896 err =
"Error reading wallet database: descriptor encrypted key CPubKey corrupt";
897 return DBErrors::CORRUPT;
899 std::vector<unsigned char> privkey;
902 ckeys[pubkey.
GetID()] = std::make_pair(pubkey, privkey);
903 return DBErrors::LOAD_OK;
905 result = std::max(result, ckey_res.
m_result);
910 }
catch (std::runtime_error& e) {
912 return DBErrors::CORRUPT;
918 if (desc_res.
m_result <= DBErrors::NONCRITICAL_ERROR) {
920 pwallet->
WalletLogPrintf(
"Descriptors: %u, Descriptor Keys: %u plaintext, %u encrypted, %u total.\n",
921 desc_res.
m_records, num_keys, num_ckeys, num_keys + num_ckeys);
930 DBErrors result = DBErrors::LOAD_OK;
935 std::string strAddress;
939 pwallet->m_address_book[DecodeDestination(strAddress)].SetLabel(label);
940 return DBErrors::LOAD_OK;
942 result = std::max(result, name_res.
m_result);
947 std::string strAddress;
949 std::string purpose_str;
950 value >> purpose_str;
951 std::optional<AddressPurpose> purpose{PurposeFromString(purpose_str)};
953 pwallet->
WalletLogPrintf(
"Warning: nonstandard purpose string '%s' for address '%s'\n", purpose_str, strAddress);
956 return DBErrors::LOAD_OK;
958 result = std::max(result, purpose_res.m_result);
963 std::string strAddress, strKey, strValue;
967 const CTxDestination& dest{DecodeDestination(strAddress)};
968 if (strKey.compare(
"used") == 0) {
975 pwallet->LoadAddressPreviouslySpent(dest);
976 }
else if (strKey.starts_with(
"rr")) {
979 pwallet->LoadAddressReceiveRequest(dest, strKey.substr(2), strValue);
981 return DBErrors::LOAD_OK;
983 result = std::max(result, dest_res.m_result);
990 std::map<Wtxid, CTransactionRef> variants;
1003 if (status == DatabaseCursor::Status::DONE)
break;
1004 if (status == DatabaseCursor::Status::FAIL) {
1009 if (tx->GetHash() != txid) {
1010 throw std::runtime_error(
strprintf(
"Corrupted witness variant, tx hash differs"));
1012 if (!variants.emplace(tx->GetWitnessHash(), std::move(tx)).second) {
1013 throw std::runtime_error(
strprintf(
"Duplicate witness variant"));
1022 DBErrors result = DBErrors::LOAD_OK;
1025 any_unordered =
false;
1028 DBErrors result = DBErrors::LOAD_OK;
1032 CWalletTx wtx{deserialize, value, ReadWtxVariants(batch, hash)};
1033 if (wtx.GetHash() != hash) {
1034 result = std::max(result, DBErrors::NEED_RESCAN);
1037 if (wtx.nOrderPos == -1) {
1038 any_unordered = true;
1041 if (!pwallet->LoadToWallet(std::move(wtx))) {
1042 err =
"Error: Corrupt transaction found. This can be fixed by removing transactions from wallet and rescanning.";
1043 return DBErrors::CORRUPT;
1045 }
catch (
const std::exception& e) {
1046 err =
strprintf(
"Error: Corrupt tx record found: %s" ,e.what());
1047 return DBErrors::CORRUPT;
1051 result = std::max(result, tx_res.m_result);
1060 pwallet->LoadLockedCoin(COutPoint(hash, n), true);
1061 return DBErrors::LOAD_OK;
1063 result = std::max(result, locked_utxo_res.m_result);
1070 value >> pwallet->nOrderPosNext;
1071 }
catch (
const std::exception& e) {
1073 return DBErrors::NONCRITICAL_ERROR;
1075 return DBErrors::LOAD_OK;
1077 result = std::max(result, order_pos_res.m_result);
1081 for (
auto& [
id, wtx] : pwallet->mapWallet) {
1082 if (wtx.IsCoinBase() && wtx.isInactive()) {
1083 pwallet->AbandonTransaction(wtx);
1093 DBErrors result = DBErrors::LOAD_OK;
1096 std::set<std::pair<OutputType, bool>> seen_spks;
1100 uint8_t output_type;
1106 auto [it,
insert] = seen_spks.emplace(
static_cast<OutputType>(output_type), internal);
1108 strErr =
"Multiple ScriptpubKeyMans specified for a single type";
1109 return DBErrors::CORRUPT;
1112 return DBErrors::LOAD_OK;
1114 result = std::max(result, spkm_res.
m_result);
1127 return DBErrors::CORRUPT;
1129 return DBErrors::LOAD_OK;
1136 DBErrors result = DBErrors::LOAD_OK;
1137 bool any_unordered =
false;
1144 if (has_last_client) pwallet->
WalletLogPrintf(
"Last client version = %d\n", last_client);
1149 if ((result =
LoadWalletFlags(pwallet, *m_batch)) != DBErrors::LOAD_OK)
return result;
1151#ifndef ENABLE_EXTERNAL_SIGNER
1153 pwallet->
WalletLogPrintf(
"Error: External signer wallet being loaded without external signer support compiled\n");
1154 return DBErrors::EXTERNAL_SIGNER_SUPPORT_REQUIRED;
1166 if (result == DBErrors::UNKNOWN_DESCRIPTOR)
return result;
1178 result = std::max(
LoadTxRecords(pwallet, *m_batch, any_unordered), result);
1179 }
catch (std::runtime_error& e) {
1185 result = DBErrors::CORRUPT;
1188 result = DBErrors::CORRUPT;
1193 if (result != DBErrors::LOAD_OK)
1207 result = DBErrors::CORRUPT;
1215 pwallet->
WalletLogPrintf(
"Detected extraneous encryption keys in this wallet without private keys. Removing extraneous encryption keys.\n");
1217 if (!EraseMasterKey(
id)) {
1218 pwallet->
WalletLogPrintf(
"Error: Unable to remove extraneous encryption key '%u'. Wallet corrupt.\n",
id);
1219 return DBErrors::CORRUPT;
1257bool WalletBatch::WriteAddressPreviouslySpent(
const CTxDestination& dest,
bool previously_spent)
1260 return previously_spent ? WriteIC(key, std::string(
"1")) : EraseIC(key);
1263bool WalletBatch::WriteAddressReceiveRequest(
const CTxDestination& dest,
const std::string&
id,
const std::string& receive_request)
1268bool WalletBatch::EraseAddressReceiveRequest(
const CTxDestination& dest,
const std::string&
id)
1277 return m_batch->ErasePrefix(
prefix);
1280bool WalletBatch::WriteWalletFlags(
const uint64_t
flags)
1285bool WalletBatch::EraseRecords(
const std::unordered_set<std::string>& types)
1287 return std::all_of(types.begin(), types.end(), [&](
const std::string& type) {
1288 return m_batch->ErasePrefix(DataStream() << type);
1292bool WalletBatch::TxnBegin()
1294 return m_batch->TxnBegin();
1297bool WalletBatch::TxnCommit()
1299 bool res = m_batch->TxnCommit();
1301 for (
const auto&
listener : m_txn_listeners) {
1305 m_txn_listeners.clear();
1310bool WalletBatch::TxnAbort()
1312 bool res = m_batch->TxnAbort();
1314 for (
const auto&
listener : m_txn_listeners) {
1318 m_txn_listeners.clear();
1325 assert(m_batch->HasActiveTxn());
1326 m_txn_listeners.emplace_back(l);
1333 exists = fs::symlink_status(path).type() != fs::file_type::not_found;
1334 }
catch (
const fs::filesystem_error& e) {
1336 status = DatabaseStatus::FAILED_BAD_PATH;
1340 std::optional<DatabaseFormat>
format;
1343 format = DatabaseFormat::BERKELEY_RO;
1348 status = DatabaseStatus::FAILED_BAD_FORMAT;
1351 format = DatabaseFormat::SQLITE;
1355 status = DatabaseStatus::FAILED_NOT_FOUND;
1361 status = DatabaseStatus::FAILED_BAD_FORMAT;
1367 status = DatabaseStatus::FAILED_ALREADY_EXISTS;
1373 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)));
1374 status = DatabaseStatus::FAILED_LEGACY_DISABLED;
1381 status = DatabaseStatus::FAILED_BAD_FORMAT;
1389 format = DatabaseFormat::SQLITE;
1392 if (
format == DatabaseFormat::SQLITE) {
1396 if (
format == DatabaseFormat::BERKELEY_RO) {
1401 status = DatabaseStatus::FAILED_BAD_FORMAT;
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
catch(const std::exception &e)
#define STR_INTERNAL_BUG(msg)
#define Assume(val)
Assume is the identity function.
An encapsulated private key.
bool Load(const CPrivKey &privkey, const CPubKey &vchPubKey, bool fSkipCheck)
Load private key and check that public key matches.
An outpoint - a combination of a transaction hash and an index n into its vout.
An encapsulated public key.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Serialized script, used inside transaction inputs and outputs.
A reference to a CScript: the Hash160 of its serialization.
Double ended buffer combining vector and stream-like interfaces.
Cache for single descriptor's derived extended pubkeys.
std::unordered_map< uint32_t, ExtPubKeyMap > GetCachedDerivedExtPubKeys() const
Retrieve all cached derived xpubs.
void CacheDerivedExtPubKey(uint32_t key_exp_pos, uint32_t der_index, const CExtPubKey &xpub)
Cache an xpub derived at an index.
ExtPubKeyMap GetCachedParentExtPubKeys() const
Retrieve all cached parent xpubs.
ExtPubKeyMap GetCachedLastHardenedExtPubKeys() const
Retrieve all cached last hardened xpubs.
void CacheParentExtPubKey(uint32_t key_exp_pos, const CExtPubKey &xpub)
Cache a parent xpub.
void CacheLastHardenedExtPubKey(uint32_t key_exp_pos, const CExtPubKey &xpub)
Cache a last hardened xpub.
constexpr bool IsNull() const
const uint256 & ToUint256() const LIFETIMEBOUND
static constexpr int VERSION_HD_CHAIN_SPLIT
uint32_t nInternalChainCounter
uint32_t nExternalChainCounter
CKeyID seed_id
seed hash160
static constexpr int VERSION_HD_BASE
Private key encryption is done based on a CMasterKey, which holds a salt and random encryption key.
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
void LoadActiveScriptPubKeyMan(uint256 id, OutputType type, bool internal)
Loads an active ScriptPubKeyMan for the specified type and internal.
unsigned int nMasterKeyMaxID
bool HaveCryptedKeys() const
LegacyDataSPKM * GetOrCreateLegacyDataSPKM()
const std::string & GetName() const
Get a name for this wallet for logging/debugging purposes.
void LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor &desc, const KeyMap &keys, const CryptedKeyMap &ckeys)
Instantiate a descriptor ScriptPubKeyMan from the WalletDescriptor and load it.
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.
bool HasEncryptionKeys() const override
MasterKeyMap mapMasterKeys
RecursiveMutex cs_wallet
Main wallet lock.
A transaction with a bunch of additional info that only the owner cares about.
const Txid & GetHash() const LIFETIMEBOUND
const std::map< Wtxid, CTransactionRef > & GetTxs() const
RAII class that provides access to a WalletDatabase.
virtual std::unique_ptr< DatabaseCursor > GetNewPrefixCursor(std::span< const std::byte > prefix)=0
bool LoadCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret, bool checksum_valid)
Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
bool LoadKey(const CKey &key, const CPubKey &pubkey)
Adds a key to the store, without saving it to disk (used by LoadWallet)
bool LoadCScript(const CScript &redeemScript)
Adds a CScript to the store.
void LoadHDChain(const CHDChain &chain)
Load a HD chain model (used by LoadWallet)
Access to the wallet database.
bool WriteDescriptor(const uint256 &desc_id, const WalletDescriptor &descriptor)
bool TxnAbort()
Abort current transaction.
bool WriteDescriptorParentCache(const CExtPubKey &xpub, const uint256 &desc_id, uint32_t key_exp_index)
bool EraseName(const std::string &strAddress)
bool WriteBestBlock(const CBlockLocator &locator)
bool ReadBestBlock(CBlockLocator &locator)
bool WriteDescriptorCacheItems(const uint256 &desc_id, const DescriptorCache &cache)
bool WriteMasterKey(unsigned int nID, const CMasterKey &kMasterKey)
bool WriteWatchOnly(const CScript &script, const CKeyMetadata &keymeta)
bool TxnBegin()
Begin a new transaction.
bool TxnCommit()
Commit current transaction.
bool WriteName(const std::string &strAddress, const std::string &strName)
bool WritePurpose(const std::string &strAddress, const std::string &purpose)
std::unique_ptr< DatabaseBatch > m_batch
bool WriteDescriptorLastHardenedCache(const CExtPubKey &xpub, const uint256 &desc_id, uint32_t key_exp_index)
bool WriteIC(const K &key, const T &value, bool fOverwrite=true)
bool WriteOrderPosNext(int64_t nOrderPosNext)
bool WriteTx(const CWalletTx &wtx)
bool WriteKey(const CPubKey &vchPubKey, const CPrivKey &vchPrivKey, const CKeyMetadata &keyMeta)
bool EraseIC(const K &key)
bool WriteCryptedKey(const CPubKey &vchPubKey, const std::vector< unsigned char > &vchCryptedSecret, const CKeyMetadata &keyMeta)
bool ErasePurpose(const std::string &strAddress)
bool EraseLockedUTXO(const COutPoint &output)
bool WriteDescriptorDerivedCache(const CExtPubKey &xpub, const uint256 &desc_id, uint32_t key_exp_index, uint32_t der_index)
bool WriteCryptedDescriptorKey(const uint256 &desc_id, const CPubKey &pubkey, const std::vector< unsigned char > &secret)
bool WriteLockedUTXO(const COutPoint &output)
bool EraseMasterKey(unsigned int id)
bool WriteActiveScriptPubKeyMan(uint8_t type, const uint256 &id, bool internal)
bool WriteWtxVariant(const Txid &txid, const CTransactionRef &tx)
bool EraseActiveScriptPubKeyMan(uint8_t type, bool internal)
bool WriteKeyMetadata(const CKeyMetadata &meta, const CPubKey &pubkey, bool overwrite)
bool WriteDescriptorKey(const uint256 &desc_id, const CPubKey &pubkey, const CPrivKey &privkey)
An instance of this class represents one database.
Descriptor with some wallet metadata.
constexpr int CLIENT_VERSION
static std::string PathToString(const path &path)
Convert path object to a byte string.
bool IsWalletFlagSet(uint64_t flag) const override
check if a certain wallet flag is set
DBErrors ReorderTransactions()
void UpgradeDescriptorCache() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet)
Upgrade DescriptorCaches.
uint256 Hash(const T &in1)
Compute the 256-bit hash of an object.
std::vector< unsigned char, secure_allocator< unsigned char > > CPrivKey
CPrivKey is a serialized private key, with all parameters included (SIZE bytes)
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
std::string EncodeDestination(const CTxDestination &dest)
#define LogDebug(category,...)
void insert(Tdst &dst, const Tsrc &src)
Simplification of std insertion.
const std::string BESTBLOCK
const std::string WALLETDESCRIPTORCKEY
const std::string WALLETDESCRIPTORLHCACHE
const std::string MINVERSION
const std::string WATCHMETA
const std::string DEFAULTKEY
const std::string OLD_KEY
const std::string WALLETDESCRIPTORKEY
const std::string WTX_VARIANT
const std::string ACENTRY
const std::string ACTIVEEXTERNALSPK
const std::string CRYPTED_KEY
const std::string DESTDATA
const std::string CSCRIPT
const std::unordered_set< std::string > LEGACY_TYPES
const std::string SETTINGS
const std::string BESTBLOCK_NOMERKLE
const std::string LOCKED_UTXO
const std::string ACTIVEINTERNALSPK
const std::string HDCHAIN
const std::string ORDERPOSNEXT
const std::string VERSION
const std::string WALLETDESCRIPTORCACHE
const std::string MASTER_KEY
const std::string KEYMETA
const std::string PURPOSE
const std::string WALLETDESCRIPTOR
static LoadResult LoadRecords(CWallet *pwallet, DatabaseBatch &batch, const std::string &key, LoadFunc load_func)
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)
std::unique_ptr< WalletDatabase > MakeDatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
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.
bool LoadKey(CWallet *pwallet, DataStream &ssKey, DataStream &ssValue, std::string &strErr)
static DataStream PrefixStream(const Args &... args)
static DBErrors LoadLegacyWalletRecords(CWallet *pwallet, DatabaseBatch &batch, int last_client) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
bool LoadCryptedKey(CWallet *pwallet, DataStream &ssKey, DataStream &ssValue, std::string &strErr)
std::map< CKeyID, std::pair< CPubKey, std::vector< unsigned char > > > CryptedKeyMap
std::function< DBErrors(CWallet *pwallet, DataStream &key, DataStream &value, std::string &err)> LoadFunc
std::unique_ptr< SQLiteDatabase > MakeSQLiteDatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
fs::path SQLiteDataFile(const fs::path &path)
DBErrors
Overview of wallet database classes:
@ UNEXPECTED_LEGACY_ENTRY
static DBErrors LoadWalletFlags(CWallet *pwallet, DatabaseBatch &batch) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
static DBErrors LoadActiveSPKMs(CWallet *pwallet, DatabaseBatch &batch) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
static DBErrors LoadDecryptionKeys(CWallet *pwallet, DatabaseBatch &batch) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
bool LoadEncryptionKey(CWallet *pwallet, DataStream &ssKey, DataStream &ssValue, std::string &strErr)
bool HasLegacyRecords(CWallet &wallet)
Returns true if there are any DBKeys::LEGACY_TYPES record in the wallet db.
bool IsBDBFile(const fs::path &path)
fs::path BDBDataFile(const fs::path &wallet_path)
bool LoadHDChain(CWallet *pwallet, DataStream &ssValue, std::string &strErr)
static DBErrors LoadTxRecords(CWallet *pwallet, DatabaseBatch &batch, bool &any_unordered) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
static std::map< Wtxid, CTransactionRef > ReadWtxVariants(DatabaseBatch &batch, const Txid &txid)
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.
std::string SQLiteDatabaseVersion()
bool IsSQLiteFile(const fs::path &path)
@ WALLET_FLAG_EXTERNAL_SIGNER
Indicates that the wallet needs an external signer.
@ WALLET_FLAG_DESCRIPTORS
Indicate that this wallet supports DescriptorScriptPubKeyMan.
@ WALLET_FLAG_DISABLE_PRIVATE_KEYS
static DBErrors LoadAddressBookRecords(CWallet *pwallet, DatabaseBatch &batch) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
std::map< CKeyID, CKey > KeyMap
static LoadResult LoadRecords(CWallet *pwallet, DatabaseBatch &batch, const std::string &key, DataStream &prefix, LoadFunc load_func)
static DBErrors LoadDescriptorWalletRecords(CWallet *pwallet, DatabaseBatch &batch, int last_client) EXCLUSIVE_LOCKS_REQUIRED(pwallet -> cs_wallet)
constexpr TransactionSerParams TX_WITH_WITNESS
std::shared_ptr< const CTransaction > CTransactionRef
constexpr unsigned int BIP32_EXTKEY_SIZE
void SerializeMany(Stream &s, const Args &... args)
Support for (un)serializing many things at once.
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
std::vector< uint256 > vHave
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE])
std::optional< DatabaseFormat > require_format
std::vector< uint16_t > keys
#define EXCLUSIVE_LOCKS_REQUIRED(...)
consteval auto _(util::TranslatedLiteral str)
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.