Browse Source

[Wallet] sort pending wallet transactions before reaccepting

During startup, when adding pending wallet transactions, which spend outputs of
other pending wallet transactions, back to the memory pool, and when they are
added out of order, it appears as if they are orphans with missing inputs.

Those transactions are then rejected and flagged as "conflicting" (= not in the
memory pool, not in the block chain).

To prevent this, transactions are explicitly sorted.
0.13
dexX7 10 years ago committed by dexX7
parent
commit
e9c3215b77
No known key found for this signature in database
GPG Key ID: 7675E31CF5719832
  1. 19
      src/wallet/wallet.cpp

19
src/wallet/wallet.cpp

@ -1028,6 +1028,9 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
void CWallet::ReacceptWalletTransactions() void CWallet::ReacceptWalletTransactions()
{ {
LOCK2(cs_main, cs_wallet); LOCK2(cs_main, cs_wallet);
std::map<int64_t, CWalletTx*> mapSorted;
// Sort pending wallet transactions based on their initial wallet insertion order
BOOST_FOREACH(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet) BOOST_FOREACH(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet)
{ {
const uint256& wtxid = item.first; const uint256& wtxid = item.first;
@ -1036,13 +1039,19 @@ void CWallet::ReacceptWalletTransactions()
int nDepth = wtx.GetDepthInMainChain(); int nDepth = wtx.GetDepthInMainChain();
if (!wtx.IsCoinBase() && nDepth < 0) if (!wtx.IsCoinBase() && nDepth < 0) {
{ mapSorted.insert(std::make_pair(wtx.nOrderPos, &wtx));
// Try to add to memory pool
LOCK(mempool.cs);
wtx.AcceptToMemoryPool(false);
} }
} }
// Try to add wallet transactions to memory pool
BOOST_FOREACH(PAIRTYPE(const int64_t, CWalletTx*)& item, mapSorted)
{
CWalletTx& wtx = *(item.second);
LOCK(mempool.cs);
wtx.AcceptToMemoryPool(false);
}
} }
void CWalletTx::RelayWalletTransaction() void CWalletTx::RelayWalletTransaction()

Loading…
Cancel
Save