// Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_CHECKPOINT_H #define BITCOIN_CHECKPOINT_H #include #include "util.h" #include "net.h" // max 1 hour before latest block static const int64_t CHECKPOINT_MAX_SPAN = nOneHour; #ifdef WIN32 #undef STRICT #undef PERMISSIVE #undef ADVISORY #endif class uint256; class CBlockIndex; class CSyncCheckpoint; /** Block-chain checkpoints are compiled-in sanity checks. * They are updated every release or three. */ namespace Checkpoints { /** Checkpointing mode */ enum CPMode { // Scrict checkpoints policy, perform conflicts verification and resolve conflicts STRICT = 0, // Advisory checkpoints policy, perform conflicts verification but don't try to resolve them ADVISORY = 1, // Permissive checkpoints policy, don't perform any checking PERMISSIVE = 2 }; // Returns true if block passes checkpoint checks bool CheckHardened(int nHeight, const uint256& hash); // Returns true if block passes banlist checks bool CheckBanned(const uint256 &nHash); // Return conservative estimate of total number of blocks, 0 if unknown int GetTotalBlocksEstimate(); // Returns last CBlockIndex* in mapBlockIndex that is a checkpoint CBlockIndex* GetLastCheckpoint(const std::map& mapBlockIndex); // Returns last checkpoint timestamp unsigned int GetLastCheckpointTime(); extern uint256 hashSyncCheckpoint; extern CSyncCheckpoint checkpointMessage; extern uint256 hashInvalidCheckpoint; extern CCriticalSection cs_hashSyncCheckpoint; CBlockIndex* GetLastSyncCheckpoint(); bool WriteSyncCheckpoint(const uint256& hashCheckpoint); bool AcceptPendingSyncCheckpoint(); uint256 AutoSelectSyncCheckpoint(); bool CheckSync(const uint256& hashBlock, const CBlockIndex* pindexPrev); bool WantedByPendingSyncCheckpoint(uint256 hashBlock); bool ResetSyncCheckpoint(); void AskForPendingSyncCheckpoint(CNode* pfrom); bool SetCheckpointPrivKey(std::string strPrivKey); bool SendSyncCheckpoint(uint256 hashCheckpoint); bool IsMatureSyncCheckpoint(); } // 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()); } }; class CSyncCheckpoint : public CUnsignedSyncCheckpoint { public: static const std::string strMasterPubKey; static std::string strMasterPrivKey; std::vector vchMsg; std::vector 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(); bool ProcessSyncCheckpoint(CNode* pfrom); }; #endif