return (nFound >= nRequired);
}
+bool static ReserealizeBlockSignature(CBlock* pblock)
+{
+ if (pblock->IsProofOfWork())
+ {
+ pblock->vchBlockSig.clear();
+ return true;
+ }
+
+ return CKey::ReserealizeSignature(pblock->vchBlockSig);
+}
+
+bool static IsCanonicalBlockSignature(CBlock* pblock)
+{
+ if (pblock->IsProofOfWork())
+ return pblock->vchBlockSig.empty();
+
+ return IsDERSignature(pblock->vchBlockSig);
+}
+
bool ProcessBlock(CNode* pfrom, CBlock* pblock)
{
// Check for duplicate
if (mapOrphanBlocks.count(hash))
return error("ProcessBlock() : already have block (orphan) %s", hash.ToString().substr(0,20).c_str());
- // ppcoin: check proof-of-stake
+ // 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) && !Checkpoints::WantedByPendingSyncCheckpoint(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());
+ // Strip the garbage from newly received blocks, if we found some
+ if (!IsCanonicalBlockSignature(pblock)) {
+ if (!ReserealizeBlockSignature(pblock))
+ printf("WARNING: ProcessBlock() : ReserealizeBlockSignature FAILED\n");
+ }
+
// Preliminary checks
if (!pblock->CheckBlock(true, true, (pblock->nTime > Checkpoints::GetLastCheckpointTime())))
return error("ProcessBlock() : CheckBlock FAILED");