术语表 /协议与升级
OP_CAT
- OP_CAT 是什么?
- OP_CAT 将脚本堆栈顶部的两个元素合并为一个,这一操作已被中本聪于2010年禁用,BIP-347提议在 tapscript 中恢复它。
规定于 BIP-347。
拼接听起来简单,其实不然。借助它,脚本可以用压入堆栈的若干片段(每段不超过520字节)重新拼出一笔交易的签名哈希,再用普通的签名检查来校验该哈希。一个因危险而被关闭的操作码,就这样成了契约(covenant)讨论清单上最受关注的一项。
运作方式
状态: 自2010年8月起被禁用,当时脚本引擎在一次防御性清理中关闭了一批字符串和算术操作码。BIP-347提议仅在 tapscript 中重新启用它。它尚未在主网上激活。
这一操作本身只有一行:弹出两个元素,压入它们首尾相接后的字节。它在2010年之所以危险,是因为没有任何规则限制堆栈元素可以增长到多大。把一个元素与自身拼接会使其大小翻倍,因此一小段由压入和拼接组成的循环就能把几个字节膨胀到数 GB,耗尽节点的内存。现代的引擎对任何单个堆栈元素设有520字节的硬性上限,所以当结果会超出该上限时,BIP-347直接让该操作失败,旧的攻击方式随之消失。
编号上有一个特殊之处,使这次恢复格外干净。OP_CAT 是操作码126。BIP-342定义 tapscript 时,将操作码126至129等声明为 OP_SUCCESS:脚本一旦遇到其中之一,便立即成功。因此旧节点本来就会接受任何包含字节126的 tapscript,而不会执行它。把它重新定义为拼接,只是收窄了这些节点原本允许的范围,所以这一改动属于软分叉,而不是链分裂。
拼接所能解锁的功能与它的体量不成比例。能够构造字节串的脚本,可以验证默克尔证明,检查由哈希而非椭圆曲线构成的 Lamport 或 Winternitz 签名,还可以迫使签名使用固定的随机数,使签名方程本身向脚本暴露花费交易。最后这个技巧,正是让 OP_CAT 在没有任何契约专用操作码的情况下成为通用契约工具的原因。
在哪里会遇到它
OP_CAT 完全不在比特币上运行。它确实运行的地方,是复制了比特币脚本引擎、随后撤销了2010年那一决定的侧链和测试网络。
Elements(因此也包括 Liquid)已启用该操作码,这就是已发布的契约演示大多针对 Liquid 而非比特币编写的原因。载有 BIP-347规则的自定义 signet 是另一个场所,它们的存在是为了让开发者在请求任何人修改共识之前,先把这一功能构建出来。
对购买或持有比特币的人来说,实际内容很简短:无论 OP_CAT 是否激活,您的钱包、地址和备份都不会有任何变化。值得了解这个名称,是因为它处于一场真实分歧的中心,即比特币应具备多大程度的可编程性;还因为面向量子计算机时代的基于哈希的签名提议,往往要经由它来实现。