mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-02 09:15:04 +02:00
Merge #18192: Bugfix: Wallet: Safely deal with change in the address book
b5795a7886Wallet: Add warning comments and assert to CWallet::DelAddressBook (Luke Dashjr)6d2905f57aWallet: Avoid unnecessary/redundant m_address_book lookups (Luke Dashjr)c751d886f4Wallet: Avoid treating change-in-the-addressbook as non-change everywhere (Luke Dashjr)8e64b8c84bWallet: New FindAddressBookEntry method to filter out change entries (and skip ->second everywhere) (Luke Dashjr)65b6bdc2b1Wallet: Add CAddressBookData::IsChange which returns true iff label has never been set (Luke Dashjr)144b2f85daWallet: Require usage of new CAddressBookData::setLabel to change label (Luke Dashjr)b86cd155f6scripted-diff: Wallet: Rename mapAddressBook to m_address_book (Luke Dashjr) Pull request description: In many places, our code assumes that presence in the address book indicates a non-change key, and absence of an entry in mapAddressBook indicates change. This no longer holds true after #13756 (first released in 0.19) since it added a "used" DestData populated even for change addresses. Only avoid-reuse wallets should be affected by this issue. Thankfully, populating DestData does not write a label to the database, so we can retroactively fix this (so long as the user didn't see the change address and manually assign it a real label). Fixing it is accomplished by: * Adding a new bool to CAddressBookData to track if the label has ever been assigned, either by loading one from the database, or by assigning one at runtime. * `CAddressBookData::IsChange` and `CWallet::FindAddressBookEntry` are new methods to assist in excluding change from code that doesn't expect to see them. * For safety in merging, `CAddressBookData::name` has been made read-only (the actual data is stored in `m_label`, a new private member, and can be changed only with `setLabel` which updates the `m_change` flag), and `mapAddressBook` has been renamed to `m_address_book` (to force old code to be rebased to compile). A final commit also does some minor optimisation, avoiding redundant lookups in `m_address_book` when we already have a pointer to the `CAddressBookData`. ACKs for top commit: ryanofsky: Code review ACKb5795a7886. Pretty clever and nicely implemented fix! jonatack: ACKb5795a7886nice improvements -- code review, built/ran tests rebased on current masterff53433fe4and tested manually with rpc/cli jnewbery: Good fix. utACKb5795a788. Tree-SHA512: 40525185a0bcc1723f602243c269499ec86ecb298fecb5ef24d626bbdd5e3efece86cdb1084ad7eebf7eeaf251db4a6e056bcd25bc8457b417fcbb53d032ebf0
This commit is contained in:
@@ -55,7 +55,7 @@ struct AddressTableEntryLessThan
|
||||
static AddressTableEntry::Type translateTransactionType(const QString &strPurpose, bool isMine)
|
||||
{
|
||||
AddressTableEntry::Type addressType = AddressTableEntry::Hidden;
|
||||
// "refund" addresses aren't shown, and change addresses aren't in mapAddressBook at all.
|
||||
// "refund" addresses aren't shown, and change addresses aren't returned by getAddresses at all.
|
||||
if (strPurpose == "send")
|
||||
addressType = AddressTableEntry::Sending;
|
||||
else if (strPurpose == "receive")
|
||||
|
||||
@@ -97,7 +97,7 @@ void TestAddAddressesToSendBook(interfaces::Node& node)
|
||||
|
||||
auto check_addbook_size = [&wallet](int expected_size) {
|
||||
LOCK(wallet->cs_wallet);
|
||||
QCOMPARE(static_cast<int>(wallet->mapAddressBook.size()), expected_size);
|
||||
QCOMPARE(static_cast<int>(wallet->m_address_book.size()), expected_size);
|
||||
};
|
||||
|
||||
// We should start with the two addresses we added earlier and nothing else.
|
||||
|
||||
Reference in New Issue
Block a user