aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2013-10-26 21:26:29 +0200
committerPieter Wuille <sipa@ulyssis.org>2013-10-28 15:00:43 +0100
commit170e02deaf2bb1f8f79ffafbb4ff7f62cb933c62 (patch)
tree1f4585e24c7331b6bd7010eb1bf536fae7d812f5 /src/main.cpp
parent7ae454084ba395c9957c008a66360d3cbfd139a1 (diff)
downloadbitcoin-170e02deaf2bb1f8f79ffafbb4ff7f62cb933c62.tar.xz
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.
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp12
1 files changed, 6 insertions, 6 deletions
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);