diff options
| author | Wladimir J. van der Laan <[email protected]> | 2014-02-20 12:31:01 +0100 |
|---|---|---|
| committer | Wladimir J. van der Laan <[email protected]> | 2014-02-20 12:32:32 +0100 |
| commit | 76a77059f361f3c700a550c11adf567bafebbd00 (patch) | |
| tree | a61c675c3cbfa8dc8fa31e1840697995e0c0356f /src/main.cpp | |
| parent | Merge pull request #3703 (diff) | |
| parent | Don't store or send side-chain blocks lower than last checkpoint. (diff) | |
| download | discoin-76a77059f361f3c700a550c11adf567bafebbd00.tar.xz discoin-76a77059f361f3c700a550c11adf567bafebbd00.zip | |
Merge pull request #2910
d8b4b49 Don't store or send side-chain blocks lower than last checkpoint. (Ashley Holman)
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/main.cpp b/src/main.cpp index 8e879c316..f46375aa9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2276,6 +2276,11 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CDiskBlockPos* dbp) return state.DoS(100, error("AcceptBlock() : rejected by checkpoint lock-in at %d", nHeight), REJECT_CHECKPOINT, "checkpoint mismatch"); + // Don't accept any forks from the main chain prior to last checkpoint + CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(mapBlockIndex); + if (pcheckpoint && nHeight < pcheckpoint->nHeight) + return state.DoS(100, error("AcceptBlock() : forked chain older than last checkpoint (height %d)", nHeight)); + // Reject block.nVersion=1 blocks when 95% (75% on testnet) of the network has upgraded: if (block.nVersion < 2) { @@ -3133,10 +3138,28 @@ void static ProcessGetData(CNode* pfrom) if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK) { - // Send block from disk + bool send = false; map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(inv.hash); if (mi != mapBlockIndex.end()) { + // If the requested block is at a height below our last + // checkpoint, only serve it if it's in the checkpointed chain + int nHeight = mi->second->nHeight; + CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(mapBlockIndex); + if (pcheckpoint && nHeight < pcheckpoint->nHeight) { + if (!chainActive.Contains(mi->second)) + { + LogPrintf("ProcessGetData(): ignoring request for old block that isn't in the main chain\n"); + } else { + send = true; + } + } else { + send = true; + } + } + if (send) + { + // Send block from disk CBlock block; ReadBlockFromDisk(block, (*mi).second); if (inv.type == MSG_BLOCK) |