作者:Simon shieh,来源:MetaTrust Labs
上一篇《比特币生态扩容方案巡礼(1):铭文何去何从》中,我们讨论了热门的铭文生态的技术原理和可能存在的安全问题,并且提到了用递归铭文来实现智能合约的可能性。但是因为Luke对Taproot脚本的限制,递归铭文似乎有了一些障碍,那在比特币网络上实现智能合约有没有其他的可能性呢?
区块链开发商ZeroSync的联合创始人Robin Linus,在2023年10月9日发表了一篇名为“BitVM:在比特币上进行所有运算(BitVM:Compute Anything on Bitcoin)”的论文,其中提出了一个计划,旨在将智能合约引入比特币区块链。
该论文提出了一个非常有趣的思路,可以用taproot完成几乎所有的任意计算,并使用这些计算来验证在比特币链下发生的事情。其中的诀窍是,将所有的逻辑都放在链下,并在其他人断言了不诚实的结果时,在链上用少数几步计算来挑战这些结果。
换句话说,就是将一个Verifier的逻辑放在比特币网络中,利用比特币的强共识安全,成为任何图灵完备运算层的可信第三方,再用Optimistic Rollups 的原理,来实现链外计算结果的验证。
那么怎么实现将一段Verifier的逻辑放在比特币网络中呢?为了和上一节的“铭刻”相呼应,我愿称之为在比特币网络上进行电路“蚀刻”的技术。
在你的电脑或手机内部,电流通过传递一系列的1和0来实现计算机的所有功能。这是通过数以百万计的微小组件——逻辑门(logic gates)——来实现的。这些逻辑门是构成计算机芯片的基本元素。
每个逻辑门都会接收一个或两个“比特(bit)”的信息,每个比特要么是1,要么是0。然后,逻辑门根据设定的规则执行一个简单的逻辑运算,如“与(AND)”、“或(OR)”或“非(NOT)”等操作。这些运算产生的结果同样是一个比特,也是1或0。完成运算后,这个结果又被传递到下一个逻辑门。
这种基于简单逻辑运算的系统产生了启示:即使是最复杂的计算和功能,也都可以通过组合大量简单的逻辑运算来实现。这种逻辑门的组合和协作是现代计算机和电子设备能够执行复杂任务的基础。通过这些基本的逻辑操作,电脑能够处理复杂的算术运算、数据存储、图像渲染等功能。
下图是一个非常特殊的逻辑门,叫做“与非门”(NAND gate),它可以构造任意类型逻辑门电路,当然,它不可能有其它专用类型的门那么高效,但还是能做到的。BitVM的逻辑门电路就由与非门组成。
在现有的比特币脚本上构造与非门(NAND gate)可以通过结合哈希锁和两个可能不太为人所熟知的操作码:OP_BOOLAND和OP_NOT来实现。
首先,哈希锁可以用来创建一个分支脚本,这个脚本可以通过两种方式中的一种来花费:要么满足哈希锁,要么满足哈希锁B。这样,路径A将1输出到堆栈,而路径B将0输出到堆栈。
通过满足特定哈希锁,你可以"解锁"一个比特,这个比特作为我们要构造的NAND门的输入之一。由于你只能满足其中一个路径的要求,所以这种方法只允许用户一次提交一个比特。
与非门的逻辑是接收两个比特作为输入,输出一个比特。如果两个输入比特都是1,则输出0;如果输入是其他组合,则输出1。使用两个哈希锁技巧,可以提交这两个输入,并验证输出是否正确,这就是OP_BOOLAND和OP_NOT的用途所在。
OP_BOOLAND的操作与与非门相反:如果两个输入都是1,则输出1;任何其他输入组合都会产生0。OP_NOT则输出与输入相反的值。因此,通过结合使用这两个操作码,可以在脚本堆栈中取两个输入并进行反和操作。最后,可以使用OP_EQUALVERIFY以及哈希锁技巧来验证断言的输出。如果堆栈中实际的与非操作结果与用户断言的输出不一致,脚本就无法通过验证。
这样,就在比特币脚本中“蚀刻”了与非门电路,实际上是通过比特币脚本来强制执行虚拟的与非门操作。
虽然这个利用Taproot脚本实现电路蚀刻的想法很酷,但是别说像PC那种超大规模电路了,就是要实现任意一组计算,都需要成千上万的与非门电路,那在比特币有限的Taproot脚本空间里,如何覆盖复杂计算呢?
BitVM提出了Taproot脚本树(Taproot Tree)的方法。为了在比特币脚本中实现复杂的计算过程,人们可以通过串联逻辑门来构建计算电路。在这个方案中,哈希锁被用来绑定各个门,从而实现顺序执行的逻辑操作。具体来说,如果一个门的脚本根据不同的哈希原像(哈希明文值)输入产生不同的输出结果C1或C2,那么下一个门会使用与之相匹配的哈希锁值作为其输入。
这种方法可以实现一种惩罚机制,即如果试图谎报前一个门的结果,就只能揭晓另一个哈希锁的原像。这种机制可以用于两个用户之间的交互式计算,其中他们预先同意参与特定的计算任务,然后将计算过程分解成只由与非门组成的电路。他们需要为电路中的每个门选择合适的哈希锁,并将其编码进锁定UTXO的脚本树中。
然后通过多个地址组成一个Taproot地址矩阵,再通过Taproot Tree的方式将逻辑电路蚀刻到一系列树状结构相连的UTXO交易的Taproot脚本中,最终形成一个可以处理一定计算任务的“类合约”逻辑电路。
欺诈挑战是OP(Optimism Rollup)技术的核心(虽然至今都没有真的实现~),思想是在一个batch的交易被批量提交之前,挑战者对认为有错的交易发起欺诈挑战(质押对赌),主网上的Verifier合约会根据状态根在执行后的变化来判断提交者是否作恶,然后分配双方质押的资产。
而在bitVM中,脚本树被设计成两个电路,除了允许证明者提交到一个电路之外,还需要挑战者能够挑战证明者的声明。这可以通过预签名一系列的交易来实现。这些预签名交易通过「挑战 ->应答 ->挑战 ->…」的方式连接。如果某一方停止一段时间后,另外一方就会赢得挑战并回收双方的存款。
上图展示了一系列预先签名的交易:
• 挑战:Vicky (挑战者 / 验证者)在脚本路径中释放一个原像(这些原像只有挑战者知道),用作对证明的挑战;
• 应答:Paul (证明者)执行对应的逻辑门,将资金发回初始的脚本中;
在几轮的查询后可以迅速驳斥任何一个不一致的声明。如果证明者停止在链下与挑战者合作,挑战者就会强制证明者在链上合作:挑战者每解锁一个哈希锁,使得证明者的 UTXO 中的每个 NAND 门对应的 Taproot 叶子节点只有在证明者知道挑战者持有的一个原像时才可以被花费。证明者可以通过揭示其输入和输出来证明给定的 Taproot 叶子节点执行正确。其前提是挑战者通过揭露对应 Tapleaf 的哈希的原像来解锁它,通过二分查找的方式,挑战者可以在经过有限轮(O(logn))的挑战和应答后锁定证明者的错误。
整个过程涉及到多轮交互,以确保合约能够正确结算。挑战者可以不断挑战证明者,直到证明者证实了每个门的正确结果,或者在证明者无法响应挑战的情况下,挑战者可以在特定时间后提取资金。在理想情况下,所有操作都在链下进行,双方协作完成结算,但如果合作破裂,双方可以通过链上的挑战游戏来确保合约得到正确的解决。
这项提议涉及处理和生成的数据量极其庞大。使用的Taproot脚本树可能包含数十亿个叶子节点,而相关的预先签名交易的处理时间可能至少需要几个小时,以确保准确的结算。每个Taproot地址的预设解锁条件执行都需支付矿工费,因此地址组合越多,成本也越大。
这种方案的一个主要限制在于,它只适用于两个参与者之间的交互:一个作为证明者,证明其执行的准确性;另一个作为验证者,挑战前者的声明。虽然未来的研究可能会找到方法让更多参与者加入,但目前看来还没有明确的解决方案。
在合作结算的场景中,所有参与者必须在线,这对于协议的实用性和便利性构成了一定的限制。
在安全性方面,主要有以下几点安全风险:
1、由于成本的限制,必然大量的计算工作要放在链下进行,链下计算就存在中心化服务的一些常见安全风险。
2、大量数据保存在链下,数据可用性和数据安全性也是必须要考虑的风险点
3、对于所蚀刻的电路本身是否存在逻辑漏洞也是一个安全风险点,由于电路的不易读性,需要付出更多的审计成本或形式化验证成本。
Metatrust曾经协助Uniswap进行了全面的形式化验证工作,并在ZK电路审计和形式化验证方面有非常丰富的经验,可以为BitVM生态的安全落地,提供保障。
上两篇的方案都是今年刚火热起来的技术方案,下一篇,我们将介绍一个更加古老,更加具备“正统性”的方案,闪电网络的升级版本——Taproott Assets。