diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 8a80f2db6..7723c034f 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -654,6 +654,9 @@ void CWallet::IncrementNoteWitnesses(const CBlockIndex* pindex, } } } + if (nWitnessCacheSize < WITNESS_CACHE_SIZE) { + nWitnessCacheSize += 1; + } const CBlock* pblock {pblockIn}; CBlock block; @@ -675,6 +678,8 @@ void CWallet::IncrementNoteWitnesses(const CBlockIndex* pindex, for (std::pair& wtxItem : mapWallet) { for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) { CNoteData* nd = &(item.second); + // Check the validity of the cache + assert(nWitnessCacheSize >= nd->witnesses.size()); if (nd->witnesses.size() > 0) { nd->witnesses.front().append(note_commitment); } @@ -685,15 +690,22 @@ void CWallet::IncrementNoteWitnesses(const CBlockIndex* pindex, if (txIsOurs) { JSOutPoint jsoutpt {hash, i, j}; if (mapWallet[hash].mapNoteData.count(jsoutpt)) { - mapWallet[hash].mapNoteData[jsoutpt].witnesses.push_front( - tree.witness()); + CNoteData* nd = &(mapWallet[hash].mapNoteData[jsoutpt]); + assert(nd->witnesses.size() == 0); + nd->witnesses.push_front(tree.witness()); + // Check the validity of the cache + assert(nWitnessCacheSize >= nd->witnesses.size()); } } } } } - if (nWitnessCacheSize < WITNESS_CACHE_SIZE) { - nWitnessCacheSize += 1; + for (std::pair& wtxItem : mapWallet) { + for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) { + CNoteData* nd = &(item.second); + // Check the validity of the cache + assert(nWitnessCacheSize >= nd->witnesses.size()); + } } if (fFileBacked) { CWalletDB walletdb(strWalletFile); @@ -709,12 +721,21 @@ void CWallet::DecrementNoteWitnesses() for (std::pair& wtxItem : mapWallet) { for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) { CNoteData* nd = &(item.second); + // Check the validity of the cache + assert(nWitnessCacheSize >= nd->witnesses.size()); if (nd->witnesses.size() > 0) { nd->witnesses.pop_front(); } } } nWitnessCacheSize -= 1; + for (std::pair& wtxItem : mapWallet) { + for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) { + CNoteData* nd = &(item.second); + // Check the validity of the cache + assert(nWitnessCacheSize >= nd->witnesses.size()); + } + } // TODO: If nWitnessCache is zero, we need to regenerate the caches (#1302) assert(nWitnessCacheSize > 0); if (fFileBacked) {