PPCoin: Ask for orphan root directly for pending synchronized checkpoint
authorSunny King <sunnyking9999@gmail.com>
Sat, 23 Jun 2012 13:57:11 +0000 (14:57 +0100)
committerSunny King <sunnyking9999@gmail.com>
Sat, 23 Jun 2012 13:57:11 +0000 (14:57 +0100)
src/checkpoints.cpp
src/main.cpp
src/main.h

index 1384082..78a0be7 100644 (file)
@@ -328,7 +328,12 @@ bool CSyncCheckpoint::ProcessSyncCheckpoint(CNode* pfrom)
             printf("ProcessSyncCheckpoint: pending for sync-checkpoint %s\n", hashCheckpoint.ToString().c_str());
             // Ask this guy to fill in what we're missing
             if (pfrom)
+            {
                 pfrom->PushGetBlocks(pindexBest, hashCheckpoint);
+                // ask directly as well in case rejected earlier by duplicate
+                // proof-of-stake because getblocks may not get it this time
+                pfrom->AskFor(CInv(MSG_BLOCK, mapOrphanBlocks.count(hashCheckpoint)? GetOrphanRoot(mapOrphanBlocks[hashCheckpoint]) : hashCheckpoint));
+            }
             return false;
         }
 
index a50b5ab..e5234c8 100644 (file)
@@ -660,7 +660,7 @@ bool CBlock::ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions)
     return true;
 }
 
-uint256 static GetOrphanRoot(const CBlock* pblock)
+uint256 GetOrphanRoot(const CBlock* pblock)
 {
     // Work back to the first block in the orphan chain
     while (mapOrphanBlocks.count(pblock->hashPrevBlock))
@@ -1676,10 +1676,9 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock)
         if (pfrom)
         {
             pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock2));
-            // ppcoin: getblocks may not obtain the parent block rejected earlier
-            // by duplicate-stake check so we must ask for it again directly
-            if (!mapOrphanBlocks.count(pblock->hashPrevBlock))
-                pfrom->AskFor(CInv(MSG_BLOCK, pblock->hashPrevBlock));
+            // ppcoin: getblocks may not obtain the ancestor block rejected
+            // earlier by duplicate-stake check so we ask for it again directly
+            pfrom->AskFor(CInv(MSG_BLOCK, GetOrphanRoot(pblock2)));
         }
         return true;
     }
index feed1e2..9e4a1a8 100644 (file)
@@ -67,6 +67,7 @@ extern int64 nHPSTimerStart;
 extern int64 nTimeBestReceived;
 extern CCriticalSection cs_setpwalletRegistered;
 extern std::set<CWallet*> setpwalletRegistered;
+extern std::map<uint256, CBlock*> mapOrphanBlocks;
 
 // Settings
 extern int fGenerateBitcoins;
@@ -108,7 +109,7 @@ int GetNumBlocksOfPeers();
 bool IsInitialBlockDownload();
 std::string GetWarnings(std::string strFor);
 bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew);
-
+uint256 GetOrphanRoot(const CBlock* pblock);