Script

比特幣腳本是否支持嵌套的 IF(OP_IF 或 OP_NOTIF 相互嵌入)?

  • October 8, 2019

例如我們可以將以下程式碼轉換為腳本嗎?

if(bool_1)
{
   FOO1();
   if(!bool_2)
   {
       FOO2();
   }
   else
   {
       BAR1();
       if(bool_3)
       {
           BAR2();
       }
       BAR3();
   }
}
else
{
   FOOBAR();
}

<push> <push> <push> OP_IF OP_FOO1 OP_NOTIF OP_FOO2 OP_ELSE OP_BAR1 OP_IF OP_BAR2 OP_ENDIF OP_BAR3 OP_ENDIF OP_FOOBAR OP_ENDIF(正確的?)

如果是,那麼:

  1. 嵌套 IF 的深度是否有任何限制?

  2. 有沒有我可以查看的範例(原始字節/十六進制)?

比特幣腳本是否支持嵌套 ifs(OP_IF OP_NOTIF 相互之間)?

是的,比特幣支持嵌套的 IF/ELSE。事實上,我們在添加 HTLC 轉發付款時一直使用閃電網路中的嵌套 IF。

嵌套 if 的深度是否有任何限制?

沒有明確的規則規定嵌套的 IF 可以走多遠,但腳本本身有一些限制:

  • 可推送到堆棧的最大字節數應小於 520 字節
  • 每個腳本的最大操作數限制為 201
  • 腳本的最大大小為 10,000 字節
  • 腳本解釋器堆棧上的最大值數為 1,000 字節

有沒有我可以查看的範例(原始字節/十六進制)?

正如我之前提到的,在閃電網路實現中添加 HTLC 時,我們一直使用嵌套的 IF。以下是為對等方提供的 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

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