术语表 /协议与升级
Tapscript
- Tapscript 是什么?
- Tapscript 是在 Taproot 脚本路径花费中运行的比特币脚本版本,采用 Schnorr 签名,没有操作码数量上限,并以签名预算取代原有的计数器。
规定于 BIP-342。
BIP-342对其作出定义,叶子版本字节0xc0 将 taptree 的某个分支标记为 tapscript,而不是日后另行设计的其他脚本。与其他场景中使用的脚本语言相比,它取消了201个非推入操作的限制和10,000字节的脚本大小上限,并禁用了 OP_CHECKMULTISIG。如果您通过披露脚本来花费 Taproot 币,该脚本使用的就是这种语言。
运作方式
tapscript 花费会在见证栈上向网络提交三样内容:脚本所需的参数、脚本本身,以及证明该脚本属于此地址的控制块。
最先改变的是签名验证。OP_CHECKSIG 和 OP_CHECKSIGVERIFY 现在要求一个32字节的 x-only 公钥和一个64字节的 Schnorr 签名;如果附加了非默认的 sighash 类型,则签名为65字节。OP_CHECKMULTISIG 和 OP_CHECKMULTISIGVERIFY 会直接失败,由 OP_CHECKSIGADD 取而代之。
其次改变的是资源计量,这部分影响最为实际。旧的计数器,即每个脚本201个操作和全局签名操作(sigop)总数,已经取消。取而代之的是,每个输入都有一个验证预算,起始值为50个权重单位加上其自身见证数据的大小,每次成功的签名验证都会从中扣除50。验证工作要用字节来换取,这比固定计数更清晰,也意味着一个脚本可以包含任意数量的密钥,只要您愿意为此付费。
为日后的升级留下了两扇门。操作码80、98、126至129、131至134、137、138、141、142、149至153以及187至254变为 OP_SUCCESS:只要其中任何一个出现在脚本的任何位置,哪怕是在永远不会执行的分支中,脚本都会立即成功。长度不是32字节的公钥会被视为未知密钥类型并通过验证。这两条规则使日后的软分叉无需硬分叉即可赋予它们实际行为。保持不变的是单个栈元素520字节的上限和1,000个元素的栈限制。
在哪里会遇到它
只要 Taproot 输出以较为复杂的方式花费,即披露某个分支而不是用聚合密钥签名,就会用到 tapscript。
最大的实际用户是数据存储。ordinals 铭文是一个 tapscript 封装,内容在 OP_FALSE OP_IF 与 OP_ENDIF 之间以每次520字节的方式推入,它之所以以这种形式存在,正是因为 tapscript 取消了10,000字节的脚本限制,并在其背后提供了见证折扣。无论您如何看待这种做法,大多数人正是因此在不知情的情况下见过 tapscript 花费。
更贴近持币者的用途则低调得多。带时间锁的恢复分支、担保托管的备用条件以及闪电网络较新的通道脚本,都以 tapscript 叶子的形式存在,Bitcoin Core 可以在 tr() 描述符中通过 Miniscript 构建并签署它们。
Tapscript vs 比特币脚本
比特币脚本是一个系列,tapscript 是其中的一员。网络上同时有三个脚本版本在运行:传统脚本语言、SegWit 版本0的脚本语言和 tapscript,节点根据被花费的输出来选择使用哪一个,而不是依据脚本本身的任何内容。
当您从教程中复制脚本时,这一点很重要。用 OP_CHECKMULTISIG 编写的三取二脚本在 P2WSH 输出中有效,在 taptree 叶子中则无效。推入4,000字节的脚本,在 P2WSH 见证脚本中超出共识限制,而在 tapscript 中则没有问题。页面上的操作码相同,底层的规则却不同。