失敗的交易能否找出哪個 Channel 已用盡?
根據此 LND PR
TemporaryChannelFailure
中的資訊,可以確定an 的發送者:在許多情況下,發送方不可能確定一對中的兩個節點中的哪一個對故障負責。在這種情況下,我們現在進行雙向懲罰。這不會傷害對中的好節點,因為只有它與壞節點的連接會受到懲罰。
所以我對這條評論的理解是,可以很容易地辨識通道,或者至少是一個耗盡通道旁邊的節點。真的那麼容易嗎?因此,是否可以
TemporaryChannelFailure
將通道耗盡總是分配給兩個節點或一個通道?我一直認為,錯誤根本無法分配給節點或通道。
這可能會簡化一些論文的工作,例如J Herrera-Joancomarti 等人的 On the Difficulty of Hiding the Balance of Lightning Network Channels。,或打開新的攻擊向量。
編輯:更多連結以供進一步研究
如果有人想給出更深入的答案或在此基礎上進行研究,這裡有一些指向
lnd
客戶端 github 程式碼庫中程式碼的連結:
- 在Lightningnetwork/lightning-onion crypto.go, function
DecryptError
中,客戶端循環遍歷秘密以解包錯誤並辨識sender
索引。- 在lightningnetwork/lnd htlcswitch/switch.go中,function
parseFailedPayment
這個DecryptError
函式用來訪問故障。- 稍後將訪問此值,例如 in
missioncontrol.go
或result_interpretation.go
as或。FailureSourceIdx``failureSourceIdx``failureSrcIdx
據我了解(但我沒有仔細檢查程式碼)答案是肯定的。洋蔥中的錯誤消息似乎以某種方式加密,只有洋蔥的原始發送者才能解密它。由於還必須填充錯誤以保持恆定長度的錯誤洋蔥,因此用於發送洋蔥的密鑰派生方案是一種重用。從這個意義上說,錯誤消息的接收者解開所有信封,因此應該知道錯誤來自哪個節點。
當中間或最終節點(預期接收者)想要發送錯誤消息時,它們會創建一個包含(1)錯誤消息的錯誤包;(2) 填充以隱藏長度和 (3) 使用密鑰驗證數據包的 HMAC
um
。然後,這個出錯的節點會生成一個密鑰,該密鑰ammag
用於生成一個偽隨機流,然後使用 XOR 將其應用於錯誤數據包以對其進行模糊處理。update_fail_htlc
然後使用包含失敗消息的錯誤消息發送此錯誤數據包temporary_channel_failure
(此失敗消息用於通道資金不足或飛行中的 htlc 過多的情況)。然後,這個出錯的節點會將這個錯誤數據包轉發給將 htlc 轉發給它的節點。中間節點儲存來自前向路徑的共享秘密,並在每一跳期間重複使用它來混淆任何相應的返回數據包。沿著返迴路徑的每一跳都會重複混淆步驟,生成自己的
ammag
,生成偽隨機字節流,並在返迴轉發之前將結果應用於返回數據包。錯誤消息包括id
讓對等方知道錯誤消息被引用到的 htlc。當錯誤消息到達源節點時,它能夠檢測到該錯誤消息是由它自己使用的,
id
因為它是創建它的那個。當源節點接收到與其發起的傳輸匹配的錯誤消息時,它會為路由中的每個躍點生成ammag
和um
密鑰。然後,它使用每一跳的密鑰迭代地解密錯誤消息,並使用每一跳的ammag
密鑰計算 HMACum
。因此,源節點可以通過將 hmac 欄位與計算的錯誤數據包的 HMAC 進行匹配來檢測錯誤消息的發送者。