跳至主要內容
進階

Blocks Only Mode

深入了解 Bitcoin Core 的 blocksonly 模式,透過只同步區塊來節省頻寬。

8 分鐘

什麼是 Blocks Only 模式?

Blocks Only 模式讓 Bitcoin Core 只接收和驗證區塊,不參與未確認交易的中繼。 這大幅減少頻寬使用,適合網路連線受限或只需要驗證區塊鏈的場景。

頻寬節省

正常模式

  • • 接收所有交易廣播
  • • 中繼交易給其他節點
  • • 每天約 10-50 GB

Blocks Only

  • • 只接收區塊
  • • 不參與交易中繼
  • • 每天約 150-200 MB

配置方式

啟用 Blocks Only

# 命令行啟用
bitcoind -blocksonly

# 配置文件
echo "blocksonly=1" >> ~/.bitcoin/bitcoin.conf

# 運行時切換(需要重啟)
# 沒有 RPC 命令可以動態切換
# bitcoin.conf

# 啟用 blocks only 模式
blocksonly=1

# 額外的頻寬節省選項
# 限制上傳流量(MB/天,0 = 無限制)
maxuploadtarget=500

# 減少出站連接(預設 10,blocks only 時可減少)
maxconnections=20

# 不監聽入站連接(進一步減少頻寬)
listen=0

注意: Blocks only 模式仍然會驗證區塊中的所有交易,確保完整的安全性。 只是不參與未確認交易的傳播。

行為變化

啟用後的變化

功能 正常模式 Blocks Only
接收區塊
驗證區塊
接收交易廣播
中繼交易
Mempool 維護 基本空
發送交易(RPC)
手續費估算 準確 不可用

Mempool 行為

// Blocks only 模式下的 mempool 行為
class MempoolBlocksOnly {
  // 不接收來自 P2P 的交易
  onTxMessage(peer: Peer, tx: Transaction): void {
    // 忽略,不處理
    return;
  }

  // 但仍然接受本地提交的交易
  submitTransaction(tx: Transaction): Result {
    // 驗證交易
    if (!this.validateTransaction(tx)) {
      return { error: 'Invalid transaction' };
    }

    // 添加到 mempool
    this.mempool.add(tx);

    // 不廣播(沒有連接支持 tx relay)
    // 但白名單連接可以接收
    for (const peer of this.whitelistedPeers) {
      peer.send('tx', tx);
    }

    return { success: true };
  }

  // 區塊到達時,從 mempool 移除確認的交易
  onNewBlock(block: Block): void {
    for (const tx of block.transactions) {
      this.mempool.remove(tx.txid);
    }
  }
}

使用場景

✓ 適合使用

  • • 頻寬有限的環境
  • • 衛星網路連接
  • • 只需要區塊鏈驗證
  • • 備份節點
  • • 歷史數據分析

✗ 不適合使用

  • • 需要手續費估算
  • • 即時交易監控
  • • 交易廣播服務
  • • 礦池/礦工節點
  • • 閃電網路節點

衛星節點

Blockstream Satellite 用戶特別適合使用 blocks only 模式, 因為衛星連接是單向的且頻寬受限。

# 衛星節點配置示例
blocksonly=1
listen=0
maxconnections=4
maxuploadtarget=100

# 如果有雙向網路連接用於發送交易
# 可以添加白名單節點
whitelist=192.168.1.100

限制與影響

手續費估算

手續費估算不可用

由於沒有 mempool 數據,estimatesmartfee 命令將返回錯誤或不準確的結果。

# 在 blocks only 模式下
bitcoin-cli estimatesmartfee 6
{
  "errors": ["Insufficient data or no feerate found"]
}

錢包影響

  • 餘額查詢

    正常工作,基於已確認交易

  • 發送交易

    可以創建交易,但廣播受限

  • 接收未確認交易通知

    不會收到,只在區塊確認後才能看到

  • 自動手續費

    需要手動指定手續費

實現細節

P2P 協議變化

class P2PNodeBlocksOnly {
  private blocksOnly: boolean;

  // 發送 version 消息時設定
  sendVersion(peer: Peer): void {
    const version = {
      version: 70016,
      services: this.getServices(),
      // blocks only 節點不設定 NODE_BLOOM 標誌
      // 並且在 fRelay 字段設為 false
      relay: !this.blocksOnly,
    };

    peer.send('version', version);
  }

  // 處理 inv 消息
  onInv(peer: Peer, inv: Inventory[]): void {
    for (const item of inv) {
      switch (item.type) {
        case INV_TYPE.BLOCK:
        case INV_TYPE.COMPACT_BLOCK:
          // 區塊相關的 inv 正常處理
          this.requestBlock(peer, item.hash);
          break;

        case INV_TYPE.TX:
        case INV_TYPE.WITNESS_TX:
          if (this.blocksOnly) {
            // 忽略交易 inv
            continue;
          }
          this.requestTx(peer, item.hash);
          break;
      }
    }
  }

  // Blocks only 模式不發送 mempool 請求
  // 不響應 mempool 消息
  // 不廣播本地交易(除非是白名單連接)
}

頻寬計算

正常模式的日均流量:
- 交易廣播:~20-40 GB(雙向)
- 區塊傳輸:~150 MB
- 其他協議開銷:~500 MB
總計:~20-40 GB/天

Blocks Only 模式的日均流量:
- 區塊傳輸:~150 MB
- 區塊頭和其他:~50 MB
總計:~200 MB/天

節省比例:約 99%

替代方案

maxuploadtarget

如果只想限制上傳流量而不完全禁用交易中繼,可以使用 maxuploadtarget。

# 限制每天上傳 1 GB
bitcoind -maxuploadtarget=1024

# 達到限制後:
# - 停止服務歷史區塊
# - 繼續服務新區塊
# - 繼續正常交易中繼

與 Pruning 結合

# 最小資源配置
blocksonly=1
prune=550         # 最小 550 MB
maxconnections=10
listen=0

# 這個配置:
# - 磁碟使用約 550 MB
# - 每天流量約 200 MB
# - 仍然完全驗證所有區塊

總結

  • 頻寬節省:減少約 99% 的網路流量
  • 安全性:仍然完整驗證所有區塊
  • 適用場景:頻寬受限、備份節點、區塊鏈分析
  • 限制:無手續費估算、無未確認交易通知
已複製連結
已複製到剪貼簿