跳至主要內容
高級

節點發現

了解比特幣節點如何找到並連接其他節點,包括 DNS Seeds 和地址管理。

12 分鐘

節點發現機制

新節點需要找到其他節點才能加入網路。比特幣使用多種機制確保節點能夠發現對等方, 同時保持去中心化和抗審查特性。

DNS Seeds

DNS Seeds 是新節點啟動時的首選發現方式。這些是由社群成員運營的 DNS 服務器, 返回活躍節點的 IP 地址列表。

# Bitcoin Core 預設的 DNS Seeds (mainnet)
seed.bitcoin.sipa.be          # Pieter Wuille
dnsseed.bluematt.me           # Matt Corallo
dnsseed.bitcoin.dashjr.org    # Luke Dashjr
seed.bitcoinstats.com         # Christian Decker
seed.bitcoin.jonasschnelli.ch # Jonas Schnelli
seed.btc.petertodd.org        # Peter Todd
seed.bitcoin.sprovoost.nl     # Sjors Provoost
dnsseed.emzy.de               # Stephan Oeste
seed.bitcoin.wiz.biz          # Jason Maurice

# 查詢範例
nslookup seed.bitcoin.sipa.be

隱私考量: DNS 查詢可能被監控。Bitcoin Core 會嘗試使用多個 seeds, 並優先使用已知的 hardcoded 節點來減少依賴。

Hardcoded Seeds

如果 DNS Seeds 不可用,Bitcoin Core 有一份編譯時嵌入的節點列表作為備用:

# 位置: src/chainparamsseeds.h
// 定期從網路爬取並更新
static const uint8_t chainparams_seed_main[] = {
    0x01,0x04,0x9d,0x42,0x28,0x34,0x20,0x8d,  // 157.66.40.52:8333
    // ... 更多 IP 地址
};

# 使用條件
- DNS Seeds 全部失敗
- 沒有已知的對等方
- 啟動時作為最後手段

地址管理 (AddrMan)

Bitcoin Core 使用 AddrMan 數據結構管理已知的節點地址,設計用於抵抗各種攻擊。

兩個地址表

New Table (新表)

  • • 存儲從其他節點收到的地址
  • • 1024 個 bucket,每個 64 個地址
  • • 地址按來源 IP 分組
  • • 尚未驗證是否可達

Tried Table (已驗證表)

  • • 存儲成功連接過的地址
  • • 256 個 bucket,每個 64 個地址
  • • 地址按其自身 IP 分組
  • • 已驗證可達

地址選擇算法

建立新連線時:
1. 隨機決定從 New 還是 Tried 表選擇
2. 隨機選擇一個 bucket
3. 從 bucket 中隨機選擇地址
4. 考慮地址的「新鮮度」權重

權重因素:
- 最後嘗試時間(越近越好)
- 最後成功時間(越近越好)
- 嘗試次數(越少越好)

地址傳播

getaddr / addr 訊息

# 請求地址
節點 A 發送 getaddr 到節點 B
節點 B 回應 addr 訊息(最多 1000 個地址)

# addr 訊息內容
{
  count: 地址數量,
  addr_list: [
    {
      time: 最後活躍時間,
      services: 服務標誌,
      IP: 地址,
      port: 端口
    },
    ...
  ]
}

# addrv2 (BIP-155) 支持更多網路類型
IPv4, IPv6, Tor v2/v3, I2P, CJDNS

地址中繼

節點會主動中繼收到的地址給其他對等方:

  • • 隨機選擇 1-2 個對等方轉發每個新地址
  • • 限制轉發速率防止 DoS
  • • 只轉發近期活躍的地址(過去 10 分鐘內)
  • • 定期主動廣播自己的地址

安全考量

Eclipse Attack

攻擊者試圖控制受害節點的所有連線,使其與真實網路隔離:

攻擊方式:
1. 大量惡意節點連接到受害者(inbound)
2. 污染受害者的地址表
3. 等待受害者重啟
4. 受害者所有 outbound 連到惡意節點

後果:
- 看到虛假的區塊鏈
- 雙重支付攻擊
- 交易被審查

防護措施

AddrMan 設計

  • • 地址分散到多個 bucket
  • • 同一來源的地址不會填滿整個 bucket
  • • 隨機選擇減少可預測性

Outbound 連線保護

  • • 保證不同 /16 網段的連線
  • • Block-relay-only 連線不接受交易
  • • Anchor 連線在重啟後重連

連線多樣性

  • • 使用多種網路類型(IPv4、IPv6、Tor)
  • • 避免所有連線來自同一 ISP
  • • 手動添加可信節點

Anchor 連線

Bitcoin Core 會記住上次成功連接的 outbound 節點,重啟後優先嘗試重連:

# anchors.dat 文件
- 存儲 2 個 block-relay-only 連線
- 重啟後立即嘗試連接
- 防止重啟時被 eclipse

# 位置
~/.bitcoin/anchors.dat

手動配置

# bitcoin.conf 配置

# 手動添加節點
addnode=192.168.1.100:8333
addnode=mynode.example.com:8333

# 只連接到指定節點(謹慎使用)
connect=192.168.1.100:8333

# 禁用 DNS seeds
dnsseed=0

# 禁用 DNS 查詢
dns=0

# 監聽端口
port=8333
bind=0.0.0.0:8333

# 允許入站連線
listen=1

Tor 網路整合

Bitcoin Core 原生支持 Tor,提供額外的隱私和抗審查能力:

# bitcoin.conf Tor 配置

# 通過 Tor 連出
proxy=127.0.0.1:9050

# 創建 onion 服務接受入站
listenonion=1

# 只使用 Tor(最大隱私)
onlynet=onion
proxy=127.0.0.1:9050

# 混合模式
onlynet=onion
onlynet=ipv4

最佳實踐: 運行節點時,建議啟用 Tor 作為額外的出站連線,增加網路多樣性和隱私保護。

已複製連結
已複製到剪貼簿