Merge bitcoin/bitcoin#27224: refactor: Remove CAddressBookData::destdata
a5986e82ddrefactor: Remove CAddressBookData::destdata (Ryan Ofsky)5938ad0bdbwallet: Add DatabaseBatch::ErasePrefix method (Ryan Ofsky) Pull request description: This is cleanup that doesn't change external behavior. Benefits of the cleanup are: - Removes awkward `StringMap` intermediate representation for wallet address metadata. - Simplifies `CWallet`, deals with used address and received request serialization in `walletdb.cpp` instead of higher level wallet code - Adds test coverage and documentation This PR doesn't change externally observable behavior. Internally, the only change in behavior is that `EraseDestData` deletes rows directly from the database because they are no longer stored in memory. This is more direct and efficient because it uses a single lookup and scan instead of multiple lookups. Motivation for this cleanup is making changes like #18550, #18192, #13756 easier to reason about and less likely to result in unintended behavior and bugs --- This PR is a rebased copy of #18608. For some reason that PR is locked and couldn't be reopened or commented on. This PR is an alternative to #27215 with differences described in https://github.com/bitcoin/bitcoin/pull/27215#pullrequestreview-1329028143 ACKs for top commit: achow101: ACKa5986e82ddfurszy: Code ACKa5986e82Tree-SHA512: 6bd3e402f1f60263fbd433760bdc29d04175ddaf8307207c4a67d59f6cffa732e176ba57886e02926f7a1615dce0ed9cda36c8cbc6430aa8e5b56934c23f3fe7
This commit is contained in:
11 files changed
+215
-95
No files matched your search
@@ -427,19 +427,63 @@ BOOST_AUTO_TEST_CASE(ComputeTimeSmart)
|
||||
BOOST_CHECK_EQUAL(AddTx(*m_node.chainman, m_wallet, 5, 50, 600), 300);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(LoadReceiveRequests)
|
||||
{
|
||||
CTxDestination dest = PKHash();
|
||||
LOCK(m_wallet.cs_wallet);
|
||||
WalletBatch batch{m_wallet.GetDatabase()};
|
||||
m_wallet.SetAddressUsed(batch, dest, true);
|
||||
m_wallet.SetAddressReceiveRequest(batch, dest, "0", "val_rr0");
|
||||
m_wallet.SetAddressReceiveRequest(batch, dest, "1", "val_rr1");
|
||||
static const DatabaseFormat DATABASE_FORMATS[] = {
|
||||
#ifdef USE_SQLITE
|
||||
DatabaseFormat::SQLITE,
|
||||
#endif
|
||||
#ifdef USE_BDB
|
||||
DatabaseFormat::BERKELEY,
|
||||
#endif
|
||||
};
|
||||
|
||||
auto values = m_wallet.GetAddressReceiveRequests();
|
||||
BOOST_CHECK_EQUAL(values.size(), 2U);
|
||||
BOOST_CHECK_EQUAL(values[0], "val_rr0");
|
||||
BOOST_CHECK_EQUAL(values[1], "val_rr1");
|
||||
void TestLoadWallet(const std::string& name, DatabaseFormat format, std::function<void(std::shared_ptr<CWallet>)> f)
|
||||
{
|
||||
node::NodeContext node;
|
||||
auto chain{interfaces::MakeChain(node)};
|
||||
DatabaseOptions options;
|
||||
options.require_format = format;
|
||||
DatabaseStatus status;
|
||||
bilingual_str error;
|
||||
std::vector<bilingual_str> warnings;
|
||||
auto database{MakeWalletDatabase(name, options, status, error)};
|
||||
auto wallet{std::make_shared<CWallet>(chain.get(), "", std::move(database))};
|
||||
BOOST_CHECK_EQUAL(wallet->LoadWallet(), DBErrors::LOAD_OK);
|
||||
WITH_LOCK(wallet->cs_wallet, f(wallet));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(LoadReceiveRequests, TestingSetup)
|
||||
{
|
||||
for (DatabaseFormat format : DATABASE_FORMATS) {
|
||||
const std::string name{strprintf("receive-requests-%i", format)};
|
||||
TestLoadWallet(name, format, [](std::shared_ptr<CWallet> wallet) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet) {
|
||||
BOOST_CHECK(!wallet->IsAddressPreviouslySpent(PKHash()));
|
||||
WalletBatch batch{wallet->GetDatabase()};
|
||||
BOOST_CHECK(batch.WriteAddressPreviouslySpent(PKHash(), true));
|
||||
BOOST_CHECK(batch.WriteAddressPreviouslySpent(ScriptHash(), true));
|
||||
BOOST_CHECK(wallet->SetAddressReceiveRequest(batch, PKHash(), "0", "val_rr00"));
|
||||
BOOST_CHECK(wallet->EraseAddressReceiveRequest(batch, PKHash(), "0"));
|
||||
BOOST_CHECK(wallet->SetAddressReceiveRequest(batch, PKHash(), "1", "val_rr10"));
|
||||
BOOST_CHECK(wallet->SetAddressReceiveRequest(batch, PKHash(), "1", "val_rr11"));
|
||||
BOOST_CHECK(wallet->SetAddressReceiveRequest(batch, ScriptHash(), "2", "val_rr20"));
|
||||
});
|
||||
TestLoadWallet(name, format, [](std::shared_ptr<CWallet> wallet) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet) {
|
||||
BOOST_CHECK(wallet->IsAddressPreviouslySpent(PKHash()));
|
||||
BOOST_CHECK(wallet->IsAddressPreviouslySpent(ScriptHash()));
|
||||
auto requests = wallet->GetAddressReceiveRequests();
|
||||
auto erequests = {"val_rr11", "val_rr20"};
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(requests.begin(), requests.end(), std::begin(erequests), std::end(erequests));
|
||||
WalletBatch batch{wallet->GetDatabase()};
|
||||
BOOST_CHECK(batch.WriteAddressPreviouslySpent(PKHash(), false));
|
||||
BOOST_CHECK(batch.EraseAddressData(ScriptHash()));
|
||||
});
|
||||
TestLoadWallet(name, format, [](std::shared_ptr<CWallet> wallet) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet) {
|
||||
BOOST_CHECK(!wallet->IsAddressPreviouslySpent(PKHash()));
|
||||
BOOST_CHECK(!wallet->IsAddressPreviouslySpent(ScriptHash()));
|
||||
auto requests = wallet->GetAddressReceiveRequests();
|
||||
auto erequests = {"val_rr11"};
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(requests.begin(), requests.end(), std::begin(erequests), std::end(erequests));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Test some watch-only LegacyScriptPubKeyMan methods by the procedure of loading (LoadWatchOnly),
|
||||
@@ -922,6 +966,7 @@ private:
|
||||
bool WriteKey(DataStream&& key, DataStream&& value, bool overwrite = true) override { return m_pass; }
|
||||
bool EraseKey(DataStream&& key) override { return m_pass; }
|
||||
bool HasKey(DataStream&& key) override { return m_pass; }
|
||||
bool ErasePrefix(Span<const std::byte> prefix) override { return m_pass; }
|
||||
|
||||
public:
|
||||
explicit FailBatch(bool pass) : m_pass(pass) {}
|
||||
|
||||
Reference in new issue
Block a user