Following up from #28280 (review), which suggested a revival of #18746.
GetCoin
will never return true
for a spent entry, so we can safely assume that any entry we fetch will not be spent. This lets us remove the only non-test code path which adds a FRESH-but-not-DIRTY entry to the flagged linked list. This in turn ensures all entries being sent to BatchWrite
are DIRTY
entries.
A corollary is that all spent coins must be DIRTY. The only time a coin can be spent and not DIRTY is when the CCoinsViewCacheEntry
is created with an empty coin. The last commit makes this more clear by checking for freshness if inserted instead of if spent and not DIRTY.
This is a pure refactor removing dead code which handles a non-existent corner case of a FRESH-but-not-DIRTY entry in the CCoinsViewCache
or a spent entry in CCoinsViewDB
. There is a lot of test code which tries to exercise this corner case, which is also updated in this PR to behave like non-test code.