PPCoin: Allow limited duplicate stakes under block flood attack
authorScott Nadal <scott.nadal@gmail.com>
Fri, 18 May 2012 14:56:30 +0000 (15:56 +0100)
committerScott Nadal <scott.nadal@gmail.com>
Fri, 18 May 2012 14:56:30 +0000 (15:56 +0100)
src/main.cpp

index 3bc0983..3377465 100644 (file)
@@ -1609,7 +1609,9 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock)
         return error("ProcessBlock() : already have block (orphan) %s", hash.ToString().substr(0,20).c_str());
 
     // ppcoin: check proof-of-stake
-    if (pblock->IsProofOfStake() && setStakeSeen.count(pblock->GetProofOfStake()))
+    // 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))
         return error("ProcessBlock() : duplicate proof-of-stake (%s) for block %s", pblock->GetProofOfStake().ToString().c_str(), hash.ToString().c_str());
 
     // Preliminary checks
@@ -1646,7 +1648,9 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock)
         // ppcoin: check proof-of-stake
         if (pblock2->IsProofOfStake())
         {
-            if (setStakeSeenOrphan.count(pblock2->GetProofOfStake()))
+            // 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))
                 return error("ProcessBlock() : duplicate proof-of-stake (%s) for orphan block %s", pblock2->GetProofOfStake().ToString().c_str(), hash.ToString().c_str());
             else
                 setStakeSeenOrphan.insert(pblock2->GetProofOfStake());