Auto merge of #1580 - str4d:1378-repair-witness-cache, r=daira
Clear witness cache when re-witnessing notes Closes #1378
This commit is contained in:
@@ -734,6 +734,14 @@ TEST(wallet_tests, cached_witnesses_chain_tip) {
|
|||||||
wallet.GetNoteWitnesses(notes, witnesses, anchor4);
|
wallet.GetNoteWitnesses(notes, witnesses, anchor4);
|
||||||
EXPECT_TRUE((bool) witnesses[0]);
|
EXPECT_TRUE((bool) witnesses[0]);
|
||||||
EXPECT_EQ(anchor2, anchor4);
|
EXPECT_EQ(anchor2, anchor4);
|
||||||
|
|
||||||
|
// Incrementing with the same block again should not change the cache
|
||||||
|
uint256 anchor5;
|
||||||
|
wallet.IncrementNoteWitnesses(&index2, &block2, tree);
|
||||||
|
std::vector<boost::optional<ZCIncrementalWitness>> witnesses5;
|
||||||
|
wallet.GetNoteWitnesses(notes, witnesses5, anchor5);
|
||||||
|
EXPECT_EQ(witnesses, witnesses5);
|
||||||
|
EXPECT_EQ(anchor4, anchor5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -699,7 +699,23 @@ void CWallet::IncrementNoteWitnesses(const CBlockIndex* pindex,
|
|||||||
JSOutPoint jsoutpt {hash, i, j};
|
JSOutPoint jsoutpt {hash, i, j};
|
||||||
if (mapWallet[hash].mapNoteData.count(jsoutpt)) {
|
if (mapWallet[hash].mapNoteData.count(jsoutpt)) {
|
||||||
CNoteData* nd = &(mapWallet[hash].mapNoteData[jsoutpt]);
|
CNoteData* nd = &(mapWallet[hash].mapNoteData[jsoutpt]);
|
||||||
assert(nd->witnesses.size() == 0);
|
if (nd->witnesses.size() > 0) {
|
||||||
|
// We think this can happen because we write out the
|
||||||
|
// witness cache state after every block increment or
|
||||||
|
// decrement, but the block index itself is written in
|
||||||
|
// batches. So if the node crashes in between these two
|
||||||
|
// operations, it is possible for IncrementNoteWitnesses
|
||||||
|
// to be called again on previously-cached blocks. This
|
||||||
|
// doesn't affect existing cached notes because of the
|
||||||
|
// CNoteData::witnessHeight checks. See #1378 for details.
|
||||||
|
LogPrintf("Inconsistent witness cache state found for %s\n- Cache size: %d\n- Top (height %d): %s\n- New (height %d): %s\n",
|
||||||
|
jsoutpt.ToString(), nd->witnesses.size(),
|
||||||
|
nd->witnessHeight,
|
||||||
|
nd->witnesses.front().root().GetHex(),
|
||||||
|
pindex->nHeight,
|
||||||
|
tree.witness().root().GetHex());
|
||||||
|
nd->witnesses.clear();
|
||||||
|
}
|
||||||
nd->witnesses.push_front(tree.witness());
|
nd->witnesses.push_front(tree.witness());
|
||||||
// Set height to one less than pindex so it gets incremented
|
// Set height to one less than pindex so it gets incremented
|
||||||
nd->witnessHeight = pindex->nHeight - 1;
|
nd->witnessHeight = pindex->nHeight - 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user