第十七讲 || 智能合约与去中心化应用
智能合约是区块链2.0技术以太坊最重大和核心的发明,从此使区块链真正成为了一个底层技术,而不再象比特币一样仅仅是一个应用。

正因为对智能合约的支持,使区块链可以应用于很多去中心、去信任的场景中,区块链的基础性价值才获得了较广泛的认可。目前对智能合约的支持,最典型的有两大技术平台,一是公链技术架构的以太坊,二是联盟链技术架构的超级账本。为什么说智能合约的出现,使区块链对我们具有了基础性的意义呢?当今社会,执行合约需要耗费大量社会资源。比方说,A、B两家公司签订合同,后来A违反合同条约,导致B损失重大。B想要拿回属于自己的东西,于是向法院起诉。就算B打官司赢了,判决书生效后,他还需要向法院申请强制执行,包括立案,提供财产线索……整个流程下来,每个参与人都很憔悴,尤其是本来就是受害方的B,可能因为后继合同的维权,还将蒙受更大的损失。而智能合约能让这一切变得简单很多。智能合约和上述传统合约的区别,就在于“智能”,不涉及人类主观想法,一切皆代码。智能合约,就是一段写在区块链上的代码,一旦某个事件触发合约中的条款,代码即自动执行。也就是说,满足条件就执行,管他愿不愿意。

在现实生活中,我们经常看到这样的场景,张先和王女士打赌,如果张先生能猜中购物袋里装着什么,王女士就给他100元。后来张先生猜中了,但王女士却赖账。不管张先生怎样去讨要,女人们就是不给。这种情况下,张先生不可能去抢女生的钱包拿这100元,只好认了。但如果有了智能合约,一旦张先生猜中,不管王女士怎样耍赖,智能合约代码将自动执行,并把这100元(真实的情况是数字货币)打到张先生的账户。如果说朋友之间的约定不需较真,那么放大到借5万元给亲戚、和房东签租1年、购买重大疾病保险等与你切身利益相关的场景中呢?

这就是智能合约的应用的重要意义,智能合约是一段写在区块链上的代码,其基本过程包括:
构建 → 存储 → 执行
1)智能合约由区块链内的多个用户共同参与制定,可用于用户之间的任何交易行为。协议中明确了双方的权利和义务,开发人员将这些权利和义务以电子化的方式进行编程,代码中包含会触发合约自动执行的条件。
比方说,你把一套闲置的房子租给A,那么,这份智能租约中就规定了A必须在每月5号之前给你付房租、你必须在收到房租后马上给对方钥匙等条款。
2)一旦编码完成,这份智能合约就被上传到区块链网络上,即全网验证节点都会接收到你和A的租房合约。
3)智能合约会定期检查是否存在相关事件和触发条件;满足条件的事件将会推送到待验证的队列中。假设A在4号提前付房租给你,这个事件就成了该合约的触发条件(每月5号以前)。
4)区块链上的验证节点先对该事件进行签名验证,以确保其有效性;等大多数验证节点对该事件达成共识后,智能合约将成功执行,并通知用户。
5)成功执行的合约将移出区块。而未执行的合约则继续等待下一轮处理,直至成功执行。


部署到以太坊上的智能合约是要消耗以太币的。就好像把现实中的仲裁人、法官、执行人搬到了区块链上,尽管他们成了一行行的代码,但也是珍贵的计算机资源。智能合约也遵循“Less is more”,逻辑应尽可能地简单。逻辑越复杂,消耗的以太币就越多。以太坊给常用的代码逻辑都规定了具体的价格,比如你去买车,低配多少钱、高配多少钱,安装最先进的导航系统又是多少钱,4S店已经规定好。既然执行要消费以太币,如何支付呢?这跟淘宝的直通车类似,商家提前存几千元进去,系统会自动执行(匹配推广),费用一旦用完,推广立即停下。智能合约也是预支付,为了合约顺利执行,宁愿提前多存一点以太币,都不要少给了。智能合约比淘宝推广还狠,如果预支付的以太币不足以支撑整个执行过程,就算进行到半路,合约也会回到初始状态;更郁闷的是,消耗的以太币也不会退回给合约发起人。

智能合约有什么用?
在区块链社会里,大家共同维护一个区块链账本,所有交易数据无法篡改、不可伪造,还能减少人工对账的出错概率和人力成本;随着智能合约的普及,我们也会变得更加佛系。面对潜在的纠纷,无需自己出马,一切代码说了算。乘飞机买延误险,理赔就变得简单多了。投保乘客信息、航班延误险和航班实时动态均以智能合约的形式存储在区块链上。一旦航班延误符合赔付标准,赔偿款将自动划到投保乘客账户,保单处理十分高效,乘客也不需要跟工作人员费口舌、争论计赔时间等问题。

假设你借了一大笔钱给亲戚,虽然打了白纸黑字的借条,但催款的时候,如果对方有一种坚持不要脸的精神,而你也没有撕破脸、或者把对方告上法庭的勇气,你就拿不回本属于自己的钱。智能合约也许是解决办法之一,当然前提是双方把借款金额、还款时间、对方绑定银行卡信息等打包进合约中。到了约定还款日,借款自动划到你的账户里。通过智能合约,真的就能拿回欠款吗?毕竟智能合约只在金融领域等方面开始有动作,还没有广泛融入普通大众的生活。这个乌托邦的设想,值得等待。
结合智能合约所开发的应用我们叫去中心化应用——DAPP,为什么要DApp?
互联网发展至今,大部分网络应用都是中心化的服务模式。这种集中式的服务模式容易导致服务内容缺乏透明度,用户隐私泄露、数据被滥用等问题。服务方和消费者之间的交易需要由极高的公司信誉和完善的评价系统甚至社会征信体系背书。部分服务天然存在单点故障的缺陷。Dapp 是去中心化应用(Decentralized Application)的简称。与之相对的是中心化应用(Centralized Application),比如现在常见的BS模式下的 web 应用。而中心化应用通常会出于可用性的考虑将实例部署到多个节点上,形成分布式应用。

所以说,中心化应用可以是分布式的,也可以是非分布式,但是去中心化应用一定是分布式的。那么由此就会引出一个思考,去中心化应用和现在的分布式应用的区别到底在哪里呢?去中心化应用具有四个基本特点:
开源
内部货币
去中心化的共识机制
无单点故障缺陷

DApp天然是分布式应用,因此避免了单点故障。区块链上的用户数据通常是用加密方式存储,数据的所有权归属用户,而非DApp的开发者。DApp的后端程序是部署在区块链上的智能合约,智能合约是一组预定义的业务规则,具备确定性(Deterministic)执行的特征,能有效降低信任成本。DApp中消耗的资源由数字货币经济模型予以补偿或激励。
DApp 和普通的 App 有什么不同?
DApp和App之间最大的不同就在这D(Decentralized)上,这个D有两层含义,第一它具备分布式(Distributed)的特征,第二它具备分权(Decentralized)的特征。分布式理解起来比较简单,app是部署到多个节点上的,不用害怕单点故障。关键是分权比较难以理解。在这里,分权其实也包含两层含义。第一点,应用的开发者在上线应用之后,就不能随意修改升级应用内容,当然更加不可能修改数据;第二点,应用本身具有博弈的特点,都把用户想象成理性经济人,做事之前考虑成本,这也是为什么大多数DApp都有它内置的代币(Token,也作通证)。


这样说起来比较抽象,我们来看看一些典型的DApp的特征。

购买商品合约
想象一个场景,我们在一个没有淘宝这种电商平台下,怎么和个体商家做交易?假想一下,商家发布了一个合约,合约里说,有一件商品价值1块钱,用户给这个合约打入一块钱,商家把商品发过去,用户确认收货之后,商家就收到这1块。
第一回合
听上去不错,但是这里面有问题。如果用户打进1块钱,商家根本没有货,那用户只能白白浪费一块钱。只要用户不傻,他就不会打进去这1块钱,这个交易不可能完成。怎么办?商家说那好,我先打进去1块钱表示我这里有1块钱的商品,这样就能确保我发货。然后用户打入1块钱,然后商家发货,用户签收,商家得到2块钱。
第二回合
听上去不错,但是这里面还是有问题。如果用户收到货之后,不去触发签收操作呢?对于用户而言,没啥损失,但是商家不仅损失了商品,还损失了1块钱。怎么办?用户说那好,你先打进去1块钱,我打进去2块钱。我收到商品之后,自然会触发签收操作,那样你就得到了2块钱,返还我1块钱。如果我不进行这样的操作,就会损失1块钱呢。
第三回合
听上去不错,不过我们稍微钻点牛角尖,就是说刚才方案还是有漏洞,商家可能会用1块钱套住用户2块钱的,就是不发货。那商家就得和用户一样打进去2块钱,但是用户收货之后,完全会考虑我只损失1块钱,你损失了3块钱,那我就不签收。
第四回合
不过,我们还是基于理性经济人的假设,商家是想通过买东西赚钱的,所以他在抵押1块钱的情况下,一定会发货。通过这个例子,我们很容易发现,在没有中间人担保的场景下,两个陌生人也是可能完成一笔交易的。这里面充满了博弈的套路,在实际编码的过程中,最好有两个人扮演不同的角色,然后坐到一起,从自己的利益出发,达成交易,而且使交易的信任成本最小化。刚才的场景下效率肯定不高,我想不会有哪个商家和顾客愿意质押自己的现金流,去达成这种交易吧。
锤子剪刀布
如何在Dapp中玩锤子剪刀布的游戏呢?我们面对面玩这个游戏还是比较简单的,彼此同时亮出来就好了。但是在网络环境下就不一样了,总有一个人先出,另一个后出。那放到DApp中更加有问题了,先出的人一定会输,为啥?因为先出的已经被记录在区块链上,那就意味着后面的人一定能看到对方的出拳结果,所以他一定会赢。所以先出的人一定会把出拳的结果加salt然后hash才上链,后出因为看不到结果,所以只能随机选择一个出拳。不过这个时候,问题又来了。先出的一看结果,是对方赢了,那就干脆不揭露结果。这对游戏而言不公平。所以还得设计在对方出拳之后,多长时间内,如果先出拳的一方不揭露,那么不论结果如何都算他输。
去中心的智能锁
区块链上的智能合约承载了原来中间商信任担保的角色,也是我们常常说的“去中介”和“去信任”的由来。在很多共享经济的场景当中,其实一把“智能”的锁就可以胜任。这也是为什么我们会有去中心化智能锁的想法。整体的实现逻辑如下:
房东通过智能合约 Smart Lock Contract 设置房屋租金。租客通过查找合约地址,对所要租的房屋合约转账;租客来到房屋门前出示二维码(由自己签名的消息转成的二维码);门锁上的摄像头识别二维码,并向合约验证签名的真实性以及租客的租房时间的合法性,进行开门。
以太猫(Cryptokitty)
Cryptokitty是一款构建在以太坊区块链平台上的以太猫游戏(cryptokitties),其火热的程度直接引发以太坊网络的大拥堵,由于这个游戏占用了较多的以太坊网络带宽,导致很多交易得不到及时处理,比如想从火币网转出一笔 ETH 到自己的钱包,这笔交易会长时间处于等待确认的状态。Cryptokitties 类似于此前席卷全球的游戏 Pokémon,不过它是一个基于以太坊的DAPP(Decentralized Application,去中心化应用),由设计工作室 AxiomZen 设计打造,上线不到10天就迅速成为以太坊上交易量最大的 DAPP。

在这个游戏当中,用户可以收藏,交易和繁殖以太猫,有别于比特币这类加密货币,以太猫更像加密收藏品,这意味着用户的 CryptoKitty 始终属于用户,合法性由智能合约(Smart Contract)确定,而智能合约是无法关停的,这点也是它区别于 Pokémon 的地方,因为一旦 Pokémon 背后的公司倒闭,用户所拥有的宠物也随之消失。而且作为收藏品,以太猫的市场价格是由市场需求、本身的稀缺性和用户的报价决定的,这也是为什么一只以太猫的价格可以高达17万美元。CryptoKittes 是一个收藏游戏,它能满足人们娱乐的需求。用户可以收藏和买卖那些通过隐形基因繁殖出来的稀有品种、给猫命名、给它找对象,开启一段区块链吸猫的新时尚。这里也显现了 DAPP 的另一个重要特征 —— 内部代币,通过和外部转换代币进而盈利。
FoMo3D
传销集大成者,前段时间火的不能再火的DApp FoMo3D,它的网站名称叫做 exitscam.me,妥妥的骗局!这个赌博的方式类似传销,它设置了崩盘的上限为24小时,每个新加入这个骗局的人都会自动给游戏续命30s(嗯,+30s)。为啥明知是个骗局还有很多人愿意进来玩呢,因为它的规则是在崩盘的时候,最后一个游戏参与者能获得之前所有参与者资金的23%,而其他的后来者需要为前面进来的人买单。当然也有人给这款天才之作洗白,这归功于DApp的特性,代码开源,无法篡改。它巧妙地将阳谋编码到程序当中,而且明码标价地让参与者投注,即便是程序的拥有者也无法“携款潜逃”!驱使赌局越来越大的是人的贪婪本性。所以从本质上,这又不是传销。这样一款邪恶的游戏现在已经募集了21,468.75ETH,价值9,903,536.56252刀,而且还会继续涨下去。把人性玩得如此得心应手,这也是区块链当前的状态。