diff options
author | Gregory Maxwell <greg@xiph.org> | 2013-10-28 08:34:42 -0700 |
---|---|---|
committer | Gregory Maxwell <greg@xiph.org> | 2013-10-28 08:34:42 -0700 |
commit | 377cd749308d43bc718cac806a3f8a1710652b0e (patch) | |
tree | 1f4585e24c7331b6bd7010eb1bf536fae7d812f5 /src | |
parent | 7ae454084ba395c9957c008a66360d3cbfd139a1 (diff) | |
parent | 170e02deaf2bb1f8f79ffafbb4ff7f62cb933c62 (diff) |
Merge pull request #3163 from sipa/allunspendable
Generalize the remove-outputs check for fully-prunable transactions.
Diffstat (limited to 'src')
-rw-r--r-- | src/core.h | 3 | ||||
-rw-r--r-- | src/main.cpp | 12 |
2 files changed, 9 insertions, 6 deletions
diff --git a/src/core.h b/src/core.h index 9ee8b2edce..70e62716f3 100644 --- a/src/core.h +++ b/src/core.h @@ -421,6 +421,9 @@ public: // equality test 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 && a.nHeight == b.nHeight && a.nVersion == b.nVersion && diff --git a/src/main.cpp b/src/main.cpp index 56bd7a5cfd..49fc7abbaf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1750,12 +1750,12 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex const CTransaction &tx = block.vtx[i]; uint256 hash = tx.GetHash(); - // check that all outputs are available - if (!view.HaveCoins(hash)) { - fClean = fClean && error("DisconnectBlock() : outputs still spent? database corrupted"); - view.SetCoins(hash, CCoins()); - } - CCoins &outs = view.GetCoins(hash); + // Check that all outputs are available and match the outputs in the block itself + // exactly. Note that transactions with only provably unspendable outputs won't + // have outputs available even in the block itself, so we handle that case + // specially with outsEmpty. + CCoins outsEmpty; + CCoins &outs = view.HaveCoins(hash) ? view.GetCoins(hash) : outsEmpty; outs.ClearUnspendable(); CCoins outsBlock = CCoins(tx, pindex->nHeight); |