去年 10 月,ZEROsync 的 Robin LInus 以 BitVM 的形式投下了一颗炸弹。 对比特币最长期的批评之一是,不可能制作任意程序来控制资金的支出或锁定方式。 比特币的脚本语言的可编程性非常有限,可用的原语也非常有限。 您可以检查签名,可以向某些内容添加时间锁,可以通过一些简单的方式操作数据,但仅此而已。
您可以对比特币 UTXO 进行编程,要求进行签名检查、时间锁定验证等。但您不能对其进行编程,以根据任意条件进行解锁。 Robin 对 BitVM 的见解是计算领域的一个单一原语 可以 在比特币脚本中强制执行:与非门,物理/电气层面计算的基本原语之一。 每一种可能的计算都可以用 NAND 门来构建。
由于使用 OP_BOOLAND 和 OP_NOT 的巧妙技巧,脚本实际上可以验证 NAND 门。 OP_BOOLAND 是 AND 运算,与 NAND 相反。 OP_NOT 采用二进制 1 或 0 值并将其反转。 这使得您可以直接在脚本中实际执行单个 NAND 操作。 与散列锁相结合,可以制作一个 NAND 门脚本,其中每个输入和输出字段都有两个可能的散列锁来“解锁”该支出路径,每个散列锁将 1 或 0 推入堆栈以执行 NAND 操作。 每个脚本还有一个路径,如果您可以透露 两个都 将原像转换为一位值,您可以立即领取资金。 这样一来,一旦有人决定向 NAND 门输入什么内容,他们就无法在不损失金钱的情况下改变主意。
大量的 NAND 门脚本都可以被压缩到主根树中,一旦有人提交链外的位值以输入到该计算中,另一方就可以在计算中的任何单个步骤上挑战他们,以证明它是在链上正确执行。 每个“挑战”都允许被挑战的一方证明各个门的计算是正确的,否则另一方可以在时间锁定后索取资金。 如此反复,如果计算出现争议,可以保证作弊方最终会被抓住并损失资金。
局限性
BitVM 的主要限制是只有参与创建 BitVM 合约的人才能参与,而且角色非常有限。 有证明者,断言计算如何在链外发生的人,以及验证者,如果证明者没有完成链外计算或试图在链上完成计算,则验证者可以挑战计算并强制其在链上得到证明。对结果撒谎。
设计 BitVM 的原因之一是建立与侧链或其他系统的双向挂钩。 该方案在该用例中提供了一个非常强大的原语,能够根据任意计算的正确性实际强制向一方或另一方提供资金,即根据侧链规则检查转出是否有效。 问题是,只有持有 BitVM UTXO 密钥的人才能真正说“嘿,你在作弊!” 当有人存在时,并参与挑战协议。 这最终使系统仍然值得信赖。
另一个限制是质询响应协议可能会很长。 如果有人意识到计算的结果将导致他们赔钱并且他们停止响应,验证者必须基本上猜测单个 NAND 门在计算中的位置,证明者必须位于该位置并向验证者揭示两个原像。位将为验证者提供资金。 在该特定门在链上受到挑战之前,证明者仍然可以正确响应挑战并将其拖出。 这可能非常耗时且效率低下。
自最初的提案允许多个验证者与证明者一起存在于系统中以来,对此设计进行了一些改进,以创建 1-of-n 信任模型,其中仅需要单个验证者来挑战不诚实的证明者。 然而,这需要并行实例化多个 BitVM 实例才能完成,因此增加了原始两方设计的低效率。
比特虚拟机2
Robin 最近提出了 BitVM 2 的设计方案。该方案试图与原始设计相比进行一些权衡,以减轻其两个主要缺点。 BitVM 2 将质询/响应协议长度从最坏情况下可能多达数十个的不确定交易系列缩短为质询/响应中的两轮。 除此之外,通过使用连接器输出,它允许 任何人 充当验证者。 它不需要有人成为参与建立 BitVM 的成员来挑战不诚实的证明者。
这里的根本转变是不再直接使用脚本 NAND 门来直接实现原始计算跟踪,而是使用它们来实现通用的 SNArk 零知识证明验证器(Robin 从一开始就打算使用 BitVM 实现的核心原语之一) )。 BitVM 2 实例的输入不是将原始输入放入原始计算跟踪中,并在自己的 Tapleaf 脚本中逐个门地运行它,而是简单地将零知识证明输入与计算的断言输出相结合。
除了使用 ZKP 抽象出计算实现之外,tapleaf 脚本还从每个叶子的单个 NAND 门大规模扩展为 ZKP 验证器的整个子功能。 质询响应协议不是基于验证者猜测证明者试图欺骗哪个 NAND 门、选择性地挑战单个门,而是验证者可以根据输入证明整个子功能的输出无效。
就像 BitVM 1 一样,合约是使用预签名交易和分支脚本预先协商的。 与 BitVM 挂钩的资金被发送到 n-of-n 多重签名,该多重签名签署两种可能的执行交易,其中一种不发生挑战,另一种则发生挑战。 为了开始执行合约的过程,证明者发起启动交易。 该启动事务提交到他们声称计算产生的输出值“y”,并包括三个输出:包含在无质询执行事务中的时间锁定输出、连接器输出 A 和连接器输出 B,这两个输出也都是在无挑战交易中花费的。
这里的设计允许任何人作为验证者参与。 连接器输出 A 有第二个可以使用它的预签名交易,即质询交易。 这是一项预先签署的交易,向证明者支付比特币保证金,但连接器输出 A 不足以为其提供资金。 从字面上看,任何人都可以添加自己的输入来为交易提供资金并花费连接器输出 A,这会使证明者的无挑战提款交易无效(存在不需要挑战的输入之一)。
这迫使挑战路径。 连接器输出 B 也可以使用预签名交易(断言交易)花费到整个 BitVM 2 合约中每个子功能的输出。 这需要具有大量数据的大型交易,但请记住,证明者声称所产生的计算已在启动交易中提交的最终输出“y”。 这会创建两个输出。 一个是时间锁定输出,另一个是连接器输出C。这两个输出,除了原来锚定的资金外,全部花在时间锁定后证明者的第二笔成功提现交易中。
连接器输出 C 也可供任何能够证明 BitVM 2 合约中的任何子功能输出产生无效输出的人使用。 这需要非常大的交易,因为证明 BitVM 计算的整个部分不正确所需的脚本非常庞大,但在这个单一交易中,验证者可以通过有效的证明来声明连接器输出中的硬币。 这会使证明者的第二笔提款交易无效并有效地销毁代币。 此时恢复它们的唯一方法是证明者和 全部 最初的 n-of-n 资助多重签名中的验证者都合作恢复它们。 启动交易中的连接器输出 B 也可以在比无挑战撤回更长的超时后花费,以使无挑战和断言交易都无效,从而销毁挂钩的代币。
这将原始 BitVM 提议中强制执行正确合约结果的荒谬交易链减少到最多四笔交易(尽管无可否认是非常庞大的交易),同时在此过程中为 BitVM 2 实例创建了一组验证者任何拥有比特币并为挑战交易提供资金的人。
BitVM 2 最终可能成为 Rollup 浪潮和其他旨在使用 BitVM 作为双向挂钩的 Layer 2 浪潮中的重大突破。 Rollup 的运营商(BitVM 中的证明者)可以使用自己的资金来支付已挂钩系统的用户的提款,并定期从 BitVM 中提取这些资金以补偿自己。 任何 如果用户或利益相关方能够证明运营商没有正确处理所有提款,他们就可以通过烧毁资金来惩罚他们。
值得注意的是,最终 BitVM 2 实例的安全性是由 n-of-n 密钥持有者支持的,即使不参与其中的人仍然可以挑战作为验证者的证明者。 但由于证明者在没有挑战者的情况下可以有效退出,并且任何人都可以为挑战交易提供资金以充当验证者,因此 n-of-n 融资多重签名可以遵循类似于 ZCash 启动的设置和密钥删除仪式提高其安全性。
BitVM 2 最终可能会成为改善使用 BitVM 的双向挂钩的灵活性和信任模型方面的重大突破。 罗宾再次证明了自己是一个真正的巫师。
#BitVM #2开放竞争环境