diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index e0844ae..e80a2d6 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -21,6 +21,7 @@ namespace Checkpoints // static MapCheckpoints mapCheckpoints = { { 0, hashGenesisBlockOfficial }, + { 570, uint256("0x00000000005ce8c8eac03a0ca05f2ca0300268af40d52331e78392a5200d7e5f")}, { 2000, uint256("0x0000000000b5f20078bf46ebdf1500813bb6b2cb482065aa93b89e073b2c6467")}, { 2101, uint256("0xd4ea1ac45b63c8162a7fc8033cec441db8d532ba988202849d7831e32fe2d059")}, { 2847, uint256("0xb5015e2835f13fd3bb6135cff9b31ac33310c9b77d694bdb592b8680d98d018e")}, diff --git a/src/clientversion.h b/src/clientversion.h index 2a4f3c0..b5537bf 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -6,9 +6,9 @@ // // These need to be macros, as version.cpp's and triangles-qt.rc's voodoo requires it -#define CLIENT_VERSION_MAJOR 6 -#define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 0 +#define CLIENT_VERSION_MAJOR 5 +#define CLIENT_VERSION_MINOR 9 +#define CLIENT_VERSION_REVISION 8 #define CLIENT_VERSION_BUILD 0 // Converts the parameter X to a string after macro replacement on X has been performed. diff --git a/src/main.cpp b/src/main.cpp index 85aa516..83e3e83 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1324,10 +1324,12 @@ bool IsInitialBlockDownload() pindexLastBest = pindexBest; nLastUpdate = GetTime(); } - // IBD is complete once we've passed the checkpoint height estimate. - // The previous >24h block-time check incorrectly kept IBD true when the - // chain was synced but simply stalled (no new blocks arriving), which - // prevented the stake miner from ever proceeding. + // IBD is complete once we've passed the checkpoint AND the chain tip is + // recent (within 24h). This prevents a stall AFTER checkpoint from + // permanently disabling header fetching. The forcestaking path above + // handles the specific staking-broker scenario. + if (GetTime() - nLastUpdate > 24 * 60 * 60) + return true; return false; } @@ -4043,14 +4045,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) // parallelism. Multiple peers sending overlapping inv ranges is harmless // (AlreadyHave filters duplicates) but ensures we discover and download // blocks from the fastest available source. + // NOTE: nStartingHeight from version messages is unverified. Peers can + // claim any height. During IBD we always ask all eligible peers rather + // than filtering on a claim that may be wrong (a stunted node could be + // reporting the full chain height while only serving the tail of its + // own fork). Use nBestKnownHeight (updated from actual block responses) + // for peer capability assessment instead. static int nAskedForBlocks = 0; bool fIBD = IsInitialBlockDownload(); - bool fBehindPeer = (pfrom->nStartingHeight > nBestHeight); + // During IBD: ask every non-client peer unconditionally to maximise + // download sources. Post-IBD: use traditional height-check logic. bool fShouldAsk = !pfrom->fClient && !pfrom->fOneShot && - (pfrom->nStartingHeight > (nBestHeight - 144)) && + (fIBD || + pfrom->nStartingHeight > (nBestHeight - 144) || + pfrom->nStartingHeight > nBestHeight) && (pfrom->nVersion < NOBLKS_VERSION_START || pfrom->nVersion >= NOBLKS_VERSION_END) && - (fIBD || nAskedForBlocks < 1 || vNodes.size() <= 1 || fBehindPeer); + (fIBD || nAskedForBlocks < 1 || vNodes.size() <= 1 || pfrom->nStartingHeight > nBestHeight); printf("IBD-DIAG: version handler: peer=%s height=%d ourHeight=%d fClient=%d fOneShot=%d shouldAsk=%d nAskedForBlocks=%d IBD=%d\n", pfrom->addr.ToString().c_str(), pfrom->nStartingHeight, nBestHeight, pfrom->fClient, pfrom->fOneShot, fShouldAsk, nAskedForBlocks, fIBD);