From 9c28b3c6a120e07c3a0caea8e17e02c072e686b2 Mon Sep 17 00:00:00 2001 From: Scott Nadal Date: Tue, 12 Jun 2012 15:34:17 +0100 Subject: [PATCH] PPCoin: Automatically select a checkpoint for 'sendcheckpoint' --- src/bitcoinrpc.cpp | 13 ++++++++++++- src/checkpoints.cpp | 9 +++++++++ src/checkpoints.h | 1 + 3 files changed, 22 insertions(+), 1 deletions(-) diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index 033250f..dbbe67f 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -2026,6 +2026,13 @@ Value sendcheckpoint(const Array& params, bool fHelp) throw runtime_error( "Provided checkpoint block is not on main chain\n"); } + else + { + checkpoint.hashCheckpoint = Checkpoints::AutoSelectSyncCheckpoint(); + if (checkpoint.hashCheckpoint == Checkpoints::hashSyncCheckpoint) + throw runtime_error( + "Unable to select a more recent sync-checkpoint"); + } CDataStream sMsg; sMsg << (CUnsignedSyncCheckpoint)checkpoint; @@ -2045,7 +2052,11 @@ Value sendcheckpoint(const Array& params, bool fHelp) BOOST_FOREACH(CNode* pnode, vNodes) checkpoint.RelayTo(pnode); - return Value::null; + Object result; + result.push_back(Pair("checkpoint", Checkpoints::hashSyncCheckpoint.ToString().c_str())); + result.push_back(Pair("height", mapBlockIndex[Checkpoints::hashSyncCheckpoint]->nHeight)); + result.push_back(Pair("timestamp", DateTimeStrFormat("%x %H:%M:%S", mapBlockIndex[Checkpoints::hashSyncCheckpoint]->GetBlockTime()).c_str())); + return result; } diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index 4afdab9..097dd87 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -109,6 +109,15 @@ namespace Checkpoints return false; } + uint256 AutoSelectSyncCheckpoint() + { + // select block roughly 8 hours ago + CBlockIndex *pindex = mapBlockIndex[hashSyncCheckpoint]; + while (pindex->pnext && pindex->pnext->GetBlockTime() + AUTO_CHECKPOINT_MIN_SPAN <= GetAdjustedTime()) + pindex = pindex->pnext; + return pindex->GetBlockHash(); + } + // ppcoin: automatic checkpoint (represented by height of checkpoint) int nAutoCheckpoint = 0; int nBranchPoint = 0; // branch point to alternative branch diff --git a/src/checkpoints.h b/src/checkpoints.h index 8ea1ec7..e411c12 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -136,6 +136,7 @@ namespace Checkpoints extern CCriticalSection cs_hashSyncCheckpoint; bool AcceptPendingSyncCheckpoint(uint256 hashAcceptedBlock); + uint256 AutoSelectSyncCheckpoint(); // ppcoin: automatic checkpoint extern int nAutoCheckpoint; -- 1.7.1