第5章区块链的智能合约




【本章导学】
智能合约是实现区块链信任机制的核心与关键,也是保证区块链业务多样性与可拓展性的根本因素。学习掌握区块链的智能合约技术对于理解区块链在具体产业中的应用场景起着关键作用。本节将从智能合约的基本概念、智能合约与区块链的关系、智能合约的原理以及智能合约的部署方式等方面展开,从多个方面阐述智能合约的知识内容。
【学习目标】
 熟悉智能合约的基本概念; 
 掌握智能合约在区块链中的存储方式以及“状态”的含义; 
 结合实际应用场景,掌握基于智能合约的解决方案; 
 熟悉智能合约在区块链系统中的使用流程。
5.1智能合约的基本概念
智能合约概念的出现远早于比特币和区块链。智能合约首次出现在20世纪90年代,由计算机科学家和法律学者尼克·萨博(Nick Szabo)在其文章Formalizing and Securing Relationships on Public Networks中提出。其基本思想是通过引入机器(硬件和软件),将部分合约植入机器,使得合约的执行在一定程度上与人解耦合,因此,合约违约的可能性降低,同时违约的代价增大。尼克·萨博在文章中给出了关于智能合约的一个简单例子——自动贩卖机,任何人只要向自动贩卖机投入硬币就能获得商品,这是一个典型的关于商品销售合约的例子,此例中的合约通过自动贩卖机背后的各种硬件、软件得以实现,合约被破坏或违约的可能性大大降低,如图51所示。



图51智能合约类比为自动售货机的示例


5.1.1传统合约与智能合约的比较
传统合约与智能合约的目标具有一致性。无论是传统合约还是智能合约,都有以下功能: 规定签约各方的责任和义务; 规定对违约方的相应惩罚措施; 当出现争议时,提供各方认同的解决途径。同时还需要考虑签订合约后,谁来监督合约的执行; 当问题出现时,谁来执行惩罚措施。在传统合约的执行中,法律以及仲裁机构(包括执法机构)担任监督者的角色; 而在智能合约中,机器担任了这种角色。如图52所示为智能合约与传统合约的比较示例。



图52智能合约和传统合约类比示例


5.1.2智能合约的特性
前面提到,智能合约本质上还是合约,涉及合约的执行和监督,也具备了传统合约的各类特性。但同时因为机器的参与,智能合约也有自身的一些特性,包括以下3点。
1.  效率与准确性提升
在智能合约中,机器参与合约的执行,合约的部分环节实现了自动化。从时间成本的角度,根据机器的参与度,合约执行的效率较传统合约有了不同程度的提升。从准确性的角度,由于机器的参与,合约执行中犯错的可能性降低,准确性得到提升。如图53所示为使用智能合约可以使效率提升的示例。



图53通过智能合约提升效率的示例


2. 违约可能性降低
智能合约中各个环节的人为因素减少,人为干扰的可能性也随之降低,这就意味着合约违约的可能性降低。
3. 可追溯性
在智能合约中,因为机器的参与,合约相关环节的执行信息可以被实时记录,合约也因此具备了可追溯性。某一环节的执行若出现问题或争议,都有据可查。
5.1.3智能合约面临的挑战
虽然智能合约具备诸多优势,但也面临一些问题和挑战。机器的参与要求合约的参与方提供执行和监督的API接口,这使得很多传统领域和应用需要付出很大的成本。机器的参与还要求相关的流程数字化,这使得涉及的外部利益相关方的业务流程也需要数字化。
5.2智能合约与区块链的关系
智能合约与区块链的关系很有趣。智能合约更像是一种需求,而区块链则是其一种有效的实现技术。没有智能合约的区块链是不完整的,而缺少了区块链的智能合约是难以实现的,区块链正是在与智能合约的相互配合中,共同实现了群体智能所必需的信任机制。
智能合约主要面向用户,同时根据实际的应用场景,会有具体的条款。在数字世界和智能社会中,处处都有服务和合作的需求,需要合约的场合数量巨大。在对于实时性要求非常高的场合,采用传统的合约体系将使效率低下。而且,正如前面所说的,如果缺乏一个平台的支持,那么智能合约很难落地。在智能合约中,机器参与合约的执行和监督有以下两种模式。
(1) 中心化,合约的参与方通过中心服务器进行合约的执行和监督; 
(2) 分布式,合约的参与方通过分布式的方式进行合约的执行和监督。
第一种模式的问题是,中心服务器存在安全隐患。因为所有的执行和监督都通过中心服务器,如果中心服务器被恶意控制,则整个合约的有效性将被质疑。
第二种模式是目前的主流模式,典型的代表是基于区块链实现的智能合约,区块链提供了合约执行的环境。合约的参与方通过区块链可以实现合约的自动执行和监督,因为任何一方若要干涉合约的执行和监督,都需要控制至少51%的区块链网络节点,这比中心化模式大大增加了难度。下面对智能合约与区块链的关系进行了归纳。
1.  区块链是智能合约实现的基础
区块链为智能合约提供了一个非常重要的基础——可信任的虚拟第三方。基于区块链,智能合约可以实现可审计、可追溯的功能。
2.  智能合约通过区块链体现价值
前面说过,智能合约更像是一种需求,一种将机器引入合约执行和监督过程的需求。如何实现这样的需求体现了智能合约内在价值。而智能合约正是通过区块链体现其价值的。
3.  智能合约是区块链价值的释放者
智能合约通过区块链体现价值,从另一角度看,区块链本身的价值也正是通过智能合约得以释放。越来越多的智能合约应用对于人们认识、了解、用好区块链提供了非常有效的媒介。
5.3智能合约的“状态”
智能合约本质上就是区块链上执行的一段程序,智能合约在区块链上的落地与区块存储是密切相关的。实际上,智能合约是作为区块中某一笔交易存储于区块链中的,如图54所示为智能合约存储于区块链中的内容。



图54智能合约存储于区块链区块中的示例


为了持久化存储某些数据,例如个人账户的余额、交易数量等核心信息,在智能合约中有“状态”的核心概念,与区块链中数据不可更改的特性不同,“状态”基于区块链中的数据,并会不断更新为最新的数据内容。
如图55所示,从交易T1至交易TN,账户A和B经历了从A向B转账10个单位数据的交易,那么A和B的“状态”就从一开始的110和52变为了交易后的100和62,所以“状态”即为根据交易内容运算的最新数值结果。


图55区块链中智能合约“状态”的变化


从另一个角度看,智能合约可以看作是一种用于记录和修改区块链“状态”的应用程序。在区块链1.0时期(比如比特币、莱特币)是把余额存到区块链上,通过共识机制就实现了对余额的“全网公证”。在区块链2.0时期,支持智能合约的区块链平台状态不局限于余额,可以将“自定义状态”保存到区块链上,如图56所示为“状态”存于区块中的图形化显示。



图56智能合约作为交易存于区块链中的示例


仔细看,可以发现每有一笔交易产生,智能合约的“状态”就会发生改变,如图57所示。



图57“状态”改变与交易数据的关系


5.4智能合约的“模型”
与传统程序类似,智能合约作为一段代码也有对应的输入信息、输出信息与内部数据处理流程。我们将输入信息理解为外部输入数据和输入事件,输出信息理解为智能合约针对输入数据或事件的反馈动作。在内部数据处理方面,定义了4方面的内容。
(1) 合约状态(State): 合约的状态信息。
(2) 合约值(Value): 一般指合约保存的资产值。
(3) 预置响应条件: 触发合约对资产进行处置与分配的条件。
(4) 预置响应规则: 合约对资产进行处置与分配及其他处理的规则。
如图58所示为智能合约的“模型”示例内容。



图58智能合约模型示例


下面以飞机延误赔付的实际应用为例,理解智能合约的具体应用。

1.  应用背景
小王预订了CA871次航班机票,航班计划13点起飞,15点降落。小王不仅购买了该航班班次,还购买相应的航班延误险。由于天气原因,该航班延误4小时起飞,那么按照延误险的条款约定,保险公司需要赔付300元。
2. 传统情况下的处理方式
飞机晚点后,小王需要将飞机晚点的证明发往保险公司,证明自己是乘机人。保险公司收到申请后,和航空公司核对确认飞机晚点。核对无误后,保险公司将赔偿转入小王的账户。如图59所示为具体的操作流程。



图59飞机晚点赔偿的操作流程



3. 引入智能合约的处理方式
引入智能合约,可以将飞机延误的处理方式以智能合约“模型”的方式重新定义,具体如下。
(1) 合约状态: 飞机起飞、到达时间; 赔付金额是否转入。
(2) 预置响应条件: 飞机到达时间传入,保险公司将赔付金额预存在智能合约中。
(3) 预置响应规则: 飞机延误4小时以上,将钱转入小王账户; 飞机没有延误4小时以上,将钱退还保险公司。
如图510所示为飞机延误赔付在智能合约下的处理方式。



图510飞机延误赔付的智能合约解决方案


5.5智能合约的工作原理
结合上述关于“状态”和“模型”的介绍,可以得出以下两点智能合约的原理。
(1) 智能合约是运行在区块链以及全局状态上的程序,智能合约能访问和修改区块链的状态。
(2) 智能合约可以让交易“程序化”,智能合约可以接收和存储价值,也可以向外发送信息和价值。
如图511所示为智能合约对于价值处理的图形化显示。



图511智能合约对于价值的处理方式


5.6智能合约在区块链的部署方式
5.6.1智能合约在区块链中的分布式部署

智能合约是一段程序(代码和数据的集合),可以部署在支持智能合约的区块链网络(比如以太坊)上运行。如图512所示,当智能合约作为一笔交易部署于区块链的一台节点后,基于区块链分布式账本的原理,这笔特殊的交易将被其他节点背书,从而被其他节点共享。这样实现的智能合约的输入是一致的,运行环境也是区块链提供的一致的运行环境,所以输出也可以验证。



图512智能合约在区块链的部署示例


进一步地,如图513所示,当有如Alex的用户在区块链中部署一个智能合约后,由于区块链的共识机制,其他节点同样可以使用对应的智能合约的功能,保证节点在运行结果上的一致性,也就是如上所述的“可验证性”。


图513区块链部署与验证的方式


5.6.2智能合约在区块链中的使用流程
智能合约作为一段代码,在区块链中的使用流程与传统程序相类似,包括编译、部署、上链、调用、执行。在上链操作后,区块链会给智能合约分配一个地址,通过使用该地址就可实现对智能合约的调用。如图514所示为部署合约的流程示例。



图514智能合约部署流程示例


智能合约的部署是通过一笔交易实现的。这笔交易是达成全网共识的,从而保证合约可以验证且全网一致。智能合约可以通过一笔交易来触发,也可以通过智能合约调用来触发(前提是合约已经被部署),同时要保证输入的一致性。如图515所示为智能合约调用的示例。



图515智能合约调用的示例