mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-24 22:45:41 +01:00
Load the descriptor cache from the wallet file
This commit is contained in:
@@ -44,6 +44,7 @@ const std::string SETTINGS{"settings"};
|
||||
const std::string TX{"tx"};
|
||||
const std::string VERSION{"version"};
|
||||
const std::string WALLETDESCRIPTOR{"walletdescriptor"};
|
||||
const std::string WALLETDESCRIPTORCACHE{"walletdescriptorcache"};
|
||||
const std::string WATCHMETA{"watchmeta"};
|
||||
const std::string WATCHS{"watchs"};
|
||||
} // namespace DBKeys
|
||||
@@ -200,6 +201,7 @@ public:
|
||||
std::vector<uint256> vWalletUpgrade;
|
||||
std::map<OutputType, uint256> m_active_external_spks;
|
||||
std::map<OutputType, uint256> m_active_internal_spks;
|
||||
std::map<uint256, DescriptorCache> m_descriptor_caches;
|
||||
|
||||
CWalletScanState() {
|
||||
}
|
||||
@@ -433,7 +435,38 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
||||
ssKey >> id;
|
||||
WalletDescriptor desc;
|
||||
ssValue >> desc;
|
||||
if (wss.m_descriptor_caches.count(id) == 0) {
|
||||
wss.m_descriptor_caches[id] = DescriptorCache();
|
||||
}
|
||||
pwallet->LoadDescriptorScriptPubKeyMan(id, desc);
|
||||
} else if (strType == DBKeys::WALLETDESCRIPTORCACHE) {
|
||||
bool parent = true;
|
||||
uint256 desc_id;
|
||||
uint32_t key_exp_index;
|
||||
uint32_t der_index;
|
||||
ssKey >> desc_id;
|
||||
ssKey >> key_exp_index;
|
||||
|
||||
// if the der_index exists, it's a derived xpub
|
||||
try
|
||||
{
|
||||
ssKey >> der_index;
|
||||
parent = false;
|
||||
}
|
||||
catch (...) {}
|
||||
|
||||
std::vector<unsigned char> ser_xpub(BIP32_EXTKEY_SIZE);
|
||||
ssValue >> ser_xpub;
|
||||
CExtPubKey xpub;
|
||||
xpub.Decode(ser_xpub.data());
|
||||
if (wss.m_descriptor_caches.count(desc_id)) {
|
||||
wss.m_descriptor_caches[desc_id] = DescriptorCache();
|
||||
}
|
||||
if (parent) {
|
||||
wss.m_descriptor_caches[desc_id].CacheParentExtPubKey(key_exp_index, xpub);
|
||||
} else {
|
||||
wss.m_descriptor_caches[desc_id].CacheDerivedExtPubKey(key_exp_index, der_index, xpub);
|
||||
}
|
||||
} else if (strType != DBKeys::BESTBLOCK && strType != DBKeys::BESTBLOCK_NOMERKLE &&
|
||||
strType != DBKeys::MINVERSION && strType != DBKeys::ACENTRY &&
|
||||
strType != DBKeys::VERSION && strType != DBKeys::SETTINGS) {
|
||||
@@ -535,6 +568,13 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet)
|
||||
pwallet->SetActiveScriptPubKeyMan(spk_man_pair.second, spk_man_pair.first, /* internal */ true, /* memonly */ true);
|
||||
}
|
||||
|
||||
// Set the descriptor caches
|
||||
for (auto desc_cache_pair : wss.m_descriptor_caches) {
|
||||
auto spk_man = pwallet->GetScriptPubKeyMan(desc_cache_pair.first);
|
||||
assert(spk_man);
|
||||
((DescriptorScriptPubKeyMan*)spk_man)->SetCache(desc_cache_pair.second);
|
||||
}
|
||||
|
||||
if (fNoncriticalErrors && result == DBErrors::LOAD_OK)
|
||||
result = DBErrors::NONCRITICAL_ERROR;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user