for (std::pair<const uint256, CWalletTx>& 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());
// Only increment witnesses that are behind the current height
if (nd->witnessHeight < pindex->nHeight) {
+ // Check the validity of the cache
+ // The only time a note witnessed above the current height
+ // would be invalid here is during a reindex when blocks
+ // have been decremented, and we are incrementing the blocks
+ // immediately after.
+ assert(nWitnessCacheSize >= nd->witnesses.size());
// Witnesses being incremented should always be either -1
// (never incremented or decremented) or one below pindex
assert((nd->witnessHeight == -1) ||
for (std::pair<const uint256, CWalletTx>& 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->witnessHeight < pindex->nHeight &&
nd->witnesses.size() > 0) {
+ // Check the validity of the cache
+ // See earlier comment about validity.
+ assert(nWitnessCacheSize >= nd->witnesses.size());
nd->witnesses.front().append(note_commitment);
}
}
CNoteData* nd = &(item.second);
if (nd->witnessHeight < pindex->nHeight) {
nd->witnessHeight = pindex->nHeight;
+ // Check the validity of the cache
+ // See earlier comment about validity.
+ assert(nWitnessCacheSize >= nd->witnesses.size());
}
- // Check the validity of the cache
- assert(nWitnessCacheSize >= nd->witnesses.size());
}
}
for (std::pair<const uint256, CWalletTx>& 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());
// Only increment witnesses that are not above the current height
if (nd->witnessHeight <= pindex->nHeight) {
+ // Check the validity of the cache
+ // See comment below (this would be invalid if there was a
+ // prior decrement).
+ assert(nWitnessCacheSize >= nd->witnesses.size());
// Witnesses being decremented should always be either -1
// (never incremented or decremented) or equal to pindex
assert((nd->witnessHeight == -1) ||
for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) {
CNoteData* nd = &(item.second);
// Check the validity of the cache
- assert(nWitnessCacheSize >= nd->witnesses.size());
+ // Technically if there are notes witnessed above the current
+ // height, their cache will now be invalid (relative to the new
+ // value of nWitnessCacheSize). However, this would only occur
+ // during a reindex, and by the time the reindex reaches the tip
+ // of the chain again, the existing witness caches will be valid
+ // again.
+ // We don't set nWitnessCacheSize to zero at the start of the
+ // reindex because the on-disk blocks had already resulted in a
+ // chain that didn't trigger the assertion below.
+ if (nd->witnessHeight < pindex->nHeight) {
+ assert(nWitnessCacheSize >= nd->witnesses.size());
+ }
}
}
// TODO: If nWitnessCache is zero, we need to regenerate the caches (#1302)