X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fmain.cpp;h=3377465acadcb77266eb1ddbc2b5880272d4afa7;hb=f4f3bed422514ede7d75e93e23e0e7a4dacc53c7;hp=3bc0983d358a7e92405133e152934df758cf1d78;hpb=93b707620f8cb36ef4cfb17f470706f7a4af5f0a;p=novacoin.git diff --git a/src/main.cpp b/src/main.cpp index 3bc0983..3377465 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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());