比特币脚本设计的初衷是为了确保交易的安全和可靠,同时保持简洁和高效。因此,在目前的比特币脚本中,只能限制解锁的条件,而无法进一步限制UTXO的进一步使用。为了实现Covenants限制条款,需要对比特币脚本进行改进和扩展。
Covenants限制条款的设计可以分为通用型和专用型。通用型的设计可以适用于多种应用场景,而专用型的设计则针对特定的应用需求进行定制。
目前已经有一些主流的限制条款设计,包括OP_CAT、OP_CTV、APO、OP_VAULT等。这些设计通过不同的方式实现了限制条款的功能。
其中,OP_CAT是一种基于操作码的限制条款设计,可以实现限制UTXO的花费,从而实现类似智能合约的效果。OP_CTV是一种基于操作码的限制条款设计,可以实现交易花费前的时间限制。APO是一种基于签名的限制条款设计,可以实现限制UTXO的进一步花费。而OP_VAULT是一种专用型的限制条款设计,可以实现保管库类应用的功能。
限制条款的设计可以为比特币带来更多的可编程性和应用场景。例如,可以用于保障Staking的惩罚、拥堵控制、保管库、状态通道等。这些应用场景可以通过限制条款的设计来实现更安全、灵活和高效的交易规则。
总之,Covenants限制条款是一种能够给比特币交易设置条件的机制。它可以实现限制UTXO的进一步使用,从而实现更多的可编程性和应用场景。通过不同的设计方式和技术实现,限制条款可以为比特币带来更多的功能和扩展性。比特币脚本无法读取交易自身的内容,即交易的「内省」(introspection)。
如果我们可以实现交易的内省——检查交易的任何内容(包括输出),那么就可以实现限制条款了。
因此限制条款的设计思路也主要围绕在如何实现内省上。
基于操作码 vs 基于签名
最简单粗暴的想法是,增加一个或多个操作码(即一个操作码+多种参数,或多个不同功能的操作码),直接读取交易的内容。这个也就是基于操作码的思路。
而另外一种思路是,可以不在脚本中直接读取和检查交易自身的内容,而是可以利用交易内容的哈希——如果已经对这个哈希进行了签名,那么只要在脚本里改造例如 OP_CHECKSIG 等来实现对这个签名的检查,就可以间接的实现交易内省及限制条款了。这个思路就是基于签名的设计方式。主要包括 APO 及 OP_CSFS 等。
APO
SIGHASH_ANYPREVOUT(APO)是提议中的一种比特币签名方式。签名的最简单的方式是对交易的输入输出都承诺,但比特币还有更为灵活的方式,即 SIGHASH,选择性地对一笔交易中的输入或输出进行承诺。
目前 SIGHASH 及其组合对交易输入输出的签名范围(来源《Mastering Bitcoin, 2nd》
如上图所示,除了适用到全部数据的 ALL 之外,NONE 的签名方式是只适用到所有输入,而不用于输出;SINGLE 是在此基础上,只对适用到相同输入序号的输出。另外,SIGHASH 还可以组合,叠加了 ANYONECANPAY 修饰符后,只适用于一笔输入。
而 APO 的 SIGHASH 则是只对输出签名,而不对输入部分签名。这也就意味着,用 APO 方式签名之后的交易,可以在之后附加到任何一个满足条件的 UTXO 上。
这种灵活性是 APO 实现限制条款的理论基础:
可以预先创建一笔或多笔交易
通过这些交易的信息构建出一个只能求出一个签名的公钥
这样任何发送到该公钥地址上的资产都只能通过预先创建的交易来花费
值得注意的是,因为这个公钥没有对应的私钥,所以可以确保这些资产只能通过预先创建的交易来花费。那么,我们就可以在预先创建的这些交易中规定资产的去向,从而实现限制条款。
我们可以进一步通过对比以太坊的智能合约来理解:通过智能合约我们可以实现的也是只有通过一定的条件,才能从合约地址中取款,而非靠一个 EOA 签名就任意花费。从这一点来讲,比特币通过签名机制的改进就可以实现这种效果。
但上述过程中的问题在于计算时存在循环依赖,因为需要知道输入的内容来预签并创建交易。
APO 以及 SIGHASH_NOINPUT 实现这种签名方式的意义在于可以解决这种循环依赖问题,在计算时只需要知道(指定)交易的全部输出即可。
OP_CTV
OP_CHECKTEMPLATEVERIFY (CTV),即 BIP-119,采用了改进Opcode的方式。它将 commitment hash 作为参数,并要求任何执行操作码的交易都包含一组与该承诺匹配的输出。通过CTV,将允许比特币用户限制他们使用比特币的方式。
该提案最初以OP_CHECKOUTPUTSHASHVERIFY(COSHV)的名义推出,并且早期侧重于创建拥塞控制交易的能力,因此对该提案的批评也集中在该方案不够通用、过于具体地针对拥塞控制用例。
在上文提到的拥堵控制用例中,发送者 Alice 可以创建 10 个输出并对这 10个输出进行哈希,并使用生成的摘要来创建一个包含 COSHV 的 tapleaf 脚本。Alice 还可以使用参与者的公钥来形成 Taproot 内部密钥,以允许他们在不泄露 Taproot 脚本路径的情况下合作支出。
然后,Alice 会给每个接收者一份所有 10 个输出的副本,以便他们每个人都验证 Alice 的设置交易。当他们以后想要花费这笔付款时,他们中的任何一个都可以创建一个包含承诺输出的交易。
在整个过程中,在 Alice 创建并发送设置交易时,Alice 可以通过现有的异步通信方法(如电子邮件或云驱动器)发送这 10 个输出副本。这意味着,接收者不需要在线,也不需要相互交互。
(来源:https://bitcoinops.org/en/newsletters/2019/05/29/#proposed-transaction-output-commitments)
和 APO 类似,地址也可根据支出条件来构建,可以用不同的方式来制作「锁」,包括:增加其他的 key、时间锁、可组合逻辑。
(来源:https://twitter.com/OwenKemeys/status/1741575353716326835)
CTV 在此基础上提出了可以检查经过 hash 后的花费交易是否与定义的匹配,即将交易数据作为开「锁」的密钥。
我们可以将上面 10 个接收者的例子继续延伸,接收方可进一步将其地址密钥设置为已签名但未广播的 tx 发送给下一批接收方地址,以此类推,形成一个如下图所示的树状结构。Alice 在链上只用1 utxo 的区块空间就可以构造一个涉及多个用户的账户余额变更。
来源:https://twitter.com/OwenKemeys/status/1741575353716326835
而如果其中一个叶子是闪电通道、是cold storage、是其他支付路径呢?那么这棵树将从单维多层的支出树扩展至多维多层次的支出树,能支持的场景将更为丰富和灵活。
来源:https://twitter.com/OwenKemeys/status/1741575353716326835
CTV 自提出以来,经历了2019年从COSHV更名、在2020年被分配了BIP-119,并出现用于创建支持CTV合约的编程语言Sapio,在22、23年得到了社区很多讨论、更新,以及对其激活方案的争论,目前仍是社区讨论比较多的一个软分叉升级提案之一。
OP_CAT
OP_CAT 如开篇所介绍的,也是一个目前非常受关注的升级提案,实现的功能对堆栈中的两个元素进行拼接(concatenate)。虽然看上去很简单,但 OP_CAT 可以很灵活的在脚本中实现很多功能。
最直接的例子就是对于 merkle 树相关的操作。Merkle 树可以理解为两个元素先拼接,再进行 hash。目前比特币脚本里有 OP_SHA256 等 hash 的操作码,所以如果能用 OP_CAT 实现对两个元素拼接,就可以在脚本中实现 merkle 树的验证功能,也就在一定程度上具备了轻客户端验证的能力。
另外的实现基础还包括对于 Schnorr 签名的增强:可以对脚本的花费签名条件设置为用户的公钥和公开 nonce 的拼接;之后如果签名者如果想要另签一个交易将这笔资金花费到其他地方,就不得不使用同样的 nonce 而导致私钥泄露。也就是通过 OP_CAT 实现了对 nonce 的承诺,进而确保已签名交易的有效性。
OP_CAT 的其他的应用场景还包括:Bistream、树形签名、抗量子的 Lamport 签名、保管库等等。
OP_CAT 本身并不是一个新的功能,它曾在比特币最早期版本中存在过,不过由于可能导致被攻击所利用而在2010年开始被禁用。例如,重复使用 OP_DUP 和 OP_CAT 就可以很容易的让全节点在处理此类脚本时堆栈爆炸,参考这个 demo。
但现在重新启用 OP_CAT 不会发生前面提到的堆栈爆炸问题么?因为当前的 OP_CAT 提案只涉及到在 tapscript 中启用,而 tapscript 限定了每个堆栈元素不超过520字节,所以不会产生以前的堆栈爆炸问题。还有一些开发者认为中本聪直接禁用 OP_CAT 可能过于严苛。但由于 OP_CAT 的灵活性,可能确实一些会导致漏洞的应用场景在当前无法穷尽。
所以综合了应用场景和潜在风险等,OP_CAT 最近受到很多关注,也有过 PR review,是当前最热门的升级提议之一。
结语
「自律带来自由」,从上面的介绍可以看到,限制条款可以直接在比特币脚本中实现对交易进一步花费的限定,从而实现类似智能合约效果的交易规则。相比于 BitVM 等链外方式,这种编程方式可以更为原生的在比特币上验证,同时也可以改进主链上的应用(拥堵控制)、链外应用(状态通道)以及其他的新的应用方向(staking 惩罚等)。
限制条款的实现技术如果能再结合一些底层的升级,会进一步释放可编程性的潜力。例如,最近在 review 中的64位运算符的提案,就可以进一步与提议的 OP_TLUV 或其他的限制条款结合,可以基于交易输出的聪的数量来进行编程。
但限制条款也可能会导致一些计划外的滥用或漏洞,因此社区对此也比较谨慎。另外,限制条款的升级也需要涉及到共识规则的软分叉升级。鉴于 taproot 升级时的情形,限制条款相关的升级可能也需要假以时日来完成。