# BitVM：图灵完备的 Taproot 智能合约

By [WEB3投研网 公众号同名](https://paragraph.com/@web3rare) · 2023-11-09

---

BitVM \[1\] 是由Robin Linus提出的一个用于表达具有图灵完备性的比特币智能合约的建议。它声称可以在不改变网络共识规则的情况下实现。BitVM的设计类似于乐观Rollups，那么乐观Rollups是如何实现的呢？

![](https://storage.googleapis.com/papyrus_images/12757c4496e241fc0ee021d77dae951cb593cba28ad733921d87a2cbd7c7b7e0.png)

乐观Rollups \[2\] 是一种基于乐观验证的二层扩容方案，它通过使用欺诈证明来避免无效的状态转移。

那么什么是欺诈证明呢？

在乐观Rollups中，默认情况下，状态转移是有效的（EVM维护了一个庞大的状态机）。发布者将交易前状态树的根哈希值以及交易发送到第一层（Layer 1）上，第一层上的智能合约会确认交易前状态树根哈希是否与存储的根哈希一致。然而，第一层上的智能合约不能保证交易过程的正确性。在乐观Rollups中，我们默认这些状态转变是正确的，核心在于有挑战者发起挑战（表明状态的执行存在错误）时，可以通过欺诈证明来证明交易前状态树的根哈希在执行这一组交易之后可以变为新的状态根哈希。

在交易执行过程中没有错误的情况下，乐观Rollups方案相对简单：在第二层（Layer 2）中执行一系列交易，得到新的状态树哈希，并将交易存放到第一层上即可 \[3\]。而在发生挑战的情况下，会进入欺诈证明的流程。欺诈证明的具体流程超出了本文的范围，不再详述。

BitVM采用了类似于Optimistic Rollups的方法。在BitVM中，有两个角色：证明者和验证者。他们将程序编译成一个巨大的二进制电路。证明者将电路提交到一个Taproot地址中，其中每个逻辑门都有一个叶子脚本。同时，证明者和验证者还预签名了一系列交易，以便进行挑战和应答。

在这个过程中，证明者和验证者共享这个二进制电路，并且证明者将其提交到Taproot地址中。然后，在一定的时间范围内执行欺诈证明的一系列操作。

BitVM的基础是比特值承诺（Bit Value Commitment, BVC），它允许证明者将特定位的值设置为0或1。证明者可以在不同的脚本和UTxO中设置变量的值。这是实现BitVM的关键，它通过将运行时分布在多个交易中来扩展比特币虚拟机。

挑战-应答

除了允许证明者提交到一个电路之外，还需要验证者能够挑战证明者的声明。这可以在加载时预签名一系列的交易来实现。这些交易通过\*\*”挑战->应答->挑战->...“\*\*的方式连接。如果某一方停止一段时间后，另外一方就会赢得挑战并回收双方的存款。

![](https://storage.googleapis.com/papyrus_images/51c215e141de7f40b10fef761a8ec78a46d736eea2738307baff407682ba30ad.png)

上图展示了一系列预先签名的交易：

挑战：Vicky （验证者）在脚本路径中释放一个原像（这些原像只有验证者知道），用作对证明的挑战的锁；

应答：Paul （证明者）执行对应的逻辑门，将资金发回初始的脚本中；

在几轮的查询后可以迅速驳斥任何一个不一致的声明。如果证明者停止在链下与验证者合作，验证者就会强制证明者在链上合作：验证者解锁一个哈希锁，使得证明者的 UTxO 中的每个 NAND 门对应的 Taproot 叶子节点只有在证明者知道验证者持有的一个原像时才可以被花费。证明者可以通过揭示其输入和输出来证明给定的 Taproot 叶子节点执行正确。其前提是验证者通过揭露对应 Tapleaf 的哈希的原像来解锁它，通过二分查找的方式，验证者可以在经过有限轮（$O(logn)$）的挑战和应答后锁定证明者的错误。

![](https://storage.googleapis.com/papyrus_images/da30ef81f07ec050de4d23575f98699b79386eb2ecdd89839d4c7f3639573b6d.png)

![](https://storage.googleapis.com/papyrus_images/be67f15cb8c2382184c996e3a84d1addbad6f43021d66fcf66b662979aab50a9.png)

---

*Originally published on [WEB3投研网 公众号同名](https://paragraph.com/@web3rare/bitvm-taproot)*
