高級
HTLC Scripts HTLC 腳本
深入了解 HTLC 的 Bitcoin Script 實現,包括 offered 和 received HTLC 的腳本結構。
15 分鐘
HTLC 腳本概述
HTLC(哈希時間鎖定合約)是閃電網路的核心構建塊。其安全性依賴於精心設計的 Bitcoin Script,確保資金只能在正確條件下被花費。
兩種視角: 同一個 HTLC 在發送方承諾交易中是 "offered"(提供的), 在接收方承諾交易中是 "received"(收到的)。腳本略有不同。
Offered HTLC 腳本
Offered HTLC(在發送方承諾交易中):
腳本結構:
# Revocation path
OP_DUP OP_HASH160 <RIPEMD160(SHA256(revocationpubkey))>
OP_EQUAL
OP_IF
OP_CHECKSIG
OP_ELSE
<remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
OP_NOTIF
# Timeout path - sender can reclaim after timeout
OP_DROP 2 OP_SWAP <local_htlcpubkey> 2
OP_CHECKMULTISIG
OP_ELSE
# Success path - provide preimage
OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
OP_CHECKSIG
OP_ENDIF
OP_ENDIF
三種花費路徑:
1. 撤銷路徑:
witness: <revocation_sig> <revocationpubkey>
條件:對方發布舊狀態
2. 成功路徑(preimage):
witness: <remotehtlcsig> <payment_preimage>
條件:接收方知道 preimage
3. 超時路徑:
witness: 0 <remotehtlcsig> <localhtlcsig>
條件:CLTV 時間鎖過期
需要通過 HTLC-timeout 交易 Received HTLC 腳本
Received HTLC(在接收方承諾交易中):
腳本結構:
# Revocation path
OP_DUP OP_HASH160 <RIPEMD160(SHA256(revocationpubkey))>
OP_EQUAL
OP_IF
OP_CHECKSIG
OP_ELSE
<remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
OP_IF
# Success path - provide preimage
OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
OP_ELSE
# Timeout path
OP_DROP <cltv_expiry> OP_CHECKLOCKTIMEVERIFY OP_DROP
OP_CHECKSIG
OP_ENDIF
OP_ENDIF
花費路徑差異:
Received HTLC vs Offered HTLC:
成功路徑:
• 需要通過 HTLC-success 交易
• 輸出有 to_self_delay 延遲
超時路徑:
• 直接使用 remote_htlc 簽名
• 需要 CLTV 時間鎖過期 HTLC 二級交易
HTLC-Success 和 HTLC-Timeout 交易: 為什麼需要二級交易: 問題: • HTLC 輸出需要被領取 • 但直接花費可能繞過撤銷機制 • 需要強制經過延遲 解決方案: • HTLC 輸出先發送到 HTLC-success/timeout 交易 • 這些交易的輸出有 to_self_delay • 給對方時間發現作弊並撤銷 HTLC-Success 交易結構: 輸入: 承諾交易的 received HTLC 輸出 witness: 0 <remotehtlcsig> <localhtlcsig> <payment_preimage> 輸出: 延遲輸出(to_self_delay 後可花費) 腳本與 to_local 輸出相同 HTLC-Timeout 交易結構: 輸入: 承諾交易的 offered HTLC 輸出 witness: 0 <remotehtlcsig> <localhtlcsig> <> locktime: cltv_expiry 輸出: 延遲輸出(to_self_delay 後可花費)
金鑰推導
HTLC 相關金鑰推導:
每個承諾使用不同金鑰:
基於 per_commitment_point 推導:
local_htlcpubkey = local_htlc_basepoint
+ SHA256(per_commitment_point ||
local_htlc_basepoint) * G
remote_htlcpubkey = remote_htlc_basepoint
+ SHA256(per_commitment_point ||
remote_htlc_basepoint) * G
撤銷金鑰:
revocationpubkey =
revocation_basepoint * SHA256(
revocation_basepoint || per_commitment_point
)
+ per_commitment_point * SHA256(
per_commitment_point || revocation_basepoint
)
只有在揭露 per_commitment_secret 後,
對方才能計算出完整的撤銷私鑰 Anchor HTLC
Anchor Outputs 對 HTLC 的影響: 原始 HTLC 問題: HTLC 交易費用在創建時固定 如果鏈上費用上漲,交易可能長時間不確認 可能導致資金被鎖定 Anchor HTLC 改進: 1. HTLC 交易輸入添加 1 CSV delay 防止 HTLC 交易在承諾交易確認前廣播 2. 可以使用 CPFP 加速 花費 HTLC 交易輸出來提高有效費率 3. Zero-fee HTLC(option_anchors_zero_fee_htlc_tx) HTLC 交易本身零費用 完全依賴 CPFP Zero-fee HTLC 腳本變化: # HTLC-success/timeout 輸入添加: OP_1 OP_CHECKSEQUENCEVERIFY OP_DROP # 在腳本開頭,強制 1 個區塊延遲
腳本大小
HTLC 腳本相對複雜,增加了交易權重。 這就是為什麼有最大 HTLC 數量限制。
灰塵限制
HTLC 金額必須高於灰塵限制, 否則創建的輸出會被網路拒絕。
Taproot 改進: Simple Taproot Channels 使用 Tapscript,減少腳本大小並提高隱私。 正常路徑使用 key path,只有爭議時才暴露腳本。
相關資源
- • BOLT 3 Transactions
- • HTLC 概述
- • 承諾交易
下一步: 了解 承諾交易 如何組織這些 HTLC 輸出。
已複製連結