diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2013-03-15 13:10:34 -0400 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2013-03-17 21:52:47 -0400 |
commit | 8c222dca4f961ad13ec64d690134a40d09b20813 (patch) | |
tree | b079ced3c000ecf0ad453febf18642f989e829ad /src/main.cpp | |
parent | 1a9ee5da327d8079a297ad292a1c16745b75df91 (diff) |
CheckBlock rule until 15-May for 10,000 BDB lock compatibility
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 19 |
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")); |