PPCoin: Automatically select a checkpoint for 'sendcheckpoint'
authorScott Nadal <scott.nadal@gmail.com>
Tue, 12 Jun 2012 14:34:17 +0000 (15:34 +0100)
committerScott Nadal <scott.nadal@gmail.com>
Tue, 12 Jun 2012 14:34:17 +0000 (15:34 +0100)
src/bitcoinrpc.cpp
src/checkpoints.cpp
src/checkpoints.h

index 033250f..dbbe67f 100644 (file)
@@ -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;
 }
 
 
index 4afdab9..097dd87 100644 (file)
@@ -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
index 8ea1ec7..e411c12 100644 (file)
@@ -136,6 +136,7 @@ namespace Checkpoints
     extern CCriticalSection cs_hashSyncCheckpoint;
 
     bool AcceptPendingSyncCheckpoint(uint256 hashAcceptedBlock);
+    uint256 AutoSelectSyncCheckpoint();
 
     // ppcoin: automatic checkpoint
     extern int nAutoCheckpoint;