
在比特币脚本中使用IF/NOTIF句式,来构建多种形式的条件从句。条件从句使用脚本验证引擎中的第三个堆栈来管理嵌套条件,确保嵌套在OP_ELSE条件结果中的OP_ELSE 或 OP_ENDIF 语句不会终止父循环。
OP_IF,OP_NOTIF
如果堆栈顶部的值为TRUE或非零,则OP_IF将执行一组后续操作码,直至出现 OP_ELSE或OP_ENDIF。与之类似,如果堆栈顶部的值为FALSE或零,则OP_NOTIF将执行一组后续操作码,直至出现OP_ELSE或OP_ENDIF。如果后续的条件从句是OP_ELSE,且第一个条件从句成功,则脚本将跳转到原始子句的条件堆栈高度处的OP_ENDIF;如果条件从句失败,脚本将跳转到else之后的操作码。OP_ENDIF被处理后,循环结束。
OP_VERIF,OP_VERNOTIF
注意:在当前的BitcoinSV (BSV)挖矿客户端中,OP_VERIF 和 OP_VERNOTIF已被禁用,在执行脚本时使用它们将导致交易失败。
示例 1
以下示例使用IF、ELSE和ENDIF句式来管理四个可能解锁此输出的ScriptSig。
ScriptSig1: <sig1 > <pk1 > 1 ScriptSig2: <sig2 > <pk2 > 2 ScriptSig3: <sig3 > <pk3 > 3 ScriptSig4: <sigRP > <pkRP>
前三个是带有数字信号的PKH签名,以显示要输入哪个条件循环进行评估。根据出现的数字信号,脚本将输入相关高度的条件子句。每个后续的条件IF语句都嵌套在前一级的else语句中。如果没有数字信号,则脚本将进入第三级的else语句,在该语句中针对R-Puzzle Hash来测试 ScriptSig,并且脚本将退出循环。
DUP 1 EQUAL IF DROP DUP HASH160 <PKH1> EQUALVERIFY CHECKSIG ELSE DUP 2 EQUAL IF DROP DUP HASH160 <PKH2> EQUALVERIFY CHECKSIG ELSE DUP 3 EQUAL IF DROP DUP HASH160 <PKH3> EQUALVERIFY CHECKSIG ELSE OVER 3 SPLIT SWAP DROP 1 SPLIT SWAP SPLIT DROP HASH160 <RPH> EQUALVERIFY CHECKSIG ENDIF ENDIF ENDIF
示例 2
在此示例中,包含了三个可能解锁此输出的ScriptSig。条件从句的入口取决于处理完ScriptSig后堆栈的深度。
ScriptSig1: <SIG> <PK> ScriptSig2: 1 <SIG1> <SIG3> <SIG4> ScriptSig3: <PASSWORD> <SIG6> <PK6>
前两个ScriptSig中的任何一个都在它们自己单独的IF循环中进行评估,这些循环使用RETURN语句退出。如果ScriptSig的堆栈深度不符合其中的任一要求,则它就会进入一个最终评估阶段,做该评估必须拥有另一个签名和备份密码。
DEPTH 2 EQUAL IF DUP HASH160 EQUALVERIFY CHECKSIG RETURN ENDIF DEPTH 4 EQUAL IF <PK1> <PK2> <PK3> <PK4> <PK5> 5 CHECKMULTISIG RETURN ENDIF DUP HASH160 <PKH6> EQUALVERIFY CHECKSIGVERIFY SHA256 <PASSWORDHASH> EQUAL RETURN