aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/coins.cpp10
-rw-r--r--src/coins.h2
-rw-r--r--src/main.cpp12
3 files changed, 11 insertions, 13 deletions
diff --git a/src/coins.cpp b/src/coins.cpp
index 4d1dbdea4e..877fb8b26c 100644
--- a/src/coins.cpp
+++ b/src/coins.cpp
@@ -117,11 +117,17 @@ CCoinsModifier CCoinsViewCache::ModifyCoins(const uint256 &txid) {
return CCoinsModifier(*this, ret.first, cachedCoinUsage);
}
-CCoinsModifier CCoinsViewCache::ModifyNewCoins(const uint256 &txid) {
+// ModifyNewCoins has to know whether the new outputs its creating are for a
+// coinbase or not. If they are for a coinbase, it can not mark them as fresh.
+// This is to ensure that the historical duplicate coinbases before BIP30 was
+// in effect will still be properly overwritten when spent.
+CCoinsModifier CCoinsViewCache::ModifyNewCoins(const uint256 &txid, bool coinbase) {
assert(!hasModifier);
std::pair<CCoinsMap::iterator, bool> ret = cacheCoins.insert(std::make_pair(txid, CCoinsCacheEntry()));
ret.first->second.coins.Clear();
- ret.first->second.flags = CCoinsCacheEntry::FRESH;
+ if (!coinbase) {
+ ret.first->second.flags = CCoinsCacheEntry::FRESH;
+ }
ret.first->second.flags |= CCoinsCacheEntry::DIRTY;
return CCoinsModifier(*this, ret.first, 0);
}
diff --git a/src/coins.h b/src/coins.h
index eab94ec1b4..d297cae1aa 100644
--- a/src/coins.h
+++ b/src/coins.h
@@ -435,7 +435,7 @@ public:
* would not properly overwrite the first coinbase of the pair. Simultaneous modifications
* are not allowed.
*/
- CCoinsModifier ModifyNewCoins(const uint256 &txid);
+ CCoinsModifier ModifyNewCoins(const uint256 &txid, bool coinbase);
/**
* Push the modifications applied to this cache to its base.
diff --git a/src/main.cpp b/src/main.cpp
index 8522b0d1ba..c8ea62758b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1546,17 +1546,9 @@ void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCach
undo.nVersion = coins->nVersion;
}
}
- // add outputs
- inputs.ModifyNewCoins(tx.GetHash())->FromTx(tx, nHeight);
- }
- else {
- // add outputs for coinbase tx
- // In this case call the full ModifyCoins which will do a database
- // lookup to be sure the coins do not already exist otherwise we do not
- // know whether to mark them fresh or not. We want the duplicate coinbases
- // before BIP30 to still be properly overwritten.
- inputs.ModifyCoins(tx.GetHash())->FromTx(tx, nHeight);
}
+ // add outputs
+ inputs.ModifyNewCoins(tx.GetHash(), tx.IsCoinBase())->FromTx(tx, nHeight);
}
void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, int nHeight)