原文作者:付少庆、SatoshiLab、万物岛 BTC 工作室
文章精简摘要:
「恢复 OP_CAT」是一个严重误解,提案中有一段重要的话为证:This implementation is inspired by the original implementation of
OP_CAT as it existed in the Bitcoin codebase prior to the commit “misc changes” 4bd188c which disabled it:
比特币亚洲大会上讨论了一个技术相关话题,在比特币的脚本语言中要不要恢复 OP_CAT 操作指令?之后在万物岛 BTC 工作室的上海闭门会议中,大山老师也讨论了相关的问题,鼓励我们工作室的学员来写一篇系统的总结文章。
为什么一个指令的恢复会在业内大会上讨论?它有那么大的重要性吗?这个事情涉及到了哪些问题?相信很多人会有相关的疑问。
1. OP_CAT的基础知识
要了解恢复 OP_CAT 这个问题,我们先了解一些和 OP_CAT 相关的基础知识。在开发语言中,操作码(opcodes)也会称为指令或函数,是构成开发语言的基本组成元素。在本文中我们都称为指令。
1.1. OP_CAT具有什么功能?
在很多开发语言中,连接两个字符串一般多用 concat,所以 OP_CAT 的缩写也应该是来自 concat 这个单词,形成 OP_CAT 的指令。
例 1:java 开发语言中的 concat
String str1 = “Hello”;
String str2 = ” world”; //注意有空格
String str3 = str1.concat(str2);
System.out.println(str3);
输出结果就是 Hello world
例 2:mysql 中的 concat
select CONCAT(”My”,”SQL”)from Result;执行结果就是显示「MySQL」这几个字符。
在高级开发语言中,concat(即字符串拼接)的使用频率非常高,而且在很多情况下也非常重要。例如一些场景:
数据展示与输出:在很多场景下,我们需要将数据以字符串的形式进行展示或输出,比如将不同的数据项连接成一个完整的句子、将数据格式化成特定的字符串形式等等,这时候就需要使用字符串拼接操作。
数据处理与操作:在数据处理与操作中,有时候需要将多个字符串进行拼接以生成新的字符串,比如将多个文件路径拼接成一个完整的路径、将多个 URL 参数拼接成一个完整的 URL 等等,这也是字符串拼接操作的重要应用。
如果比特币的语言是高级语言,毋庸置疑一定会有这个字符连接功能,但比特币的开发语言有些特殊性,所以产生了是否要包含这个指令的争议。比特币的语言是一种逆波兰范式的脚本语言,它是非图灵完备的。比特币脚本指令常见的类型:
关键字:
1. 常数。如:OP_0,OP_FALSE
2. 流程控制。如: OP_IF,OP_NOTIF,OP_ELSE,……
3. 堆栈。如:OP_TOALTSTACK(把输入压入辅堆栈的项部,从主堆栈删除),……
4. 字符串。如:OP_CAT(连接两个字符串,已禁用),OP_SIZE(把栈顶元素的字符串长度压入堆栈(无需弹出元素))
5. 位逻辑。如:OP_AND,OP_OR,OP_XOR
6. 算术逻辑。如:OP_1ADD(输入值加 1),OP_1SUB(输入值减 1)
7. 加密。如:OP_SHA1(输入用 SHA-1 算法 HASH.),OP_CHECKSIG()
8. 伪关键字
9. 保留关键字
比特币脚本指令常见的类型:
脚本:
1. 支付到比特币地址的标准交易(pay-to-pubkey-hash)
2. 标准比特币产生交易(pay-to-pubkey)
3. 可证明的无法花掉/可删除的输出
4. Anyone-Can-Spend 输出
5. 猜谜交易
五个标准类型的交易脚本包括:支付到公钥哈希(P2PKH)、支付到公钥、多重签名(限定最多 15 个密钥)、支付到脚本哈希(P2SH),以及数据输出(OP_RETURN)。
在网址:https://en.bitcoin.it/wiki/Script 中有详细的说明。
1.2. 比特币语言中删除 OP_CAT与其他指令的删减
其实在早期比特币的脚本语言中也是有字符连接的功能的,也就是「OP_CAT」操作码开始是存在的,后来被删除了。在比特币的脚本语言中,OP_CAT 可以实现多个 UTXO 解锁脚本字节串的组合连接处理,可以提升 BTC 主网的可编程特性和计算的复杂性。但由于中本聪对于安全的考虑(也有可能是对稳定性的考虑),在 2010 年 8 月,这个操作码被移出比特币协议。
在比特币的脚本语言中,开始和字符操作相关的指令有很多,在之后大部分都被删除了,删除了 OP_CAT、OP_SUBSTR、OP_LEFT、OP_RIGHT,只保留了 OP_SIZE。如下图所示。


各类互联网应用用户规模和网民使用率
这些主流应用都还没有进入到 Web3.0 的世界。当这些应用进入 Web3.0 时代后,用户的规模和性能要求更高。所以比特币主网承担的任务在未来是非常重,使得一定要用分层结构才能建立起来真正的 Web3.0 世界。那么在比特币主网上面的功能就以简单稳定为主,以服务一层与二层的连接技术为主。我个人主张不要过度使用比特币一层与二层的连接技术,给 Tapscript 一个扩展空间,但不要有太多的功能。
4. 是否恢复 OP_CAT谁有决定权
通过前面的内容,我们知道了这个提案的真实内容,是在 Tapscript 中产生一个类似 OP_CAT 的指令功能,而不是恢复比特币脚本中原来的 OP_CAT。对于这个提案谁有决策权呢?比特币 Core 的开发团队?矿工?生态开发者?社区?
如果我们从利益的角度分析,Tapscript 中产生 OP_CAT 指令会增加比特币主网的可编程性,会产生更多的比特币主网程序和应用,这样就会增加主网上面的手续费。矿工会是最积极的支持者,生态开发者因为增加了开发的可能性也会支持。
比特币 Core 团队怎么考虑?一直以来 Core 团队秉持一种保守风格,会不会同意呢?有很大的不确定性。其实这个事件还牵扯出一个较大问题,对于 Tapscript 的发展,需要制定一套规则,它不同于比特币主网的 BTCScript,决策上是否也要适当宽松一些?比特币的 BIP 协议参考以太坊的 EIP 协议,作一下提案的分级也许是个不错的方法。对每种提案采用不同的审核标准。
通过整理这篇文章,我个人判断这个提案最终会获得通过,不然 Tapscript 的功能就太弱了,也许过程会有些曲折。
在比特币的世界,因为没有权威机构,权利在比特币的世界不是直接影响因素,只有经济因素才会是决定性的影响因素,什么会获得通过最终是由大多数人的利益驱动的。即使 Tapscript 被过度设计了,在使用中也会被经济因素矫正过来。
参考文献1. BIP 草案 420:OP_CAT,https://github.com/bip420/bip420。2. https://en.bitcoin.it/wiki/Script3.《导致比特币再次爆发的新技术发展总结》
本文来自投稿,不代表 BlockBeats 观点。
欢迎加入律动 BlockBeats 官方社群:
Telegram 订阅群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方账号:https://twitter.com/BlockBeatsAsia
