知识库详情
BSV知识库

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

脚本
返回上级
BSV区块链编辑 2022-04-14 18:23 744

比特币使用脚本系统进行交易。与Forth类似,Script是简单的,基于栈的,也是从左至右处理一系列顺序指令。数据被压入栈后,用操作码对栈上的项目执行操作。

与Forth不同的是,单个交易输出中的脚本故意被设计成非图灵完备的,并且没有跳转指令,从而防止形成循环。但是,通过使用链下代理,可以将账本当作自动收报机的纸带,用于存储计算结果和未来的指令,从而构建起图灵完备的流程。

交易输出脚本是由一系列指令组成的谓词,这些指令描述了下一个想要转移脚本中锁定的token的人应当如何解锁它们。典型的P2PKH脚本的脚本需要消费方提供如下两个资料:

  1. 一个公钥,对其进行哈希后,可以产生嵌入在脚本中的目标地址,和
  2. 一个签名,以证明与刚刚提供的公钥对应的私钥的所有权。

要花费已转移的比特币,需要特定的参数,脚本提供了更改这些所需参数的灵活性。例如,我们可以用脚本系统来要求两个私钥,或是多个私钥的组合,甚至可以是需要某个文件并与私钥完全无关的解锁场景。如果消费方提供的解在脚本终止时在栈顶留下非零值,则token将被解锁。

事实上,比特币脚本是由构建区块链的节点所运行的代码来定义的。节点共同商定可供使用的操作码集及其处理方式。纵观比特币的历史,脚本的处理方式发生了许多变化,包括添加新的操作码和从集合中禁用或删除操作码。

检查比特币脚本的节点在脚本评估引擎中处理交易输入。引擎由两个栈组成,它们是:

  • 主栈
  • 替代栈

此外,系统还使用了下标管理系统来跟踪嵌套的If-Loops的深度。

字节向量由主栈和替代栈保存,比特币操作码可以使用它们来处理脚本结果。当被用作数字时,字节向量将被解释为小端可变长度整型,由最有效位决定整数的符号。因此0x81代表-1。0x80是零的另一种表示(所谓的负0)。正0可以由空长度向量或任意长度的十六进制零字符串表示。字节向量被解释为布尔值,其中由零的任何表示来代表False,由非零的任何表示来代表True。

在创世纪升级之前,栈上的字节向量长度不允许超过520字节,但是在无限制的比特币协议中,推入到栈上的数据量仅仅受限于矿工的经济限制。随着mAPI等服务的进一步推广,用户将在如何使用网络方面有更多选择。

虽然pushdata操作码所能推入栈的数据被限制在了4.3GB,但理论上,可以将栈上的多个对象连接起来,从而形成更大的单个数据项进行处理。

在创世纪升级之前,从栈中取出整数型和布尔值的操作码要求它们的长度不超过4个字节,但加法和减法可能会溢出并导致将5个字节的整数型被放入栈中。在2020年初的创世纪升级之后,在协议规则内,节点现在可以自由打包附带了任意大小数据项的交易了。这些改变将可用于脚本中的数学函数。随着时间的推移,网络节点运营商将共同商定适当的数据限制。

关于比特币脚本的更多资料

  1. 比特币脚本中的操作码
  2. 比特币脚本中的数字编码
  3. 带有流程控制的脚本(条件条款)
  4. OP_CODESEPARATOR
  5. OP_RETURN
  6. OP_VER
  7. 复杂脚本示例
脚本
False Return
脚本
Pushdata操作码
比特币脚本操作码
R-Puzzle脚本
OP_CHECKSIG
流控制脚本(条件语句)
OP_CODESEPARATOR
OP_RETURN