跳至主要內容
進階

SCID Alias 短通道ID別名

了解閃電網路的 SCID 別名機制,如何提升隱私保護和支援零確認通道。

8 分鐘

什麼是 SCID?

短通道 ID(Short Channel ID,SCID)是閃電網路中識別通道的 8 字節標識符。 傳統上,SCID 直接編碼了通道注資交易在區塊鏈上的位置(區塊高度、交易索引、輸出索引), 這會洩露通道的鏈上資訊。SCID 別名允許使用任意值作為通道識別符,提升隱私。

功能位 46/47: option_scid_alias 允許節點協商使用別名而非真實的區塊位置。

傳統 SCID 結構

傳統 SCID 格式(8 字節 = 64 位):

┌─────────────────┬─────────────────┬─────────────────┐
│ Block Height    │ TX Index        │ Output Index    │
│ (24 bits)       │ (24 bits)       │ (16 bits)       │
└─────────────────┴─────────────────┴─────────────────┘

範例:SCID 700000x1234x0
• Block Height: 700000
• TX Index: 1234
• Output Index: 0
• Hex: 0x000AB2800004D200

隱私問題:
1. 任何人都可以從 SCID 找到注資交易
2. 可以確定通道容量
3. 可以追蹤節點的鏈上活動
4. 路由節點可以關聯支付和通道
5. 私有通道的 SCID 也會洩露資訊

SCID 別名

SCID 別名機制:

別名生成:
• 節點可以為通道分配任意 SCID 別名
• 隨機生成 8 字節值
• 確保唯一性(本地不衝突)
• 無需對應真實區塊位置

範例:
  真實 SCID: 700000x1234x0
  別名 SCID: 0x0123456789ABCDEF

使用場景:
1. 私有通道
   發票路由提示使用別名,隱藏真實的注資交易位置

2. 零確認通道
   在確認前就有可用的 SCID,不需等待區塊確認

3. Splicing
   地址變更後保持相同識別符,通道容量變更不影響路由

協商流程

SCID 別名協商:

開通道時的協商:
Alice                                Bob
  |                                    |
  |---- open_channel ----------------->|
  |     option_scid_alias: 1           |  Alice 支援別名
  |                                    |
  |<--- accept_channel ----------------|
  |     option_scid_alias: 1           |  Bob 也支援
  |                                    |
  | [通道開設完成]                     |
  |                                    |
  |<--- channel_ready -----------------|
  |     scid: real, alias: 0xABCD...   |  Bob 分配別名
  |                                    |
  |---- channel_ready ---------------->|
  |     scid: real, alias: 0x1234...   |  Alice 分配別名

channel_ready 訊息擴展:
• channel_id: 32 bytes
• next_per_commitment_point: 33 bytes
• short_channel_id: 8 bytes (optional)
• alias: 8 bytes

與零確認通道

零確認通道需要 SCID 別名:

問題:
• 傳統 SCID 編碼區塊位置
• 零確認通道的注資交易還未進入區塊
• 無法計算真實 SCID,通道無法被識別和使用

解決方案:
1. 雙方生成並交換 SCID 別名
2. 使用別名進行支付路由
3. 確認後可繼續用別名或切換到真實 SCID

流程:
  注資交易廣播 -> 交換別名 -> 立即路由 -> 背景等待確認

配合 option_zeroconf:
┌─────────────────────────────────────────────────────┐
│ option_zeroconf (50/51) + option_scid_alias (46/47) │
│                                                     │
│ • zeroconf: 允許未確認通道                          │
│ • scid_alias: 提供可用的通道識別符                  │
└─────────────────────────────────────────────────────┘

隱私保護

私有通道隱私

私有通道不公告到網路,但發票需要提供路由提示。 使用別名可以避免在發票中洩露注資交易位置。

UTXO 關聯

真實 SCID 可以關聯到鏈上 UTXO。別名打破這種關聯, 增加鏈上分析難度。

容量隱藏

無法從別名推斷通道容量。觀察者無法確定通道的資金規模。

節點關聯

別名減少了將閃電網路活動與特定鏈上地址關聯的可能性。

發票中的使用

發票路由提示中的 SCID 別名:

私有通道發票 (lnbc10u1p...)
路由提示(r tag):
• pubkey: 對方節點公鑰
• short_channel_id: 別名(不是真實 SCID)
• fee_base_msat: 基礎費用
• fee_proportional_millionths: 比例費用
• cltv_expiry_delta: 時間鎖差值

發送者流程:
1. 解碼發票獲取路由提示
2. 使用別名 SCID 構建洋蔥路由
3. 接收節點識別別名並轉發

接收節點處理:
1. 收到使用別名的 HTLC
2. 查找本地別名對應表
3. 找到對應的通道
4. 正常處理 HTLC

配置與使用

啟用 SCID 別名:

LND(lnd.conf):
[protocol]
# 啟用 SCID 別名支援(默認啟用)
protocol.option-scid-alias=true

# 零確認通道也需要
protocol.zero-conf=true

# 查看通道別名
lncli listchannels | jq '.channels[].alias_scids'

CLN(config):
# 預設支援 SCID 別名
# 無需額外配置

# 查看通道
lightning-cli listpeerchannels

開設使用別名的通道:
# LND
lncli openchannel --node_key <pubkey> \
  --local_amt 1000000 \
  --private \           # 私有通道
  --zero_conf            # 零確認(需要別名)

# CLN
lightning-cli fundchannel <node_id> 1000000sat \
  announce=false

注意: 公開通道仍然使用真實 SCID 進行網路公告(channel_announcement), 因為其他節點需要驗證通道的鏈上存在。別名主要用於私有通道和零確認通道。

相關資源

下一步: 了解 原子多路徑支付(AMP) 的高級多路徑機制。

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