aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Maxwell <greg@xiph.org>2013-10-28 08:34:42 -0700
committerGregory Maxwell <greg@xiph.org>2013-10-28 08:34:42 -0700
commit377cd749308d43bc718cac806a3f8a1710652b0e (patch)
tree1f4585e24c7331b6bd7010eb1bf536fae7d812f5
parent7ae454084ba395c9957c008a66360d3cbfd139a1 (diff)
parent170e02deaf2bb1f8f79ffafbb4ff7f62cb933c62 (diff)
Merge pull request #3163 from sipa/allunspendable
Generalize the remove-outputs check for fully-prunable transactions.
-rw-r--r--src/core.h3
-rw-r--r--src/main.cpp12
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);