Files
triangles_v5/src/checkpoints.h
T
sami7777 cd1b497f0d v5.3.7: Fix sync stall, transaction display, balance updates, and bootstrap snapshots
Sync fixes:
- Extend stall detection beyond IBD to catch post-IBD sync gaps
- Walk-forward inv continuation to avoid CBlockLocator exponential gap loop
- Track walk-forward progress for stall recovery without restarting from scratch

GUI fixes:
- Load transactions synchronously in constructor (deferred QTimer never fired)
- Use beginResetModel/endResetModel instead of deprecated reset()
- Schedule full refresh on TRY_LOCK failure to avoid dropped CT_NEW notifications
- Only update cachedNumBlocks after successful balance check (prevents permanent loss)
- Add GetAllBalances() single-pass balance retrieval with TRY_LOCK

Bootstrap:
- Add trusted snapshot manifest verification for bootstrap archives
- Add IsKnownCheckpoint() to validate manifest against compiled-in checkpoints
- Skip txleveldb rebuild when verified manifest is present

Bump version to 5.3.7 across all packaging manifests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 23:36:43 -07:00

160 lines
4.0 KiB
C++

// 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 TRIANGLES_CHECKPOINT_H
#define TRIANGLES_CHECKPOINT_H
#include <map>
#include "net.h"
#include "util.h"
#define CHECKPOINT_MAX_SPAN (60 * 60 * 2) // max 2 hours before latest block
#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 only if (nHeight, hash) is an exact entry in mapCheckpoints
bool IsKnownCheckpoint(int nHeight, const uint256& hash);
// 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<uint256, CBlockIndex*>& mapBlockIndex);
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();
}
// triangles: 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:
static const std::string strMasterPubKey;
static std::string strMasterPrivKey;
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();
bool ProcessSyncCheckpoint(CNode* pfrom);
};
#endif