OP_CAT
比特币是一个去中心化的电子货币交易系统。系统中的地址,包含多个可以花费的UTXO(Unspent-Transaction-Output)。地址类似于我们日常用的钱包,钱包里有多张钱币(UTXO),每张钱币的面额不同,每个UTXO包含的比特币也不是固定的。
一个交易包含多个输入输出,每个输入指向一个UTXO,每个输出生成一个新的UTXO,输入的UTXO面值之和等于输出UTXO面值之和加上打包交易的矿工费,由此实现货币的流转。每个UTXO生成的时候会创建一个“契约”,比特币被锁定在该契约中,只有指定的私钥才有资格花费这些比特币。
传统上,比特币的这个“契约”能做的事情很少,基本只能限制谁可以花,在多长时间后可以花,无法指定应该怎么花,比如,某个UTXO只能发送到指定的地址(只能用来买指定商品)等。OP_CAT
的重新激活将使得后者成为可能,不仅如此,比特币链上的去中心化金融将成为可能。
什么是 OP_CAT
比特币有自己的基于栈的智能合约语言,OP_CAT
是其中的一个算子/操作符,用来将栈顶的两个元素弹出,合并(Concate)在一起再入栈。所以OP_CAT
实现的功能十分简单,只是实现了两个元素的合并而已。但正是这简单的一小步,使得比特币的智能合约语言的能力有了质的提升。
之所以这么说,是因为现有的比特币合约语言非常原始,故意被设计成了图灵不完备,这样做的原因是为了减少系统被攻击的可能。现有的合约通过椭圆曲线算法来验证交易的合法性。比特币地址本质上是椭圆曲线算法的公钥,该公钥对应的私钥所有者可以花费该地址上的UTXO,具体做法是构造一个花费该UTXO的交易,获得交易的Hash,然后用私钥对交易Hash进行签名,把签名和公钥放入智能合约中,随交易一起广播到比特币链上。矿工在打包该交易的时候,智能合约会通过OP_CHECKSIG
操作符来核查签名的有效性。这时需要已知交易的Hash作为输入,但是这个Hash并不在智能合约中,而是隐含在网络逻辑里的,也就是说,智能合约本身看不到交易本身的信息。
为了实现上述的更加智能的合约,合约里必须要能知道交易的信息,比如输入UTXO,输出UTXO的信息,这样才可以在合约中进行限制。实现的逻辑也很简单,交易构造者直接把交易信息放到合约里就行了,为了实现对某个UTXO的精细约束,我们必须把交易拆分成多个独立的数据,单独放到栈里,这样才可以对栈的单个元素进行约束(比如,把输出UTXO作为栈的一个单独元素,这样我们就可以比较这个元素是否等于某个指定的地址,从而实现限制使用方式的功能)。
但是这个带来了一个问题:如何验证放入的交易信息是准确的,没有伪造?
为了解决这个问题,我们必须要能够对用户放入的交易进行签名验证,如果用户放入的交易和比特币网络得到的交易都能通过签名认证,说明放入的交易就是网络接收到的交易。为了实现这个,我们首先要把人为分开的交易合并到一起,这里就用到了OP_CAT
! 通过OP_CAT
,我们可以得到完整的交易数据,进而可以通过OP_CHECKSIGFROMSTACK
这个操作符来进行交易验证,注意这个操作符和OP_CHECKSIG
不同,它可以验证用户给定的交易数据是否是当前交易,这个操作符目前在比特币网络中也不存在,不过可以通过对椭圆曲线算法的应用在目前的合约语言中实现,具体数学推导可以参考这里。
通过对交易数据的精细约束,我们不仅可以实现复杂契约,还可以实现状态机,比特币二层等等,理论上说,一切在以太坊DEFI上能实现的,都可以在比特币链上实现。
OP_CAT 的一小步,是比特币智能合约的一大步
10多年前,中本聪为了避免DOS攻击在代码中移除了OP_CAT
。多年以后,随着Taproot
对DOS攻击的解决,OP_CAT
的重新激活成了比特币上热议的话题。毫无疑问,OP_CAT
迈出的一小步,将是比特币从交易到金融的巨大转变。对个体以及社会的影响都将是深远的。
Let’s see and play!