進階
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
已複製連結