PPCoin: Process and relay synchronized checkpoint
[novacoin.git] / src / checkpoints.h
index 033b228..6ef2c14 100644 (file)
@@ -32,7 +32,108 @@ namespace Checkpoints
     CBlockIndex* GetLastCheckpoint(const std::map<uint256, CBlockIndex*>& mapBlockIndex);
 
     // ppcoin: synchronized checkpoint
+    class CUnsignedSyncCheckpoint
+    {
+    public:
+        int nVersion;
+        uint256 hashCheckpoint;      // checkpoint block
+
+        IMPLEMENT_SERIALIZE
+        (
+            READWRITE(this->nVersion);
+            nVersion = this->nVersion;
+            READWRITE(hashCheckpoint);
+        )
+
+        void SetNull()
+        {
+            nVersion = 1;
+            hashCheckpoint = 0;
+        }
+
+        std::string ToString() const
+        {
+            return strprintf(
+                    "CSyncCheckpoint(\n"
+                    "    nVersion       = %d\n"
+                    "    hashCheckpoint = %s\n"
+                    ")\n",
+                nVersion,
+                hashCheckpoint.ToString().c_str());
+        }
+
+        void print() const
+        {
+            printf("%s", ToString().c_str());
+        }
+    };
+
+    class CSyncCheckpoint : public CUnsignedSyncCheckpoint
+    {
+    public:
+        std::vector<unsigned char> vchMsg;
+        std::vector<unsigned char> vchSig;
+
+        CSyncCheckpoint()
+        {
+            SetNull();
+        }
+
+        IMPLEMENT_SERIALIZE
+        (
+            READWRITE(vchMsg);
+            READWRITE(vchSig);
+        )
+
+        void SetNull()
+        {
+            CUnsignedSyncCheckpoint::SetNull();
+            vchMsg.clear();
+            vchSig.clear();
+        }
+
+        bool IsNull() const
+        {
+            return (hashCheckpoint == 0);
+        }
+
+        uint256 GetHash() const
+        {
+            return SerializeHash(*this);
+        }
+
+        bool RelayTo(CNode* pnode) const
+        {
+            // returns true if wasn't already sent
+            if (pnode->hashCheckpointKnown != hashCheckpoint)
+            {
+                pnode->hashCheckpointKnown = hashCheckpoint;
+                pnode->PushMessage("checkpoint", *this);
+                return true;
+            }
+            return false;
+        }
+
+        bool CheckSignature()
+        {
+            CKey key;
+            if (!key.SetPubKey(ParseHex("0487ca85b6ae9d311f996c7616d20d0c88a5b4f07d25e78f419019f35cce6522acf978b2d99f0e7a58db1f120439e5c1889266927854aa57c93956c2569188a539")))
+                return error("CSyncCheckpoint::CheckSignature() : SetPubKey failed");
+            if (!key.Verify(Hash(vchMsg.begin(), vchMsg.end()), vchSig))
+                return error("CSyncCheckpoint::CheckSignature() : verify signature failed");
+
+            // Now unserialize the data
+            CDataStream sMsg(vchMsg);
+            sMsg >> *(CUnsignedSyncCheckpoint*)this;
+            return true;
+        }
+
+        bool ProcessSyncCheckpoint();
+    };
+
     extern uint256 hashSyncCheckpoint;
+    extern CSyncCheckpoint checkpointMessage;
+    extern CCriticalSection cs_hashSyncCheckpoint;
 
     // ppcoin: automatic checkpoint
     extern int nAutoCheckpoint;