Implement LegacyScriptPubKeyMan::DeleteRecords
This commit is contained in:
1 parent
35f428fae6
commit
22401f17e0
4 files changed
+55
No files matched your search
@@ -1964,6 +1964,13 @@ std::optional<MigrationData> LegacyScriptPubKeyMan::MigrateToDescriptor()
|
|||||||
return out;
|
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)
|
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
|
// 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.
|
/** Get the DescriptorScriptPubKeyMans (with private keys) that have the same scriptPubKeys as this LegacyScriptPubKeyMan.
|
||||||
* Does not modify this ScriptPubKeyMan. */
|
* Does not modify this ScriptPubKeyMan. */
|
||||||
std::optional<MigrationData> MigrateToDescriptor();
|
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 */
|
/** 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 WALLETDESCRIPTORKEY{"walletdescriptorkey"};
|
||||||
const std::string WATCHMETA{"watchmeta"};
|
const std::string WATCHMETA{"watchmeta"};
|
||||||
const std::string WATCHS{"watchs"};
|
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
|
} // namespace DBKeys
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1083,6 +1084,45 @@ bool WalletBatch::WriteWalletFlags(const uint64_t flags)
|
|||||||
return WriteIC(DBKeys::FLAGS, 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()
|
bool WalletBatch::TxnBegin()
|
||||||
{
|
{
|
||||||
return m_batch->TxnBegin();
|
return m_batch->TxnBegin();
|
||||||
|
|||||||
@@ -84,6 +84,9 @@ extern const std::string WALLETDESCRIPTORCKEY;
|
|||||||
extern const std::string WALLETDESCRIPTORKEY;
|
extern const std::string WALLETDESCRIPTORKEY;
|
||||||
extern const std::string WATCHMETA;
|
extern const std::string WATCHMETA;
|
||||||
extern const std::string WATCHS;
|
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
|
} // namespace DBKeys
|
||||||
|
|
||||||
/* simple HD chain data model */
|
/* simple HD chain data model */
|
||||||
@@ -276,6 +279,9 @@ public:
|
|||||||
//! write the hdchain model (external chain child index counter)
|
//! write the hdchain model (external chain child index counter)
|
||||||
bool WriteHDChain(const CHDChain& chain);
|
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);
|
bool WriteWalletFlags(const uint64_t flags);
|
||||||
//! Begin a new transaction
|
//! Begin a new transaction
|
||||||
bool TxnBegin();
|
bool TxnBegin();
|
||||||
|
|||||||
Reference in new issue
Block a user