aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 9a06dbf13e..51ada0a0bb 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2056,6 +2056,25 @@ bool CBlock::CheckBlock(CValidationState &state, bool fCheckPOW, bool fCheckMerk
if (vtx.empty() || vtx.size() > MAX_BLOCK_SIZE || ::GetSerializeSize(*this, SER_NETWORK, PROTOCOL_VERSION) > MAX_BLOCK_SIZE)
return state.DoS(100, error("CheckBlock() : size limits failed"));
+ // Special short-term limits to avoid 10,000 BDB lock limit:
+ if (GetBlockTime() > 1363039171 && // 11 March 2013, timestamp of block before the big fork
+ GetBlockTime() < 1368576000) // 15 May 2013 00:00:00
+ {
+ // Rule is: #unique txids referenced <= 4,500
+ // ... to prevent 10,000 BDB lock exhaustion on old clients
+ set<uint256> setTxIn;
+ for (size_t i = 0; i < vtx.size(); i++)
+ {
+ setTxIn.insert(vtx[i].GetHash());
+ if (i == 0) continue; // skip coinbase txin
+ BOOST_FOREACH(const CTxIn& txin, vtx[i].vin)
+ setTxIn.insert(txin.prevout.hash);
+ }
+ size_t nTxids = setTxIn.size();
+ if (nTxids > 4500)
+ return error("CheckBlock() : 15 May maxlocks violation");
+ }
+
// Check proof of work matches claimed amount
if (fCheckPOW && !CheckProofOfWork(GetHash(), nBits))
return state.DoS(50, error("CheckBlock() : proof of work failed"));