跳至主要內容
進階

Checkpoints

深入了解 Bitcoin Core 的檢查點機制,用於加速初始區塊下載和防止長距離攻擊。

10 分鐘

什麼是 Checkpoints?

Checkpoints(檢查點)是硬編碼在 Bitcoin Core 中的特定區塊哈希,用於加速初始區塊下載(IBD) 並提供額外的安全保護。節點會驗證這些已知的區塊哈希,確保正在同步的是正確的區塊鏈。

Checkpoints 的作用

加速同步

  • • 跳過 checkpoint 前的腳本驗證
  • • 減少 IBD 時的 CPU 使用
  • • 更快完成初始同步

安全保護

  • • 防止長距離重組攻擊
  • • 確保同步到正確的鏈
  • • 降低 eclipse 攻擊風險

硬編碼的 Checkpoints

// chainparams.cpp 中的 checkpoints 示例
static Checkpoints::MapCheckpoints mapCheckpoints = {
    {  11111, uint256S("0x0000000069e244f73d78e8fd29...")},
    {  33333, uint256S("0x000000002dd5588a74784eaa7a...")},
    { 210000, uint256S("0x000000000000048b95347e8319...")},  // 第一次減半
    { 420000, uint256S("0x000000000000000002cce8167...")},   // 第二次減半
    { 630000, uint256S("0x000000000000000000024bead...")},   // 第三次減半
    // ... 更多 checkpoints
};

Checkpoints vs AssumeValid

特性 Checkpoints AssumeValid
主要目的 防止長距離重組 加速腳本驗證
可覆蓋
驗證影響 拒絕不符合的鏈 跳過簽名驗證

實現細節

class CheckpointVerifier {
  private checkpoints: Map;

  // 驗證區塊是否符合 checkpoint
  verifyBlock(block: Block): boolean {
    const checkpoint = this.checkpoints.get(block.height);

    if (checkpoint && block.hash !== checkpoint) {
      console.error(`Checkpoint mismatch at height ${block.height}`);
      return false;  // 拒絕這條鏈
    }

    return true;
  }

  // 檢查是否在 checkpoint 之前
  isBeforeLastCheckpoint(height: number): boolean {
    const lastHeight = Math.max(...this.checkpoints.keys());
    return height < lastHeight;
  }
}

注意: 現代 Bitcoin Core 主要依賴 AssumeValid 來加速同步,Checkpoints 的角色已減弱。 AssumeValid 更靈活,可被用戶覆蓋。

安全考量

長距離攻擊防護:

攻擊者嘗試:從創世區塊創建替代鏈

     主鏈:  Genesis → ... → CP1 → ... → CP2 → ...
                              ↑           ↑
                         Checkpoint   Checkpoint

     攻擊鏈:Genesis → ... → X → ...
                              ↑
                         不同的區塊 → 被拒絕!

由於攻擊鏈在 checkpoint 處不匹配,會被拒絕

優點

  • • 防止歷史重寫攻擊
  • • 加速初始同步
  • • 確認歷史區塊的正確性

爭議

  • • 由開發者決定「正確」的鏈
  • • 違背去中心化原則
  • • 無法被用戶覆蓋

總結

  • 防護作用:防止長距離重組攻擊
  • 硬編碼:無法通過配置禁用
  • 角色減弱:現代版本更依賴 AssumeValid
已複製連結
已複製到剪貼簿