From e95e5247384a893ddb54e963f1dcc9a4d35f14e1 Mon Sep 17 00:00:00 2001 From: Scott Nadal Date: Sat, 23 Jun 2012 16:23:44 +0100 Subject: [PATCH] PPCoin: Do not reject pending checkpoint with duplicate-stake check --- src/checkpoints.cpp | 6 ++++++ src/checkpoints.h | 1 + src/main.cpp | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index 78a0be7..26cc698 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -195,6 +195,12 @@ namespace Checkpoints return true; } + bool IsPendingSyncCheckpoint(uint256 hashBlock) + { + CRITICAL_BLOCK(cs_hashSyncCheckpoint) + return ((!checkpointMessagePending.IsNull()) && hashBlock == checkpointMessagePending.hashCheckpoint); + } + // ppcoin: automatic checkpoint (represented by height of checkpoint) int nAutoCheckpoint = 0; int nBranchPoint = 0; // branch point to alternative branch diff --git a/src/checkpoints.h b/src/checkpoints.h index caafb09..672e5fc 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -139,6 +139,7 @@ namespace Checkpoints bool AcceptPendingSyncCheckpoint(); uint256 AutoSelectSyncCheckpoint(); bool CheckSync(const uint256& hashBlock, const CBlockIndex* pindexPrev); + bool IsPendingSyncCheckpoint(uint256 hashBlock); // ppcoin: automatic checkpoint extern int nAutoCheckpoint; diff --git a/src/main.cpp b/src/main.cpp index e5234c8..c66b74c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1617,7 +1617,7 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) // ppcoin: check proof-of-stake // Limited duplicity on stake: prevents block flood attack // Duplicate stake allowed only when there is orphan child block - if (pblock->IsProofOfStake() && setStakeSeen.count(pblock->GetProofOfStake()) && !mapOrphanBlocksByPrev.count(hash)) + if (pblock->IsProofOfStake() && setStakeSeen.count(pblock->GetProofOfStake()) && !mapOrphanBlocksByPrev.count(hash) && !Checkpoints::IsPendingSyncCheckpoint(hash)) return error("ProcessBlock() : duplicate proof-of-stake (%s, %d) for block %s", pblock->GetProofOfStake().first.ToString().c_str(), pblock->GetProofOfStake().second, hash.ToString().c_str()); // Preliminary checks @@ -1664,7 +1664,7 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) { // Limited duplicity on stake: prevents block flood attack // Duplicate stake allowed only when there is orphan child block - if (setStakeSeenOrphan.count(pblock2->GetProofOfStake()) && !mapOrphanBlocksByPrev.count(hash)) + if (setStakeSeenOrphan.count(pblock2->GetProofOfStake()) && !mapOrphanBlocksByPrev.count(hash) && !Checkpoints::IsPendingSyncCheckpoint(hash)) return error("ProcessBlock() : duplicate proof-of-stake (%s, %d) for orphan block %s", pblock2->GetProofOfStake().first.ToString().c_str(), pblock2->GetProofOfStake().second, hash.ToString().c_str()); else setStakeSeenOrphan.insert(pblock2->GetProofOfStake()); -- 1.7.1