---
title: 开启比特币智能合约的「三把锁」
date: 2019-08-27
draft: false
summary: 从约束、验证和仲裁三个层次理解比特币智能合约的可能边界。
slug: three-locks-of-bitcoin-smart-contracts
aliases:
- /bitcoin-smart-contract/
tags:
- bitcoin
- smart-contract
- layer2
topics:
- bitcoin
- blockchain
type: post
---
本文首发于币信研究院公众号，是李画和我的一个访谈文章，探讨比特币的智能合约。

<!--more-->

*受访者：王渊命（微博：@jolestar）*
*采访 & 撰文：李画（币信研究院特约研究员）*
本文约5000字，阅读全文需约10分钟。

随着新的指令和算法的引入，比特币的多签功能正在变得强大。多签不仅是指多个人共同签名，保管一笔比特币资产；它还可以是多个条件「共同签名」，通过这些条件锁定和解锁比特币。

用条件决定资产的使用，其实就是合约的功能。当这个合约可以被代码表达并无需信任地自动执行时，我们称其为智能合约。因此前比特币核心主管维护人员Gavin Andresen说：比特币的多签功能已经可以完成以太坊上大部分有用的功能。

那么，比特币是如何实现智能合约的？比特币与以太坊的智能合约又有何区别？我们采访了对区块链和智能合约有着深刻认知的技术写作者王渊命。

![img](./smart-contract.jpeg)

### 一、比特币是否需要智能合约

**Q：比特币需要智能合约吗？**

A：需要。智能合约能够为比特币系统带来逻辑可扩展性，在不改变现有基础设施、基础架构的情况下，为系统增加新的功能，从而增强系统的能力。扩展性不只是指TPS、容量和存储等方面。

智能合约的另一个作用是它能实现具有约束力的合同功能。它是一个定义各方权利和义务关系的协议，只不过是数字化的，且它的执行机制不依赖于现有的法律体系。 

**Q：比特币作为一种加密货币，为什么需要合同功能？简单交易它不就可以吗？**

A：并没有所谓的简单交易，你为什么给我转账？无论是购物，或者是发工资或其他，背后其实都依赖于一个合同。在现实生活中，这个合同的执行是依赖于司法体系的，一方违约，另外一方可以起诉。只有货币而没有司法体系的约束，是没办法完成任何交易的。

那么在全球化的加密货币世界里，该如何构建这种合同的约束力？依赖于智能合约。智能合约将规则/法律通过代码表达并执行，用代码构建出一套约束力体系。 

**Q：比特币需要DeFi吗？**

A：广义来说，所有的加密货币都属于 DeFi 的应用领域，因为 DeFi 的第一步是有货币。有了货币后，可以围绕货币定义怎么跟其它资产或者货币交换，如何借贷等等，加密货币里的金融相对法币体系的金融还比较早期，可探索的路还很长。

### 二、比特币如何实现智能合约

**Q：为什么说比特币系统是支持智能合约的？**

A：合约就是当我跟你做一个交易时，它能保证这个交易达成，也就是说它能表达某种条件，当条件满足时我才给你付款。能把这个条件表达出来，就可以认为它有智能合约表达能力。比特币的脚本（Script）是有智能合约表达能力的，可以把比特币的脚本理解成是一种智能合约。

那为什么比特币要通过脚本而不是把功能固化在链上？因为如果固化在链上，当用户/开发者需要某个功能时，就需要比特币开发团队去实现，然后再发布，然后推动整个链的升级，但区块链升级是个复杂的事情，弄不好就分叉了。

所以比特币只提供最基础的一些素材，相当于给你提供面粉，但菜怎么做留给你自己，你可以利用这些素材，根据自己的场景组合出新的东西，不需要依赖于主链的升级。这也就是我前边讲过的通过智能合约来实现逻辑可扩展性。未来是不确定的，智能合约可以看成是一种应对不确定性的策略。

上边是比特币系统本身对智能合约的支持，它是通过脚本实现的；还有另一类支持/实现智能合约的方式，就是通过比特币系统的侧链，在侧链上实现智能合约的方法跟在以太坊上类似。

**Q：比特币系统是如何通过脚本实现智能合约的？**

A：以太坊上的智能合约是直接用代码表达清楚的，什么条件下执行 A，什么条件下执行 B 等等，比特币上的智能合约不像以太坊那样直白。

比特币上所有的智能合约都要被转换成加锁、解锁的机制来实现，也就是说在脚本中，通过「key」或者是「哈希条件」把资产锁定，再加上一个「时间锁」（TimeLock）。无论是闪电网络还是Arwen协议，都是这样的机制，比特币将会推出的Schnoor签名之类的，也都是为了更好地去表达这个机制。

因此，实现比特币智能合约的核心就是怎么去加锁和解锁资产。

如果合约中所有的条件都能转换成key、哈希条件、时间锁这三者来加锁和解锁，那么这个合约就可以用比特币系统实现。我把这三者分别称为签名锁，哈希锁，时间锁，比特币智能合约基本就是用这「三把锁」来实现的。

比如你从我这儿买一个音乐，这个音乐通过密码访问，那么在交易合约中，我把音乐的访问密码也变成其中的一个key，如果要达成交易，这个key必须让你知道；而一旦你知道（你拿到音乐），钱就支付给我了。

**Q：哈希条件和key有什么不同？**

A：你可以理解成一个东西，它们的作用是一样的。哈希条件是我知道一个value，把value哈希之后得到一个哈希结果。那么在合约中，就是设置一个条件，谁能在写交易的时候把这个哈希结果打进来，这钱就归谁。只要我有这个value，就有哈希结果，也可以理解成有一个key。

**Q：简单而言，可不可以认为比特币的智能合约是通过多签加上时间锁来实现的？**

A：可以，前边讲过用key、哈希条件、时间锁实现智能合约，哈希条件也可以当作多重签名中的一个key来看待；时间锁则是一个关于区块高度的条件。

**Q：时间锁在实现智能合约中的重要性是什么？**

A：时间锁很重要，如果没有时间约束的话，很多协议是没法实现的。正是因为现在有了哈希条件、时间锁，闪电网络这种合约才能跑起来。

比如说闪电网络，我们两个人共同出钱，把钱冻结到一个共管的账号里，然后在链下互相支付，当要去结算时一方不合作了怎么办？假设我们吵架了，你的钱你不要了，但我的钱我也拿不到。有了时间锁就好处理了，我设一个超时时间，过了超时时间钱就是我的，我就可以拿走了。

### 三、比特币与以太坊智能合约的差别

**Q：对应于比特币用脚本实现智能合约，以太坊是用什么实现智能合约的？**

A：以太坊有一个智能合约语言。其实比特币的脚本也可以理解成一种语言，只不过比较简单；比特币脚本执行也可以理解成有一个虚拟机，只不过虚拟机的实现比较简单。既然都是虚拟机执行指令，那么以太坊的改变在哪里？

我总结以太坊带来的主要改变有三点：

1. 以太坊虚拟机指令的表达能力更强。简单理解的话，可以认为以太坊提供的指令更低级，用低级的指令组合成高级指令，而比特币是直接提供高级指令，其指令是有限的。另外，以太坊支持跳转等指令，能表达出循环等逻辑，也就是大家常说的图灵完备。

2. 以太坊引入了 gas 机制。在以太坊上可以随意写合约逻辑，gas机制保证最后执行的时候有一个上限限制，这除了解决停机问题外，还能限制浪费资源，让脚本的执行成本跟付出的费用间有个关系。

3. 以太坊上的合约有状态，而比特币上的合约不能有自己的状态。这代表着：第一，比特币上的合约是不能自己生成自己的状态的，比如说在这次脚本里输出一个东西，在下次脚本中使用是不行的，比特币的脚本都是一次性的，只对这个交易起作用；第二，比特币上的脚本是不能直接读取链上已有的状态的，比如时间锁依赖链上的区块高度，需要特殊指令支持，嵌入到脚本里的其他状态（通过 op_return 指令实现）更无法读取。

**Q：图灵完备会带来什么差别？**

A：其实以太坊也不是说真图灵完备，因为它有gas的限制，不可能用太复杂的逻辑。

图灵完备的好处是它的扩展能力更强，表达能力更强。因此以太坊提供的实验的自由度要远大于比特币，这也是以太坊上各种实验项目多的原因。

比特币是一种保守策略。我就这么多指令，我在别的地方先实验，实验好了，觉得需要支持这个指令，就增加这个指令。比如说为了支持原子交换以及支付通道，增加了哈希时间锁定协议，可以锁定一个时间段。

比特币为什么不扩充那么多指令？因为不同指令的资源消耗是不一样的，如果表达很复杂的脚本，执行这个交易的成本就会很高，会消耗资源、影响整个网络。

**Q：合约状态会带来什么差别？**

A：比特币的状态全是在链下生成的，就是说生成交易的时候就要把这个状态写好，链上只承载交易的数据，其它额外的数据写不进去。

比如你很难在比特币上发自己的币。在比特币上发的币都是染色币，染色币是在脚本里嵌入一些自己的数据结构，但脚本不能读嵌入的这个数据结构，所以也不能通过脚本对这个数据结构做验证，需要再做一个网络校验，看写进去的这个数据是不是合法的。

所有的染色币都是基于这个机制实现的，它不是像以太坊那样直接发一个token，然后通过合约来校验。

比特币之所以采用这种设计，本质在于它是不欢迎其他的数据写上去的，因为对比特币网络来说，承载额外的数据是有成本的，这种数据还得永久保存，而用户只付费一次。所以比特币不提供自定义状态的存储，这不是它的路线，通过 op_return 嵌入自定义数据可以理解为一种 hack 行为，并不是比特币提供 op_return  的本来目标。

其实这能够看出比特币和以太坊在设计思路上的区别：你可以把比特币理解成一个中立的银行，它只提供资产加锁、解锁的机制，谁有钥匙资产归谁，它对其他的条件都不关心；并且每一笔资产都是独立的锁，它也不关心资产之间的关系。比特币的智能合约并不是一段代码，而是一系列操作锁的协议。

而以太坊的的设计思路是任何合约都可以表现为一系列的交易，后面的交易和前置交易的状态是有关联的，所以它提供一种通用的追踪和更新历史状态的机制，而更新状态的逻辑和条件就由用户自己去创造。以太坊黄皮书里的世界状态的公式很好的表达了这种思路。

这两种思路其实各有优劣，和设计者的目标以及对世界的抽象有关系。

**Q：比特币和以太坊的智能合约还有其他不同吗？**

A：UTXO模型（未花费交易输出）与Account模型（账户）的不同，也会给两者智能合约的实现带来差异。

在 UTXO模型中，每一笔钱都有一个标记，使用的时候需要明确知道使用的是哪一笔钱；Account模型则相当于把用户所有的UTXO合并成一个大的UTXO，使用的是这个默认的UTXO。这带来几点不同：

1. 在Account模型下写合约比较简单，只需要说转多少钱，不需要指明转的是哪一笔钱；
2. Account模型可以提前对未来的收益进行约束，也就说这笔钱还没到合约账户，但可以部署合约去约束它该怎么花；
3. 由于Account模型相当于合并 UTXO，所以转账时不能直接设置解锁条件，必须先部署一个合约。

当然，UTXO模型和 Account 模型都是在演化的，有一些项目会对它们做出改变，有机会我会写文章详细分析。

### 四、比特币智能合约案例

**Q：怎么理解闪电网络本身就是一种智能合约？**

A：你可以说闪电网络是一个协议，也可以说它是比特币上的一种智能合约。闪电网络的合约主要解决两个人如何共同锁钱，以及如果一方作弊、不合作等等情况下怎么办的问题，它是通过前边说的三把锁来实现的。

**Q：在闪电网络上实现智能合约又是怎样的一个过程？**

A：闪电网络实际上是两个人之间的支付通道，现在只支持互相转账。我们尝试在支付通道之上嵌入了一个虚拟机，就可以执行比较完备的智能合约，比如游戏。（注：在闪电网络上实现的智能合约：https://github.com/westarlabs/thor）

通道双方可以压一笔 BTC，然后去玩游戏，赢的一方得BTC；如果玩的有分歧，可通过仲裁系统去仲裁。仲裁系统相当于一个法院，可以是一个侧链，或是一个双方信任的机构运行的节点，或者是仲裁者市场等等。仲裁系统保留了双方的解锁钥匙（哈希的 value），它仲裁之后把钥匙给赢的一方。

由于闪电网络的资产是定向的，所以仲裁者只能决定哪个用户得到BTC，但自己不能拿走用户的 BTC，即便是有联合作弊的可能，但作弊成本要比托管模式高。

**Q：通过闪电网络实现智能合约，与通过类似Liquid的侧链实现智能合约，有什么不同？**

A：闪电网络上的智能合约是通道双方的链下节点执行的，互相校验，产生分歧时需要有一个仲裁系统来仲裁。而侧链本身就有共识机制，有多个节点来执行和校验合约，所以两者在执行机制上是不一样的。

在侧链实现智能合约的方式与在以太坊上实现智能合约的方式类似，但当它与主链协同的时候，需要通过比特币的加锁、解锁的机制。

### 结束语

作为加密货币，比特币似乎有能力为DeFi的发展提供一个更好的空间，因为它凝聚了最多的共识，也承载着最高的价值和流动性，它是最受信任的加密资产。

那么作为一种系统，比特币是否支持DeFi的实施？在本文中我们探讨了比特币智能合约的实现机制，并把它与以太坊智能合约进行了一些比较。比特币上的DeFi不仅是可能的，而且会随着多签功能的强大变得更加完备。

也许我们可以期待以比特币为核心元素的去中心化金融服务的到来。
