知识库详情
知识库

以“词条释义”的形式对比特币区块链技术中经常涉及的术语及基本概念进行专业化的阐释和解读。

流控制脚本(条件语句)
返回上级
BSV区块链编辑 2022-04-14 18:20 324

在比特币脚本中使用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
脚本
False Return
脚本
Pushdata操作码
比特币脚本操作码
R-Puzzle脚本
OP_CHECKSIG
流控制脚本(条件语句)
OP_CODESEPARATOR
OP_RETURN