mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 23:18:14 +01:00
[wallet] Kill accounts
This commit does the following changes:
- [wallet] Remove 'account' argument from GetLegacyBalance()
- GetLegacyBalance() is never called with an account argument.
Remove the argument and helper functions.
- [wallet] Remove CWallet::ListAccountCreditDebit()
- Function no longer used.
- [wallet] Remove AccountMove()
- Function no longer used.
- [wallet] Remove AddAccountingEntry()
- Function no longer used.
- [wallet] Remove GetAccountCreditDebit()
- Function no longer used.
- [wallet] Don't rewrite accounting entries when reordering wallet transactions.
- Accounting entries are deprecated. Don't rewrite them to the wallet
database when re-ordering transactions.
- [wallet] Remove WriteAccountingEntry()
- Function no longer used.
- [wallet] Don't read acentry key-values from wallet on load.
- [wallet] Remove ListAccountCreditDebit()
- Function no longer used.
- [wallet] Remove CAccountingEntry class
- No longer used
- [wallet] Remove GetLabelDestination
- Function no longer used.
- [wallet] Delete unused account functions
- ReadAccount
- WriteAccount
- EraseAccount
- DeleteLabel
- [wallet] Remove fromAccount argument from CommitTransaction()
- [wallet] Remove strFromAccount.
- No longer used.
- [wallet] Remove strSentAccount from GetAmounts().
- No longer used.
- [wallet] Update zapwallettxes comment to remove accounts.
- [wallet] Remove CAccount
- No longer used
- [docs] fix typo in release notes for PR 14023
This commit is contained in:
committed by
Wladimir J. van der Laan
parent
f180e81d57
commit
c9c32e6b84
@@ -585,7 +585,6 @@ void CWallet::SyncMetaData(std::pair<TxSpends::iterator, TxSpends::iterator> ran
|
||||
// nTimeReceived not copied on purpose
|
||||
copyTo->nTimeSmart = copyFrom->nTimeSmart;
|
||||
copyTo->fFromMe = copyFrom->fFromMe;
|
||||
copyTo->strFromAccount = copyFrom->strFromAccount;
|
||||
// nOrderPos not copied on purpose
|
||||
// cached members not copied on purpose
|
||||
}
|
||||
@@ -735,44 +734,30 @@ DBErrors CWallet::ReorderTransactions()
|
||||
// Old wallets didn't have any defined order for transactions
|
||||
// Probably a bad idea to change the output of this
|
||||
|
||||
// First: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap.
|
||||
typedef std::pair<CWalletTx*, CAccountingEntry*> TxPair;
|
||||
typedef std::multimap<int64_t, TxPair > TxItems;
|
||||
// First: get all CWalletTx into a sorted-by-time multimap.
|
||||
typedef std::multimap<int64_t, CWalletTx*> TxItems;
|
||||
TxItems txByTime;
|
||||
|
||||
for (auto& entry : mapWallet)
|
||||
{
|
||||
CWalletTx* wtx = &entry.second;
|
||||
txByTime.insert(std::make_pair(wtx->nTimeReceived, TxPair(wtx, nullptr)));
|
||||
}
|
||||
std::list<CAccountingEntry> acentries;
|
||||
batch.ListAccountCreditDebit("", acentries);
|
||||
for (CAccountingEntry& entry : acentries)
|
||||
{
|
||||
txByTime.insert(std::make_pair(entry.nTime, TxPair(nullptr, &entry)));
|
||||
txByTime.insert(std::make_pair(wtx->nTimeReceived, wtx));
|
||||
}
|
||||
|
||||
nOrderPosNext = 0;
|
||||
std::vector<int64_t> nOrderPosOffsets;
|
||||
for (TxItems::iterator it = txByTime.begin(); it != txByTime.end(); ++it)
|
||||
{
|
||||
CWalletTx *const pwtx = (*it).second.first;
|
||||
CAccountingEntry *const pacentry = (*it).second.second;
|
||||
int64_t& nOrderPos = (pwtx != nullptr) ? pwtx->nOrderPos : pacentry->nOrderPos;
|
||||
CWalletTx *const pwtx = (*it).second;
|
||||
int64_t& nOrderPos = pwtx->nOrderPos;
|
||||
|
||||
if (nOrderPos == -1)
|
||||
{
|
||||
nOrderPos = nOrderPosNext++;
|
||||
nOrderPosOffsets.push_back(nOrderPos);
|
||||
|
||||
if (pwtx)
|
||||
{
|
||||
if (!batch.WriteTx(*pwtx))
|
||||
return DBErrors::LOAD_FAIL;
|
||||
}
|
||||
else
|
||||
if (!batch.WriteAccountingEntry(pacentry->nEntryNo, *pacentry))
|
||||
return DBErrors::LOAD_FAIL;
|
||||
if (!batch.WriteTx(*pwtx))
|
||||
return DBErrors::LOAD_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -789,14 +774,8 @@ DBErrors CWallet::ReorderTransactions()
|
||||
continue;
|
||||
|
||||
// Since we're changing the order, write it back
|
||||
if (pwtx)
|
||||
{
|
||||
if (!batch.WriteTx(*pwtx))
|
||||
return DBErrors::LOAD_FAIL;
|
||||
}
|
||||
else
|
||||
if (!batch.WriteAccountingEntry(pacentry->nEntryNo, *pacentry))
|
||||
return DBErrors::LOAD_FAIL;
|
||||
if (!batch.WriteTx(*pwtx))
|
||||
return DBErrors::LOAD_FAIL;
|
||||
}
|
||||
}
|
||||
batch.WriteOrderPosNext(nOrderPosNext);
|
||||
@@ -816,80 +795,6 @@ int64_t CWallet::IncOrderPosNext(WalletBatch *batch)
|
||||
return nRet;
|
||||
}
|
||||
|
||||
bool CWallet::AccountMove(std::string strFrom, std::string strTo, CAmount nAmount, std::string strComment)
|
||||
{
|
||||
WalletBatch batch(*database);
|
||||
if (!batch.TxnBegin())
|
||||
return false;
|
||||
|
||||
int64_t nNow = GetAdjustedTime();
|
||||
|
||||
// Debit
|
||||
CAccountingEntry debit;
|
||||
debit.nOrderPos = IncOrderPosNext(&batch);
|
||||
debit.strAccount = strFrom;
|
||||
debit.nCreditDebit = -nAmount;
|
||||
debit.nTime = nNow;
|
||||
debit.strOtherAccount = strTo;
|
||||
debit.strComment = strComment;
|
||||
AddAccountingEntry(debit, &batch);
|
||||
|
||||
// Credit
|
||||
CAccountingEntry credit;
|
||||
credit.nOrderPos = IncOrderPosNext(&batch);
|
||||
credit.strAccount = strTo;
|
||||
credit.nCreditDebit = nAmount;
|
||||
credit.nTime = nNow;
|
||||
credit.strOtherAccount = strFrom;
|
||||
credit.strComment = strComment;
|
||||
AddAccountingEntry(credit, &batch);
|
||||
|
||||
if (!batch.TxnCommit())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CWallet::GetLabelDestination(CTxDestination &dest, const std::string& label, bool bForceNew)
|
||||
{
|
||||
WalletBatch batch(*database);
|
||||
|
||||
CAccount account;
|
||||
batch.ReadAccount(label, account);
|
||||
|
||||
if (!bForceNew) {
|
||||
if (!account.vchPubKey.IsValid())
|
||||
bForceNew = true;
|
||||
else {
|
||||
// Check if the current key has been used (TODO: check other addresses with the same key)
|
||||
CScript scriptPubKey = GetScriptForDestination(GetDestinationForKey(account.vchPubKey, m_default_address_type));
|
||||
for (std::map<uint256, CWalletTx>::iterator it = mapWallet.begin();
|
||||
it != mapWallet.end() && account.vchPubKey.IsValid();
|
||||
++it)
|
||||
for (const CTxOut& txout : (*it).second.tx->vout)
|
||||
if (txout.scriptPubKey == scriptPubKey) {
|
||||
bForceNew = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Generate a new key
|
||||
if (bForceNew) {
|
||||
if (!GetKeyFromPool(account.vchPubKey, false))
|
||||
return false;
|
||||
|
||||
LearnRelatedScripts(account.vchPubKey, m_default_address_type);
|
||||
dest = GetDestinationForKey(account.vchPubKey, m_default_address_type);
|
||||
SetAddressBook(dest, label, "receive");
|
||||
batch.WriteAccount(label, account);
|
||||
} else {
|
||||
dest = GetDestinationForKey(account.vchPubKey, m_default_address_type);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CWallet::MarkDirty()
|
||||
{
|
||||
{
|
||||
@@ -944,7 +849,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFlushOnClose)
|
||||
if (fInsertedNew) {
|
||||
wtx.nTimeReceived = GetAdjustedTime();
|
||||
wtx.nOrderPos = IncOrderPosNext(&batch);
|
||||
wtx.m_it_wtxOrdered = wtxOrdered.insert(std::make_pair(wtx.nOrderPos, TxPair(&wtx, nullptr)));
|
||||
wtx.m_it_wtxOrdered = wtxOrdered.insert(std::make_pair(wtx.nOrderPos, &wtx));
|
||||
wtx.nTimeSmart = ComputeTimeSmart(wtx);
|
||||
AddToSpends(hash);
|
||||
}
|
||||
@@ -1019,7 +924,7 @@ void CWallet::LoadToWallet(const CWalletTx& wtxIn)
|
||||
CWalletTx& wtx = ins.first->second;
|
||||
wtx.BindWallet(this);
|
||||
if (/* insertion took place */ ins.second) {
|
||||
wtx.m_it_wtxOrdered = wtxOrdered.insert(std::make_pair(wtx.nOrderPos, TxPair(&wtx, nullptr)));
|
||||
wtx.m_it_wtxOrdered = wtxOrdered.insert(std::make_pair(wtx.nOrderPos, &wtx));
|
||||
}
|
||||
AddToSpends(hash);
|
||||
for (const CTxIn& txin : wtx.tx->vin) {
|
||||
@@ -1615,12 +1520,11 @@ int CalculateMaximumSignedInputSize(const CTxOut& txout, const CWallet* wallet,
|
||||
}
|
||||
|
||||
void CWalletTx::GetAmounts(std::list<COutputEntry>& listReceived,
|
||||
std::list<COutputEntry>& listSent, CAmount& nFee, std::string& strSentAccount, const isminefilter& filter) const
|
||||
std::list<COutputEntry>& listSent, CAmount& nFee, const isminefilter& filter) const
|
||||
{
|
||||
nFee = 0;
|
||||
listReceived.clear();
|
||||
listSent.clear();
|
||||
strSentAccount = strFromAccount;
|
||||
|
||||
// Compute fee:
|
||||
CAmount nDebit = GetDebit(filter);
|
||||
@@ -2189,7 +2093,7 @@ CAmount CWallet::GetImmatureWatchOnlyBalance() const
|
||||
// wallet, and then subtracts the values of TxIns spending from the wallet. This
|
||||
// also has fewer restrictions on which unconfirmed transactions are considered
|
||||
// trusted.
|
||||
CAmount CWallet::GetLegacyBalance(const isminefilter& filter, int minDepth, const std::string* account) const
|
||||
CAmount CWallet::GetLegacyBalance(const isminefilter& filter, int minDepth) const
|
||||
{
|
||||
LOCK2(cs_main, cs_wallet);
|
||||
|
||||
@@ -2208,21 +2112,17 @@ CAmount CWallet::GetLegacyBalance(const isminefilter& filter, int minDepth, cons
|
||||
for (const CTxOut& out : wtx.tx->vout) {
|
||||
if (outgoing && IsChange(out)) {
|
||||
debit -= out.nValue;
|
||||
} else if (IsMine(out) & filter && depth >= minDepth && (!account || *account == GetLabelName(out.scriptPubKey))) {
|
||||
} else if (IsMine(out) & filter && depth >= minDepth) {
|
||||
balance += out.nValue;
|
||||
}
|
||||
}
|
||||
|
||||
// For outgoing txs, subtract amount debited.
|
||||
if (outgoing && (!account || *account == wtx.strFromAccount)) {
|
||||
if (outgoing) {
|
||||
balance -= debit;
|
||||
}
|
||||
}
|
||||
|
||||
if (account) {
|
||||
balance += WalletBatch(*database).GetAccountCreditDebit(*account);
|
||||
}
|
||||
|
||||
return balance;
|
||||
}
|
||||
|
||||
@@ -3054,7 +2954,7 @@ bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CTransac
|
||||
/**
|
||||
* Call after CreateTransaction unless you want to abort
|
||||
*/
|
||||
bool CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::vector<std::pair<std::string, std::string>> orderForm, std::string fromAccount, CReserveKey& reservekey, CConnman* connman, CValidationState& state)
|
||||
bool CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::vector<std::pair<std::string, std::string>> orderForm, CReserveKey& reservekey, CConnman* connman, CValidationState& state)
|
||||
{
|
||||
{
|
||||
LOCK2(cs_main, cs_wallet);
|
||||
@@ -3062,7 +2962,6 @@ bool CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::ve
|
||||
CWalletTx wtxNew(this, std::move(tx));
|
||||
wtxNew.mapValue = std::move(mapValue);
|
||||
wtxNew.vOrderForm = std::move(orderForm);
|
||||
wtxNew.strFromAccount = std::move(fromAccount);
|
||||
wtxNew.fTimeReceivedIsTxTime = true;
|
||||
wtxNew.fFromMe = true;
|
||||
|
||||
@@ -3102,31 +3001,6 @@ bool CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::ve
|
||||
return true;
|
||||
}
|
||||
|
||||
void CWallet::ListAccountCreditDebit(const std::string& strAccount, std::list<CAccountingEntry>& entries) {
|
||||
WalletBatch batch(*database);
|
||||
return batch.ListAccountCreditDebit(strAccount, entries);
|
||||
}
|
||||
|
||||
bool CWallet::AddAccountingEntry(const CAccountingEntry& acentry)
|
||||
{
|
||||
WalletBatch batch(*database);
|
||||
|
||||
return AddAccountingEntry(acentry, &batch);
|
||||
}
|
||||
|
||||
bool CWallet::AddAccountingEntry(const CAccountingEntry& acentry, WalletBatch *batch)
|
||||
{
|
||||
if (!batch->WriteAccountingEntry(++nAccountingEntryNumber, acentry)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
laccentries.push_back(acentry);
|
||||
CAccountingEntry & entry = laccentries.back();
|
||||
wtxOrdered.insert(std::make_pair(entry.nOrderPos, TxPair(nullptr, &entry)));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
DBErrors CWallet::LoadWallet(bool& fFirstRunRet)
|
||||
{
|
||||
LOCK2(cs_main, cs_wallet);
|
||||
@@ -3660,12 +3534,6 @@ std::set<CTxDestination> CWallet::GetLabelAddresses(const std::string& label) co
|
||||
return result;
|
||||
}
|
||||
|
||||
void CWallet::DeleteLabel(const std::string& label)
|
||||
{
|
||||
WalletBatch batch(*database);
|
||||
batch.EraseAccount(label);
|
||||
}
|
||||
|
||||
bool CReserveKey::GetReservedKey(CPubKey& pubkey, bool internal)
|
||||
{
|
||||
if (nIndex == -1)
|
||||
@@ -3856,19 +3724,14 @@ unsigned int CWallet::ComputeTimeSmart(const CWalletTx& wtx) const
|
||||
int64_t latestTolerated = latestNow + 300;
|
||||
const TxItems& txOrdered = wtxOrdered;
|
||||
for (auto it = txOrdered.rbegin(); it != txOrdered.rend(); ++it) {
|
||||
CWalletTx* const pwtx = it->second.first;
|
||||
CWalletTx* const pwtx = it->second;
|
||||
if (pwtx == &wtx) {
|
||||
continue;
|
||||
}
|
||||
CAccountingEntry* const pacentry = it->second.second;
|
||||
int64_t nSmartTime;
|
||||
if (pwtx) {
|
||||
nSmartTime = pwtx->nTimeSmart;
|
||||
if (!nSmartTime) {
|
||||
nSmartTime = pwtx->nTimeReceived;
|
||||
}
|
||||
} else {
|
||||
nSmartTime = pacentry->nTime;
|
||||
nSmartTime = pwtx->nTimeSmart;
|
||||
if (!nSmartTime) {
|
||||
nSmartTime = pwtx->nTimeReceived;
|
||||
}
|
||||
if (nSmartTime <= latestTolerated) {
|
||||
latestEntry = nSmartTime;
|
||||
@@ -4313,7 +4176,6 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(const std::string& name,
|
||||
copyTo->nTimeReceived = copyFrom->nTimeReceived;
|
||||
copyTo->nTimeSmart = copyFrom->nTimeSmart;
|
||||
copyTo->fFromMe = copyFrom->fFromMe;
|
||||
copyTo->strFromAccount = copyFrom->strFromAccount;
|
||||
copyTo->nOrderPos = copyFrom->nOrderPos;
|
||||
batch.WriteTx(*copyTo);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user