aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2017-06-28 11:23:11 -0700
committerPieter Wuille <pieter.wuille@gmail.com>2017-06-28 11:44:22 -0700
commit90a002ea647dcea57a2ed4294eab77897168ba1d (patch)
tree77a518a5dbbe4c4f53203a11cdb3538a68ab7b6e
parent30c21306c17165c3925fea4ac9d1a4763c6d2a99 (diff)
parent21d4afa12fbf1e7f59b629060c9e10db213fe07a (diff)
Merge #10558: Address nits from per-utxo change
21d4afa12 Comment clarifications in coins.cpp (Alex Morcos) 3c8a9aeff Add belt-and-suspenders in DisconnectBlock (Alex Morcos) Tree-SHA512: d83e12ed71674faaaaebc03ffa1e2276984c35a29db419268ac9e14a45b33ccab716e3606dff8cfe1dcee4bec6e4794d2ca90341f10d5684be80e3fee61addf8
-rw-r--r--src/coins.h3
-rw-r--r--src/validation.cpp3
2 files changed, 5 insertions, 1 deletions
diff --git a/src/coins.h b/src/coins.h
index ff7719b724..efb5ce869c 100644
--- a/src/coins.h
+++ b/src/coins.h
@@ -306,6 +306,9 @@ private:
void AddCoins(CCoinsViewCache& cache, const CTransaction& tx, int nHeight, bool check = false);
//! Utility function to find any unspent output with a given txid.
+// This function can be quite expensive because in the event of a transaction
+// which is not found in the cache, it can cause up to MAX_OUTPUTS_PER_BLOCK
+// lookups to database, so it should be used with care.
const Coin& AccessByTxid(const CCoinsViewCache& cache, const uint256& txid);
#endif // BITCOIN_COINS_H
diff --git a/src/validation.cpp b/src/validation.cpp
index 216ba3d4a5..0fe7f775af 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -1366,6 +1366,7 @@ static DisconnectResult DisconnectBlock(const CBlock& block, const CBlockIndex*
for (int i = block.vtx.size() - 1; i >= 0; i--) {
const CTransaction &tx = *(block.vtx[i]);
uint256 hash = tx.GetHash();
+ bool is_coinbase = tx.IsCoinBase();
// Check that all outputs are available and match the outputs in the block itself
// exactly.
@@ -1374,7 +1375,7 @@ static DisconnectResult DisconnectBlock(const CBlock& block, const CBlockIndex*
COutPoint out(hash, o);
Coin coin;
bool is_spent = view.SpendCoin(out, &coin);
- if (!is_spent || tx.vout[o] != coin.out) {
+ if (!is_spent || tx.vout[o] != coin.out || pindex->nHeight != coin.nHeight || is_coinbase != coin.fCoinBase) {
fClean = false; // transaction output mismatch
}
}