Browse Source

Generalize the remove-outputs check for fully-prunable transactions.

Instead of explicitly testing for the presence of any output, and
dealing with this case specially, just interpret it as an empty
CCoins.

The case previously caught using the HaveCoins check, is now handled
by the generic outs != outsBlock test.
0.10
Pieter Wuille 11 years ago committed by Pieter Wuille
parent
commit
170e02deaf
  1. 3
      src/core.h
  2. 12
      src/main.cpp

3
src/core.h

@ -421,6 +421,9 @@ public:
// equality test // equality test
friend bool operator==(const CCoins &a, const CCoins &b) { friend bool operator==(const CCoins &a, const CCoins &b) {
// Empty CCoins objects are always equal.
if (a.IsPruned() && b.IsPruned())
return true;
return a.fCoinBase == b.fCoinBase && return a.fCoinBase == b.fCoinBase &&
a.nHeight == b.nHeight && a.nHeight == b.nHeight &&
a.nVersion == b.nVersion && a.nVersion == b.nVersion &&

12
src/main.cpp

@ -1750,12 +1750,12 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex
const CTransaction &tx = block.vtx[i]; const CTransaction &tx = block.vtx[i];
uint256 hash = tx.GetHash(); uint256 hash = tx.GetHash();
// check that all outputs are available // Check that all outputs are available and match the outputs in the block itself
if (!view.HaveCoins(hash)) { // exactly. Note that transactions with only provably unspendable outputs won't
fClean = fClean && error("DisconnectBlock() : outputs still spent? database corrupted"); // have outputs available even in the block itself, so we handle that case
view.SetCoins(hash, CCoins()); // specially with outsEmpty.
} CCoins outsEmpty;
CCoins &outs = view.GetCoins(hash); CCoins &outs = view.HaveCoins(hash) ? view.GetCoins(hash) : outsEmpty;
outs.ClearUnspendable(); outs.ClearUnspendable();
CCoins outsBlock = CCoins(tx, pindex->nHeight); CCoins outsBlock = CCoins(tx, pindex->nHeight);

Loading…
Cancel
Save