cd1b497f0d
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>
160 lines
4.0 KiB
C++
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
|