mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-21 14:34:49 +01:00
Implement LegacyScriptPubKeyMan::DeleteRecords
This commit is contained in:
parent
35f428fae6
commit
22401f17e0
4 changed files with 55 additions and 0 deletions
|
@ -1964,6 +1964,13 @@ std::optional<MigrationData> LegacyScriptPubKeyMan::MigrateToDescriptor()
|
|||
return out;
|
||||
}
|
||||
|
||||
bool LegacyScriptPubKeyMan::DeleteRecords()
|
||||
{
|
||||
LOCK(cs_KeyStore);
|
||||
WalletBatch batch(m_storage.GetDatabase());
|
||||
return batch.EraseRecords(DBKeys::LEGACY_TYPES);
|
||||
}
|
||||
|
||||
util::Result<CTxDestination> DescriptorScriptPubKeyMan::GetNewDestination(const OutputType type)
|
||||
{
|
||||
// Returns true if this descriptor supports getting new addresses. Conditions where we may be unable to fetch them (e.g. locked) are caught later
|
||||
|
|
|
@ -517,6 +517,8 @@ public:
|
|||
/** Get the DescriptorScriptPubKeyMans (with private keys) that have the same scriptPubKeys as this LegacyScriptPubKeyMan.
|
||||
* Does not modify this ScriptPubKeyMan. */
|
||||
std::optional<MigrationData> MigrateToDescriptor();
|
||||
/** Delete all the records ofthis LegacyScriptPubKeyMan from disk*/
|
||||
bool DeleteRecords();
|
||||
};
|
||||
|
||||
/** Wraps a LegacyScriptPubKeyMan so that it can be returned in a new unique_ptr. Does not provide privkeys */
|
||||
|
|
|
@ -59,6 +59,7 @@ const std::string WALLETDESCRIPTORCKEY{"walletdescriptorckey"};
|
|||
const std::string WALLETDESCRIPTORKEY{"walletdescriptorkey"};
|
||||
const std::string WATCHMETA{"watchmeta"};
|
||||
const std::string WATCHS{"watchs"};
|
||||
const std::unordered_set<std::string> LEGACY_TYPES{CRYPTED_KEY, CSCRIPT, DEFAULTKEY, HDCHAIN, KEYMETA, KEY, OLD_KEY, POOL, WATCHMETA, WATCHS};
|
||||
} // namespace DBKeys
|
||||
|
||||
//
|
||||
|
@ -1083,6 +1084,45 @@ bool WalletBatch::WriteWalletFlags(const uint64_t flags)
|
|||
return WriteIC(DBKeys::FLAGS, flags);
|
||||
}
|
||||
|
||||
bool WalletBatch::EraseRecords(const std::unordered_set<std::string>& types)
|
||||
{
|
||||
// Get cursor
|
||||
if (!m_batch->StartCursor())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Iterate the DB and look for any records that have the type prefixes
|
||||
while (true)
|
||||
{
|
||||
// Read next record
|
||||
CDataStream key(SER_DISK, CLIENT_VERSION);
|
||||
CDataStream value(SER_DISK, CLIENT_VERSION);
|
||||
bool complete;
|
||||
bool ret = m_batch->ReadAtCursor(key, value, complete);
|
||||
if (complete) {
|
||||
break;
|
||||
}
|
||||
else if (!ret)
|
||||
{
|
||||
m_batch->CloseCursor();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Make a copy of key to avoid data being deleted by the following read of the type
|
||||
Span<const unsigned char> key_data = MakeUCharSpan(key);
|
||||
|
||||
std::string type;
|
||||
key >> type;
|
||||
|
||||
if (types.count(type) > 0) {
|
||||
m_batch->Erase(key_data);
|
||||
}
|
||||
}
|
||||
m_batch->CloseCursor();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WalletBatch::TxnBegin()
|
||||
{
|
||||
return m_batch->TxnBegin();
|
||||
|
|
|
@ -84,6 +84,9 @@ extern const std::string WALLETDESCRIPTORCKEY;
|
|||
extern const std::string WALLETDESCRIPTORKEY;
|
||||
extern const std::string WATCHMETA;
|
||||
extern const std::string WATCHS;
|
||||
|
||||
// Keys in this set pertain only to the legacy wallet (LegacyScriptPubKeyMan) and are removed during migration from legacy to descriptors.
|
||||
extern const std::unordered_set<std::string> LEGACY_TYPES;
|
||||
} // namespace DBKeys
|
||||
|
||||
/* simple HD chain data model */
|
||||
|
@ -276,6 +279,9 @@ public:
|
|||
//! write the hdchain model (external chain child index counter)
|
||||
bool WriteHDChain(const CHDChain& chain);
|
||||
|
||||
//! Delete records of the given types
|
||||
bool EraseRecords(const std::unordered_set<std::string>& types);
|
||||
|
||||
bool WriteWalletFlags(const uint64_t flags);
|
||||
//! Begin a new transaction
|
||||
bool TxnBegin();
|
||||
|
|
Loading…
Add table
Reference in a new issue