---
title: 智能合约到底是什么？
date: 2019-05-27
draft: false
summary: 把智能合约从口号里拽出来，回到约束、执行和组织协作的语境里。
slug: what-is-smart-contract
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/4376632560892829
aliases:
- /what-is-the-smart-contract/
tags:
- smart-contract
- blockchain
topics:
- blockchain
type: post
---

区块链的『智能合约』是一个容易引起争议的概念，一次 Vitalik 也说后悔用智能合约（smart contract）这个名字了，不如当初叫 "persistent scripts"，大约是为这个概念吵累了。有人也问这玩意就一是一段程序脚本，哪里智能了？但如果这样说，大约现在命名为『智能』的东西没有一个配得上吧，智能手机大约可以叫做可以自由安装软件的手机？何况英文的 smart 和 intelligent 在中文中都翻译成『智能』，这更是容易引起误解。

所以那次争论中，也有人建议叫做 "stored procedures"，就是数据库的存储过程。如果把区块链看做一个分布式数据库的话，从技术实现上来看，智能合约确实很像数据库存储过程。使用一种新的编程语言也不是更本区别，如果使用更通用的 VM，可以和其他的程序使用完全一样的编程语言。另外大家常说的确定性（deterministic），实际上也是图灵机本身具备的特性，只要不引入随机机制，也很难写出不 deterministic 的程序。那为什么新造出个词汇呢？套用一句俗话，我们在谈论『智能合约』的时候，到底指的是什么？

<!--more-->

如果从技术角度看不出太大区别，那我们再从法律『合约』的角度看看。按照维基百科的定义：

> Contract:  A **contract** is a legally-binding agreement which recognises and governs the rights and duties of the parties to the agreement.

合约是定义了各方权利和义务的，具有**法律约束力**的协议。也就是说，合约的表现形式实际上不重要，可以是文本的，也可以是口头的，关键是要具有法律约束力。

那我们套用到『智能合约』上，也可以说智能合约的表现形态也不是关键，关键也在于『约束力』。这里我们给出一个定义：

> 智能合约就是定义各方权利和义务的，具有『约束力』的计算机程序。

那计算机程序的『约束力』如何产生？

### 智能合约的约束力

分析智能合约的约束力之前，我们先来看看法律合约的约束力。法律约束力来自于两方面，一方面是签订合约的参与方有明确的合约的意向表达，比如酒桌上吹牛的话就很难作为合约，合约要和日常的谈话和文本有明确区别，这也是书面合同在这方面更容易减少误解的原因。另外一方面是公权力提供了这样一套司法执行体系，当合约不能正常履行的时候，可以寻求公权力的裁决执行。

如果说一个国家的司法体系相当于一个通过自然语言定义规则的操作系统，合约就是在这个操作系统上用自然语言写的程序。自然语言的解释执行当然得人脑来做，但由于自然语言的不严谨，人与人的差异，如何保证执行的结果的确定性？如何防止执行者作弊？这两个难题是司法体系千百年来一直探索的难题。

切换到智能合约上，由于图灵机的特性，程序执行结果的确定性容易保证，关键难题就是如何防作弊了，怎么证明程序执行出的结果没有被篡改？

程序执行结果的可信性，取决于控制程序执行硬件的组织或者个人的可信性，当前软件系统，比如银行或者互联网应用，用户只能以信任组织的方式来信任程序运行结果，也就是说约束力是单方的，最终用户受到程序约束，但服务提供方几乎不受程序约束。用户如果对结果有异议，只能诉诸其他手段，比如司法，或者如前段时间某交易所用户去公司门口拉横幅抗议。

那如果程序可以在不同组织或个人掌握的硬件上重复验证，是不是就可以去除这种信任依赖？同时实现对双方的约束？这个在司法体系中也是如此，比如一审，二审，终审等机制，只是司法体系的执行成本太高了，有争议后才重复验证，次数也受限。但计算机程序这点上成本就低很多，所以可以大规模重复验证。

如果只有验证能力，实际上并不能产生约束力，还需要有强制执行能力。如果双方争议的标的可以直接由程序操作，也就可以实现验证并执行。这点上，区块链通过定义数字化的资产以及经济体系，来保证执行能力。

### 重复验证的瓶颈

计算机重复验证的成本虽然比人肉低许多，但如果每个交易都需要重复验证执行，成本就高了，这就是大家常说的区块链的 TPS (每秒交易数) 问题。那法院执行效率这么低，为什么没有成现实社会交易的瓶颈？区块链现在的做法相当于法院掌握了所有人的资产以及合约执行细节，每次合约执行都通过法院进行，当然会成为瓶颈。

而现实中的情况是大多数合约并不产生分歧或者争议，所以也不需要法院来裁决，法院也无需知道细节，只有产生争议时，才需要法院裁决，这时候双方提交相关证据即可。那这套机制能不能搬到链上来呢？这就是区块链二层（Layer2）网络试图要实现的目标。那关键问题就是如果没有了链上的重复验证，链下的合约约束力如何产生？

以太坊社区将"反事实"概念引入区块链，提出了反事实状态通道（Counterfactual state channel），试图总结出一种通用的区块链二层设计原则。这里的"反事实"和法律体系中的"反事实"含义类似。法律合约本身的约束力主要来自于这种反事实推理，如果合约一方违反合约，另外一方则可以通过司法机构来强制执行，交易双方最佳的策略是忠实执行合约，所以合约有了约束力。同样，如果一个智能合约虽然没有在链上执行，但如果有分歧时，任何一方都可以让它在链上执行，则也同样产生了约束力。

理论上，通过这样的方式可以支持无限的 TPS。

### 智能合约的另外一种形态

前面说的智能合约都是通过编程语言表达出来，在链上执行的程序，即便是放到链下，也需要保证可以在链上执行，否则就无法裁决。但既然我们关注的是约束力，重复验证只是实现约束力的一种方式，那有没有其他办法实现约束力？比如法院裁判合约的时候，并不是重复执行一遍然后验证，而是验证双方提交的执行结果证明，或者是对方认可结果的证明，比如签字。

比特币上的"智能合约"就和这种机制类似。比特币的模型下，锁定脚本相当于一个锁，确定了交易输出的 BTC 的归属权，算不得前面定义的合约，但它可以通过密码学方式设置解锁条件，来达到合约的效果，比如实现两种数字资产的交换（相当于买卖合约）。具体的实现方式这里不详述，感兴趣的可以看看原子交换，闪电网络，以及基于 Schnorr 签名的 Discreet Log Contracts 。

这种机制的思路是合约具体怎么执行不重要，只要保证合约最后争议的标的的归属权即可达到约束效果。当然，这种机制下，合约能表达的合约类型受限。

前一段时间我们也做了一个小实验项目，试图在闪电网络上实现智能合约。参与方互相验证合约，有争议时通过仲裁服务节点仲裁，资产通过闪电网络的 hash time lock 机制互相抵押，仲裁方可以决定押金的归属，但无法直接取走押金。虽然也有联合作弊的可能，但联合作弊也有信任成本，风险要小于押金托管。

至此，可以看出来。如果我们焦距于智能合约约束力的构建，合约的验证，裁决，执行，实际上是可以拆解开的，不一定要在同一层实现。

### 智能合约未来的两种路线

如果只追求约束力，对智能合约的发展并没太大分歧，但智能合约同时也是一种程序，它具有程序的所有特征，所以产生了分歧。

为了能校验合约，链上会保留智能合约的状态以及输入参数，也就是说提供了存储能力，同时也提供了合约运行环境，提供了计算能力。有了这两种能力后，理论上任何互联网应用都可以搬到链上了，同时还具有了约束力。所以以太坊将自己定义为世界计算机，EOS 将自己定义为一种 OS，都是用来运行去中心化应用 DApp 的平台。

然而 DApp 试验几年，还是没有大的起色。开始大家认为是 TPS 的限制，于是 EOS 通过 DPoS 的机制减少参与共识的节点，以达到更高的 TPS，理论上也可以运行一个小规模的互联网应用了，但依然没有太大起色。那问题到底出在哪里了？

关键在于我们一直按照互联网应用的模式在思考 DApp，**互联网应用的模式是提供一个系统给所有人用，应用本身所需要的状态存储和计算能力，和因为需要实现约束而产生的状态存储以及计算能力混合在了一起，所以几乎没有一个互联网应用的价值能撑得起区块链这样规模的副本和重复计算。**

所以现在智能合约和 DApp 的发展大体上可以分为两个方向：

一. **关注合约的约束力，必要的计算和存储只是实现约束力的基础**。这种思路下，开发者应该分析应用本身，拆解出需要约束的计算以及状态，也就是代表应用方与用户之间的合约的部分，然后构建证明和验证机制，只把必要的数据提交到链上裁决，链并不需要重复执行应用，与合约无关的计算和存储依然在链下。大多数二层网络，以及多链，跨链系统的约束和仲裁机制，走的是这个方向。

这种路线下，最容易实现的是 DeFi 类的应用。因为这类应用需要约束的状态很明确，就是资产，通过智能合约的约束力解决资金托管难题。并且现实中的法律合约也大多实际和资产相关，如果能把现实中的法律合约迁移到链上执行或者仲裁，想象力空间是非常大的。这个路线面临的最大的难题不在于技术，而在于和现实法律的冲突以及社会认知的变更。

二. **关注计算或者存储能力，约束力只是用户信任硬件资源提供方的一种手段**。有了这种约束力，可以构建开放式的系统，吸纳更多更廉价的硬件资源。如果只以保证必要的安全性为目标，就可以减少重复验证以及存储副本，以期望给 DApp 提供比云平台更廉价的计算和存储能力，至少成本上不要高太多，价格差可以通过开放性来弥补。比如 Filecoin，Truebit 等。这种路线下，短期看来，成本以及可靠性要超越云平台还是比较难的，技术难度要超过第一种路线，但好处是现实阻力没那么大。

当然，两个方向各有各的难度，也不冲突，最好是两个方向都成功了，就可以互相结合起来了。但如果试图同时在同一层实现两个方向，就会有冲突了，我个人认为是不可能的。

### 对司法体系的启示

既然智能合约可以通过区块链进行裁决执行，那现实中的法律合约，是否也可以模拟出这样的体系，来降低司法成本？那我们假设下，如果现实中的法律合约要通过计算机仲裁，需要哪些条件。比如一个借款合同，一方声称还钱了，有转账记录为证，另外一方认为没还，说这次转账不是还款，是另外一个原因。如何实现软件程序裁决？

首先，有一种编程语言来表达这个合约。

其次，双方必须有一套数字证书身份，都对这个智能合约进行签名。

再次，银行需要提供机制，转账时将转账记录和合约关联起来。同时提供给双方一个数字凭证，和凭证的验证接口。

最后，法院的裁决程序通过数字证书验证双方身份，通过银行的数字凭证验证还款交易，运行合约进行校验，基本就可以进行裁决了，银行收到裁决的结果后执行即可。

虽然这个过程有点简化，但理论上是可行的，并且基本的技术也都具备了，只是当前不同的系统之间还是割裂的，无法提供数字证明机制，数字证书身份体系也还缺失。

所以，我一直建议法律人也可以关注下智能合约技术，虽然这个技术现在还没到成熟阶段，但它比法律合约的优势非常明显：

1. 表达无歧义，执行结果明确。

2. 跨自然语言，世界通用。

3. 可计算机裁决，可预执行。

虽然还不敢说未来它的普及度有多大，但至少理论上，随着未来资产的数字化，大多数和资产相关的合约都可以通过智能合约表达执行。

### 总结

区块链领域有个说法叫 Code is law，代码既法律，实际上我觉得应该反过来，说 Law is Code。区块链以及智能合约就是想通过代码构建出一套约束力体系，用代码来描述这种规则（法律），将规则（法律）通过代码表达并执行。

这套机制，如果从法律体系来看，是千年未有之大变革。它的意义堪比几千年前人类把文本作为法律刻在石头上。如果试验成功，就可能构建出独立于国家主权的法律体系来。前两天美国的开源基金会关于软件出口的限制引起很大争议，为什么开源基金会要注册到某一个国家呢？因为开源基金会也需要资金运作，需要银行账户，万一出现经济纠纷，还需要依赖现有的司法体系来裁决。但区块链已经造出了数字资产，有了组织定义能力，有了裁决体系，就有可能出现独立于国家之外的开源组织。

当然有没有可能完全替代现实中的法律体系呢？这也是不可能的。毕竟终极制裁是对人的肉体进行制裁，除非有一天，人类真把自己的大脑上传到网上，现实中的肉体和资产对人来说完全失去了意义。不过也说不定呢？关于费米悖论的一个解释就是，外星人觉得现实的宇宙太大太无聊，于是把自己上传到了数字世界。

## 相关链接

1. [本文当前链接](/writing/what-is-smart-contract/)
2. [Vitalik 谈论 smart contract 的推文](https://twitter.com/VitalikButerin/status/1051160932699770882)
3. [Discreet Log Contracts](https://adiabat.github.io/dlc.pdf)
4. [A smart contract and arbitrate oracle service on LightningNetwork](https://github.com/starcoinorg/thor/)
