有人可以解釋如何贖回 HTLC 嗎?
我正在看閃電 rfc 中的 Bolt 3。我的問題是關於如何贖回 HTLC。範例 HTLC 腳本供參考:
# To remote node with revocation key 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 # To local node via HTLC-timeout transaction (timelocked). OP_DROP 2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG OP_ELSE # To remote node with preimage. OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY OP_CHECKSIG OP_ENDIF OP_ENDIF
我的理解是,它可以通過兩種方式贖回。如果撤銷秘密已知,則可以進行第一種方式。
<revocation_sig> <revocationpubkey>
revocationpubkey 將產生正確的雜湊,OP_EQUAL 將返回“1”,腳本進入 OP_IF,revocation_sig 將對 OP_CHECKSIG 有效。
第二種方式涉及
<remotehtlcsig> <payment_preimage>
有人可以解釋這如何滿足腳本嗎?例如,OP_SWAP 做什麼或何時通過 OP_NOTIF/OP_ELSE?
可以通過三種方式贖回提供的 HTLC 輸出:使用吊銷公鑰進行吊銷(您提到的範例),使用有效的支付原像贖回或在超時後返回本地節點。
由遠端節點使用有效的原像兌換:
堆棧開始於
<remotehtlcsig> <payment_preimage>
由於
HASH160
of<payment_preimage>
不等於HASH160
ofrevocationpubkey
,所以觸發外部 ELSE 語句
<remote_htlcpubkey>
被推入堆棧。堆棧現在是<remotehtlcsig> <payment_preimage> <remote_htlcpubkey>
.
OP_SWAP
被壓入堆棧,交換堆棧上的頂部兩項。堆棧現在
<remotehtlcsig> <remote_htlcpubkey> <payment_preimage>
OP_SIZE 32 OP_EQUAL
驗證payment_preimage
是 32 字節。由於
payment_preimage
是 32 字節,它會輸出 1。因此OP_NOTIF
不會觸發,因此OP_ELSE
會觸發語句。
OP_NOTIF
被觸發是堆棧上的值為0OP_ELSE
如果前面的 , 則觸發OP_IF
,OP_NOTIF
並且OP_ELSE
不執行。棧還在
<remotehtlcsig> <remote_htlcpubkey> <payment_preimage>
將
OP_HASH160
散列paymentpreimage
. 由於支付雜湊是SHA256
支付原像,我們需要對其進行雜湊處理,RIPEMD160
使其等於HASH160
.paymentpreimage
如果雜湊匹配,那麼堆棧將是
<remotehtlcsig> <remote_htlcpubkey> OP_CHECKSIG
如果簽名匹配,
remote_htlcpubkey
則 1 將返回到堆棧,並且此提供的 HTLC 輸出被遠端節點成功使用。本地節點超時後贖回:
- 為了觸發 HTLC 超時條件,本地節點將使用見證:
0 <remotehtlcsig> <localhtlcsig> 0
- 堆棧開始於
0 <remotehtlcsig> <localhtlcsig> 0
- 由於
HASH160
of0
不等於HASH160
ofrevocationpubkey
,所以觸發外部 ELSE 語句<remote_htlcpubkey>
被推入堆棧。堆棧現在是:0 <remotehtlcsig> <localhtlcsig> 0 <remote_htlcpubkey>
OP_SWAP
交換棧頂的兩項。堆棧現在是:0 <remotehtlcsig> <localhtlcsig> <remote_htlcpubkey> 0
- 由於大小
0
不是 32 字節,它將在堆棧頂部返回 0。這會觸發OP_NOTIF
語句。堆棧仍然是:0 <remotehtlcsig> <localhtlcsig> <remote_htlcpubkey> 0
OP_DROP
丟棄堆棧上的頂部項目,即0
. 堆棧現在是:0 <remotehtlcsig> <localhtlcsig> <remote_htlcpubkey>
2
被推入堆棧。堆棧是0 <remotehtlcsig> <localhtlcsig> <remote_htlcpubkey> 2
OP_SWAP
交換 stac 上的前兩個項目。堆棧是:0 <remotehtlcsig> <localhtlcsig> 2 <remote_htlcpubkey>
<local_htlcpubkey> 2 OP_CHECKMULTISIG
被推入堆棧。堆棧是這樣的0 <remotehtlcsig> <localhtlcsig> 2 <remote_htlcpubkey> <local_htlcpubkey> 2 OP_CHECKMULTISIG
。- 以上是一個多重簽名輸出,只能使用來自本地和遠端密鑰的有效簽名。添加 HTLC 時會交換這些密鑰。
to_self_delay
使用超時事務將上述事務的輸出發送到本地節點。