跳至主要內容
高級

Block-Relay-Only Connections

深入了解 Bitcoin Core 的 block-relay-only 連接,增強隱私和抵抗攻擊的特殊連接類型。

10 分鐘

什麼是 Block-Relay-Only 連接?

Block-relay-only 連接是 Bitcoin Core 0.19 引入的特殊連接類型。 這些連接只中繼區塊,不中繼交易或地址,提供額外的隱私保護和 Eclipse 攻擊抵抗。

連接類型比較

功能 Full Relay Block-Relay-Only
區塊中繼
交易中繼
地址中繼
預設數量 8 出站 2 出站

優勢

隱私增強

  • • 不洩露交易來源
  • • 對等節點無法識別這些連接
  • • 攻擊者更難追蹤交易傳播

Eclipse 抵抗

  • • 額外的隱藏連接
  • • 攻擊者難以識別所有連接
  • • 作為錨定連接重啟時使用
連接結構示意:

你的節點
    │
    ├── Full Relay 連接 (8 個出站)
    │   ├── 節點 A ←→ 區塊、交易、地址
    │   ├── 節點 B ←→ 區塊、交易、地址
    │   └── ...
    │
    └── Block-Relay-Only 連接 (2 個出站)
        ├── 節點 X ←→ 只有區塊
        └── 節點 Y ←→ 只有區塊

攻擊者看到:
- 與 A、B 等節點的交易往來
- 無法看到 X、Y 的存在(因為沒有交易特徵)

實現細節

enum ConnectionType {
  INBOUND,
  OUTBOUND_FULL_RELAY,
  BLOCK_RELAY,           // Block-relay-only
  MANUAL,
  FEELER,
  ADDR_FETCH,
}

class P2PConnection {
  type: ConnectionType;

  // 版本消息中設定 relay = false
  sendVersion(): VersionMessage {
    return {
      version: 70016,
      services: this.getServices(),
      relay: this.type !== ConnectionType.BLOCK_RELAY,
    };
  }

  // 過濾消息
  shouldRelay(msgType: string): boolean {
    if (this.type === ConnectionType.BLOCK_RELAY) {
      // 只允許區塊相關消息
      const allowed = [
        'version', 'verack', 'ping', 'pong',
        'inv', 'getdata', 'getheaders', 'headers',
        'block', 'cmpctblock', 'blocktxn', 'getblocktxn',
        'sendcmpct', 'sendheaders',
      ];
      return allowed.includes(msgType);
    }
    return true;
  }

  onInv(inv: Inventory[]): void {
    if (this.type === ConnectionType.BLOCK_RELAY) {
      // 只處理區塊 inv,忽略交易
      inv = inv.filter(i => i.type === INV_TYPE.BLOCK);
    }
    this.processInv(inv);
  }
}

錨定連接

Block-relay-only 連接在節點關閉時會被保存為錨定連接,重啟時優先重連:

# 錨定連接儲存位置
~/.bitcoin/anchors.dat

# 節點關閉時
# 1. 選擇 2 個 block-relay-only 連接
# 2. 保存到 anchors.dat

# 節點啟動時
# 1. 讀取 anchors.dat
# 2. 優先連接這些節點
# 3. 刪除 anchors.dat(一次性使用)

配置選項

# 預設配置(無需修改)
# 自動建立 2 個 block-relay-only 出站連接

# 查看連接類型
bitcoin-cli getpeerinfo | jq '.[] | {addr, connection_type}'

# 輸出示例
{
  "addr": "192.168.1.100:8333",
  "connection_type": "block-relay-only"
}

# 手動添加 block-relay-only 連接
bitcoin-cli addconnection "192.168.1.200:8333" "block-relay-only"

注意: Block-relay-only 連接是自動管理的,通常不需要手動配置。 手動干預可能會影響節點的隱私和安全特性。

總結

  • 只傳區塊:不中繼交易和地址
  • 隱私增強:對等節點難以識別這些連接
  • Eclipse 抵抗:額外的隱藏連接增加攻擊難度
  • 錨定連接:重啟時優先重連以防止攻擊
已複製連結
已複製到剪貼簿