Script
比特幣腳本是否支持嵌套的 IF(OP_IF 或 OP_NOTIF 相互嵌入)?
例如我們可以將以下程式碼轉換為腳本嗎?
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
(正確的?)如果是,那麼:
嵌套 IF 的深度是否有任何限制?
有沒有我可以查看的範例(原始字節/十六進制)?
比特幣腳本是否支持嵌套 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