Lightning-Network

有人可以解釋如何贖回 HTLC 嗎?

  • December 3, 2019

我正在看閃電 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>

  • 由於HASH160of<payment_preimage>不等於HASH160of revocationpubkey,所以觸發外部 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被觸發是堆棧上的值為0
    • OP_ELSE如果前面的 , 則觸發OP_IFOP_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
  • 由於HASH160of0不等於HASH160of revocationpubkey,所以觸發外部 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使用超時事務將上述事務的輸出發送到本地節點。

引用自:https://bitcoin.stackexchange.com/questions/92087