高級
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 抵抗:額外的隱藏連接增加攻擊難度
- ✓ 錨定連接:重啟時優先重連以防止攻擊
已複製連結