return true;
}
-bool static Reorganize(CTxDB& txdb, CBlockIndex* pindexNew)
+bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew)
{
printf("REORGANIZE\n");
if (!Checkpoints::CheckAuto(pindexPrev))
return DoS(100, error("AcceptBlock() : rejected by automatic checkpoint at %d", Checkpoints::nAutoCheckpoint));
+ // ppcoin: check that the block satisfies synchronized checkpoint
+ if (!Checkpoints::CheckSync(hash, pindexPrev))
+ return error("AcceptBlock() : rejected by synchronized checkpoint");
+
// Write block to history file
if (!CheckDiskSpace(::GetSerializeSize(*this, SER_DISK)))
return error("AcceptBlock() : out of disk space");
pnode->PushInventory(CInv(MSG_BLOCK, hash));
// ppcoin: check pending sync-checkpoint
- Checkpoints::AcceptPendingSyncCheckpoint(hash);
+ Checkpoints::AcceptPendingSyncCheckpoint();
return true;
}
// Ask this guy to fill in what we're missing
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));
+ }
return true;
}