一、 智能合约的出现
智能合约的出现,使区块链不仅能处理简单的转账功能,还能实现复杂的业务逻辑,极大地推动了区块链技术发展,加速应用落地。
通过智能合约语言Solidity,实现了共识逻辑的自定义。基于区块链的分布式应用(dapp)的底层技术就是“区块链+智能合约”。第一个结合了区块链与智能合约技术的平台--以太坊的诞生,被认为是开启了"区块链2.0"时代。
二、智能合约的全链路
开发、编译、部署、调用
三、智能合约的分类
- Solidity合约
- Precompiled合约
四、Solidity合约代码结构
-
状态变量:状态变量是永久存储在合约中的值
-
构造函数:用于部署并初始化合约
-
事件:事件是能方便地调用以太坊虚拟机日志功能的接口
-
修饰器:函数修饰器可以用来改变函数的行为,比如自动检查,类似Spring的AOP
-
函数:函数是合约中代码的可执行单元
五、CRUD合约
基于预编译合约和分布式存储设计的CRUD合约接口。
用户可以直接在合约中引用CRUD接口文件Table.sol,并在Solidity合约中调用CRUD接口。CRUD合约的开发完全遵从数据库的操作习惯,更容易理解和上手。
六、Solidity和Java的全链路对比
Solidity与Java的不同之处在于,Solidity是服务于区块链的语言,代码在区块链上执行。EVM是区块链上的一个执行器。每个区块链节点都有一个EVM。Solidity在EVM中被执行后,EVM对区块链的数据进行了改变。这些数据的改变交由共识算法去共识。同时,Solidity的操作仅限于EVM内部,不能访问外部不确定系统或数据,如系统时钟,网络文件系统等。
Solidity的设计目的,是给区块链提供一套统一的逻辑,让相同的代码跑在区块链的每个节点上,借助共识算法,让区块链的数据以统一的方式进行改变,达到全局一致的结果。
七、Solidity的运行细节
以此处的Demo合约为例,合约中有一个全局变量m,并有一个函数add(),实现给全局变量m增加x数值的功能。
在合约二进制被部署到区块链上后,通过发送交易调用合约里的方法。节点根据交易将合约代码装载入EVM中,并根据交易的传参执行合约上相应的函数add()。
EVM执行合约代码,从区块链上读入当前区块的数据,进行相加操作,并将结果写入下一个区块(等待共识的区块)对应的状态数据中。
此后,共识算法将待执行的区块共识落盘,区块高度增加,区块链上的数据完成更新。
这段Solidity代码的功能是存取_num字段。该字段被称为“状态变量”,会由区块链持久存储。
用户可以将这段代码部署在以太坊或类似的区块链上,部署成功就意味着该智能合约不可再被修改,只要底层区块链不被销毁,这段合约就一直存在。任何人都可通过“合约地址”来调用该合约接口,每次调用信息都会被记录在链上。
在讲解这段代码如何运行之前,我们先回顾下传统java程序的运行方式。
首先,用户编译完java代码后,会以字节码的形式保存在磁盘上;然后用户会调用程序,这由JVM来托管执行;程序执行期间可能会通过日志来记录调用参数,也可能会和磁盘进行IO。
Solidity的执行与此类似。不同的是介质由硬盘换成了区块链,由单机变为分布式。
代码部署后,以字节码的形式存储在每一个节点上。当用户要求调用某个函数时,调用请求将会被囊括在交易中,并被打包到某个区块上,一旦全网对该区块形成共识,就意味着调用是合法的。
接下来,EVM会来调用字节码,它负责存取底层的状态变量,好比传统编程的IO。
光从代码来看,合约开发似乎不过如此,单个合约只需要围绕着字段进行操作,对于很多简单业务而言,不过是CRUD而已。
但其复杂性也恰恰在于此,合约在区块链环境上执行,是不可修改的。
所以如果出现了bug,就必须部署新的合约,这对于合约的可维护性提出了挑战。并且,一旦业务复杂起来,容易出现安全漏洞,导致链上资产损失。同时,还要考虑完成代码编写、逻辑执行、数据存储的成本问题。
综上所述,写合约不难,但写好合约,却需要一定功底。
八、智能合约的本质
所谓“合约”,就是条文、合同一类的东西,里面记录了发生的条件与对应执行的条款,以支持确权等操作;所谓"智能",就意味着自动化、可编程。
所以,智能合约就是可编程的合同,也可以理解为一段自动执行的条文合同,在计算机中,就是一段自动执行的程序片段。它更易于合约保存,并且由确定的算法运行,给定输入,就得到对应的输出,极大保障了合约的执行力。
以自动售货机做类比,可以帮助我们更好地理解智能合约的核心特征。
当使用者选择好要购买的货物并完成支付,出货逻辑就会被触发,用户就能得到想要的货物,而这个过程不需要人工介入,节省了售卖货物的人力成本。如果要破坏这个合约,就得物理破坏售卖机。像POS刷卡机、EDI(电子数据交换)等,也可作此种类比。
九、智能合约与区块链
智能合约在上世纪被提出,而区块链2009年才诞生,就定义而言,智能合约与区块链关系不大。
那为什么在这10年中,智能合约与区块链却产生了如此紧密的关联?因为区块链可以保证智能合约的不可篡改,不仅合约内容不可篡改,每次调用记录亦不可篡改。
智能合约产生价值的最基本前提是有一个强有力的底层介质用于储存,让其不可被物理破坏。
然而,智能合约的本体是一份代码,非常容易被篡改,如何为其提供强力的存储介质就成了问题。这正好是区块链擅长解决的——通过比特币的实践,证明了区块链可以在分布式环境下让电子记录不可被篡改。
与此同时,智能合约也在反哺着区块链,它极大地扩展了区块链的业务场景。
与智能合约结合后,区块链不再服务于单一的货币支付,可以延申到生活中的方方面面。丰富的应用场景也对区块链的能力产生了新的挑战。
十、不同平台的智能合约
公有链
联盟链
采用chaincode的Fabric,大部分平台都采用Solidity作为智能合约语言。
除了Solidity,WebAssembly、Libra的Move等一些智能合约语言也在发展中,可以保持关注。