|
|
@ -2026,33 +2026,14 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
|
|
|
|
// Do not allow blocks that contain transactions which 'overwrite' older transactions,
|
|
|
|
// unless those are already completely spent.
|
|
|
|
// If such overwrites are allowed, coinbases and transactions depending upon those
|
|
|
|
// can be duplicated to remove the ability to spend the first instance -- even after
|
|
|
|
// being sent to another address.
|
|
|
|
// See BIP30 and http://r6.ca/blog/20120206T005236Z.html for more information.
|
|
|
|
// This logic is not necessary for memory pool transactions, as AcceptToMemoryPool
|
|
|
|
// already refuses previously-known transaction ids entirely.
|
|
|
|
// This rule was originally applied to all blocks with a timestamp after March 15, 2012, 0:00 UTC.
|
|
|
|
// Now that the whole chain is irreversibly beyond that time it is applied to all blocks except the
|
|
|
|
// two in the chain that violate it. This prevents exploiting the issue against nodes during their
|
|
|
|
// initial block download.
|
|
|
|
bool fEnforceBIP30 = (!pindex->phashBlock) || // Enforce on CreateNewBlock invocations which don't have a hash.
|
|
|
|
!((pindex->nHeight==91842 && pindex->GetBlockHash() == uint256S("0x00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec")) || |
|
|
|
(pindex->nHeight==91880 && pindex->GetBlockHash() == uint256S("0x00000000000743f190a18c5577a3c2d2a1f610ae9601ac046a38084ccb7cd721"))); |
|
|
|
if (fEnforceBIP30) { |
|
|
|
BOOST_FOREACH(const CTransaction& tx, block.vtx) { |
|
|
|
const CCoins* coins = view.AccessCoins(tx.GetHash()); |
|
|
|
if (coins && !coins->IsPruned()) |
|
|
|
return state.DoS(100, error("ConnectBlock(): tried to overwrite transaction"), |
|
|
|
REJECT_INVALID, "bad-txns-BIP30"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// BIP16 didn't become active until Apr 1 2012
|
|
|
|
int64_t nBIP16SwitchTime = 1333238400; |
|
|
|
bool fStrictPayToScriptHash = (pindex->GetBlockTime() >= nBIP16SwitchTime); |
|
|
|
|
|
|
|
unsigned int flags = fStrictPayToScriptHash ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE; |
|
|
|
BOOST_FOREACH(const CTransaction& tx, block.vtx) { |
|
|
|
const CCoins* coins = view.AccessCoins(tx.GetHash()); |
|
|
|
if (coins && !coins->IsPruned()) |
|
|
|
return state.DoS(100, error("ConnectBlock(): tried to overwrite transaction"), |
|
|
|
REJECT_INVALID, "bad-txns-BIP30"); |
|
|
|
} |
|
|
|
|
|
|
|
unsigned int flags = SCRIPT_VERIFY_P2SH; |
|
|
|
|
|
|
|
// Start enforcing the DERSIG (BIP66) rules, for block.nVersion=3 blocks,
|
|
|
|
// when 75% of the network has upgraded:
|
|
|
@ -2114,16 +2095,13 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
return state.DoS(100, error("ConnectBlock(): pour requirements not met"), |
|
|
|
REJECT_INVALID, "bad-txns-pour-requirements-not-met"); |
|
|
|
|
|
|
|
if (fStrictPayToScriptHash) |
|
|
|
{ |
|
|
|
// Add in sigops done by pay-to-script-hash inputs;
|
|
|
|
// this is to prevent a "rogue miner" from creating
|
|
|
|
// an incredibly-expensive-to-validate block.
|
|
|
|
nSigOps += GetP2SHSigOpCount(tx, view); |
|
|
|
if (nSigOps > MAX_BLOCK_SIGOPS) |
|
|
|
return state.DoS(100, error("ConnectBlock(): too many sigops"), |
|
|
|
REJECT_INVALID, "bad-blk-sigops"); |
|
|
|
} |
|
|
|
// Add in sigops done by pay-to-script-hash inputs;
|
|
|
|
// this is to prevent a "rogue miner" from creating
|
|
|
|
// an incredibly-expensive-to-validate block.
|
|
|
|
nSigOps += GetP2SHSigOpCount(tx, view); |
|
|
|
if (nSigOps > MAX_BLOCK_SIGOPS) |
|
|
|
return state.DoS(100, error("ConnectBlock(): too many sigops"), |
|
|
|
REJECT_INVALID, "bad-blk-sigops"); |
|
|
|
|
|
|
|
nFees += view.GetValueIn(tx)-tx.GetValueOut(); |
|
|
|
|
|
|
|