当前位置: 首页 > 科技观察

智能合约初探:概念与演进

时间:2023-03-21 13:47:10 科技观察

前言自2009年比特币开启区块链时代以来,近10年来,随着技术和生态的发展,基于区块链的分布式应用(dapps)呈现井喷之势,支撑dapp的底层技术是“区块链+智能合约”。智能合约与区块链的结合,被普遍认为是区块链世界里程碑式的升级。第一个结合区块链和智能合约技术的平台以太坊的诞生,被认为开启了“区块链2.0”时代。什么是智能合约1996年,NickSzabo在他的文章《Smart Contracts: Building Blocks For Digital Markets》中提出了智能合约的概念。所谓“合同”,是指条款、合同之类的东西,记录发生的条件和相应的执行条款,以支持确权等操作;所谓“智能(Smart)”就是自动化、编程。因此,智能合约是可编程的合约,也可以理解为自动执行的合约。在计算机中,它是一个自动执行的程序段。保存合约比较容易,通过一定的算法运行。给定输入,就会得到相应的输出,极大地保证了合约的执行。用自动售货机做类比,可以帮助我们更好地理解智能合约的核心特征。当用户选择好要购买的商品并完成支付后,发货逻辑就会被触发,用户就可以拿到想要的商品了。这个过程不需要人工干预,节省了卖货的人工成本。如果要破坏此合同,则必须物理销毁自动售货机。像POS读卡器、EDI(ElectronicDataInterchange)等,也可用此类比。智能合约和区块链智能合约是上个世纪提出的,而区块链是2009年诞生的。根据定义,智能合约与区块链关系不大。那么为什么智能合约和区块链在过去的10年里联系如此紧密呢?因为区块链可以保证智能合约不可篡改,不仅合约内容不可篡改,而且每次调用的记录也不可篡改。智能合约产生价值的最基本前提是有一个强大的不可物理破坏的存储底层介质。但是,智能合约的主体是一段代码,非常容易被篡改。如何为其提供强大的存储介质成为一个难题。这恰恰是区块链擅长解决的——通过比特币的实践,已经证明区块链可以让电子记录在分布式环境下不可篡改。同时,智能合约也在反哺区块链,极大地拓展了区块链的业务场景。与智能合约结合后,区块链不再服务于单一货币支付,而是可以延伸到生活的方方面面。丰富的应用场景也对区块链的能力提出了新的挑战。区块链2.0:以太坊的诞生诞生于2009年的比特币,利用区块链等技术保障生态,开创了区块链1.0时代。用户可以通过脚本代码自定义一些内容,比如如何解锁基金。这些脚本代码将与交易一起保存,从而具有不变性和确定性的特点。所以从某种角度来说,这些脚本也可以看作是智能合约。但是它们并不容易使用。首先,这些脚本代码不是图灵完备的,限制了实现的功能;第二,开发门槛高,写复杂逻辑体验会差,就像用JVM字节码写程序一样。2013年,年轻的Vitalik提出了以太坊,其核心是通过世界状态来更新和验证区块链数据。以太坊与比特币最大的区别在于可以通过智能合约进行复杂的逻辑运算。在以太坊上,智能合约的语言是Solidity,这是一种图灵完备的上层语言,大大扩展了智能合约的范围,降低了智能合约的编写难度。正因如此,以太坊的诞生也标志着区块链2.0时代的开始。随后,智能合约技术逐渐渗透到溯源、存证、供应链等多个业务场景。智能合约的现状和前景从编程的角度来看,智能合约就是一段代码。与常规代码相比,智能合约有很多差异和局限性,例如:单线程执行代码执行会消耗资源,不能超过资源限制目前很难获取链外数据,比如获取天气信息、比赛结果和其他限制,比如TPS目前的智能合约生态是以链上资源的治理为中心的。就像以太坊上的各种ERC标准和治理方案一样;EOS上有各种资源模型,如CPU、RAM、Rex、Bancor协议等。显然,就目前的生态而言,智能合约对现实世界的影响力是有限的。但是事情总是在发展的。目前,已经有许多研究致力于突破这些限制。典型的就是Oracle(预言机,但常被称为预言机),它允许智能合约与链外进行交互,可以大大提高智能合约的使用率。场景就像一台电脑连接到互联网;再比如那些突破链本身性能瓶颈的尝试,比如支付通道、跨链、Plasma、Rollup,都从不同的角度打破了安全和性能的束缚。毫无疑问,智能合约将发挥越来越重要的作用。未来,随着以太坊2.0的落地,一个全新的区块链时代或将开启。智能合约技术以太坊使用Solidity作为智能合约语言。Solidity是一种为实现智能合约而创建的高级编程语言,可以在允许以太坊程序的节点上运行。该语言吸收了C++、JavaScript的一些特性,比如它是一种静态类型语言,支持继承、库等。除了Solidity之外,各个平台的智能合约技术也各不相同。接下来,我们将从公链和联盟链入手,介绍其他平台采用的技术。首先,大家不妨熟悉一下三大公链的智能合约技术。联盟链除了公有链,联盟链也是一种重要的区块链类型。与公有链相比,联盟链共识的复杂度大大降低,执行效率更高。联盟链受到企业级组织的青睐。一般来说,相关组织会结成联盟,通过联盟链共享数据。联盟链可覆盖供应链金融、司法提存、溯源等多种场景,未来还将与IOT、AI等技术相结合。在如今的联盟链生态中,除了Fabric使用chaincode外,大部分平台都使用Solidity作为智能合约语言,例如FISCOBCOS。如今,Solidity可以说占据了智能合约的C位。掌握Solidity是学习智能合约和区块链的重要一环。后续系列也将对如何使用Solidity编写、运行和测试智能合约进行深入介绍和分析,敬请期待。除了Solidity,WebAssembly、Libra的Move等智能合约语言也在开发中,大家可以关注一下。智能合约运行分析下面分享一个基础的智能合约:HelloWorld。pragmasolidity0.4.22;contractHelloWorld{uintprivate_num;函数存储(uint256num)public{_num=num;}函数get()公共视图返回(uint256){return_num;}}这段Solidity代码的作用是存储取_num字段。该字段称为“状态变量”,由区块链保存。用户可以将此代码部署在以太坊或类似的区块链上。成功部署意味着智能合约不能再被修改。只要底层区块链不被破坏,这个合约就会一直存在。任何人都可以通过“合约地址”调用合约接口,每次调用的信息都会记录在链上。在解释这段代码如何运行之前,我们先回顾一下传统的Java程序是如何运行的。首先,用户编译Java代码后,会以字节码的形式保存在磁盘上;然后用户调用程序,由JVM管理;磁盘做IO。Solidity的实现类似。不同的是,介质从硬盘变成了区块链,从单机变成了分布式。代码部署后,以字节码的形式存储在各个节点上。当用户请求调用某个功能时,该调用请求将包含在交易中并打包到某个区块中。一旦全网对区块达成共识,就意味着调用是合法的。接下来EVM会调用字节码,字节码负责访问底层的状态变量,就像传统编程的IO一样。从代码上看,合约开发似乎无非如此。单个合约只需要围绕字段进行操作。对于许多简单的业务,它只是CRUD。但其复杂性恰恰在于此。合约在区块链环境中执行,不可修改。所以如果出现bug,就必须部署新的合约,这对合约的可维护性提出了挑战。而且,一旦业务变得复杂,就容易出现安全漏洞,导致链上资产流失。同时,还要考虑完成代码编写、逻辑执行、数据存储的成本。综上所述,写合同并不难,但写好合同需要一定的技巧。结论本文介绍了智能合约的概念和历史演变。智能合约是上个世纪提出的技术,在区块链浪潮下焕发出新的生命力。相反,智能合约广泛的应用场景极大地促进了区块链的发展。学习智能合约,推荐选择Solidity语言,因为它有一些传统语言的特点。同时,执行环境完全基于区块链,实际业务开发体验会不同于以往的编程体验。读者可以尝试快速搭建一个基于FISCOBCOS的区块链环境,部署最简单的合约,熟悉部署和调用方式,进而深入Solidity的世界。