对很多具有计算机技术背景的人来说,智能合约可能是区块链技术里最令人感兴趣的部分。单听其名称,智能合约就会给人以无限的应用遐想。过去几年里,可以说智能合约是我们接触到的区块链领域最容易打动客户的理念,然而不幸的是,这往往也是客户最容易误解的概念。智能合约有着无限的可能性,但在今天它的实现还有很多局限,正确认识智能合约的能与不能、现状和未来,有助于我们思索和决策在自己的业务系统中应该如何定位和使用智能合约。

智能合约的声名鹊起主要得益于以太坊的成功,而以太坊是用虚拟机的方式来实现其智能合约的,这导致很多人认为以太坊的实现方式是唯一方式,从而引发了对区块链虚拟机的各种误解。

对智能合约和虚拟机的常见误解

误解一:区块链必须支持智能合约。区块链技术www.yuanwze.cn和智能合约的结合是非常好的形式,区块链具有去中心化、难以篡改、透明可追踪等优点,天然适用于智能合约。智能合约的确是一个令人激荡的事物,因为区块链的普及而名声大噪。然而,智能合约与区块链是两个相互独立的事物,并不互相依存,区块链本身未必需要支持智能合约,也并非所有的应用场合都需要智能合约。

误解二:区块链应用就是智能合约本身。这一误解可能源于以太坊的“下一代智能合约与去中心化应用的平台”这一定位宣传过于成功,让很多人在智能合约和应用之间画上了等号。

真正了解智能合约之后,人们就会发觉智能合约其实只是一个区块链应用中的一小部分,要构建一个让最终用户能够完整体验的应用,光靠智能合约本身通常是不够的,还需要其他业务逻辑、界面逻辑等的支持。

误解三:智能合约必须是程序代码。以太坊的智能合约概念成功让很多人以为智能合约必须是程序代码,但实际上这是一种误解。以太坊的智能合约引入了过程性代码,这一设计方式有很强的灵活性,但导致这种智能合约的使用只能由软件工程师来完成。其实,智能合约的实现可以有多种方式,把智能合约用程序代码来定义只是一种方式。未来的智能合约一定会出现更多种形态,例如表格方式、规则描述方式、可视化方式。

误解四:智能合约的实现必须实现专用的语言。很多区块链项目都为自己的智能合约设计了新语言,例如,以太坊使用的是Solidity,脸书的Libra设计了Move这种专用智能合约语言。那么,是否实现专用的新智能合约语言会更好呢?这很可能是一种不好的风气,因为大部分新的程序设计语言并无必要,而且在今天的计算机科学基础上,要设计实现一门新语言本身并非难事,但要设计一门优秀的新语言则难上加难。很多区块链项目可能只是出于市场宣传或炫技而设计新语言。

未经时间考验的语言可能存在不完善之处,例如,以太坊智能合约暴露的安全问题就反映出Solidity作为新语言在设计上不够完善。某些新语言并不能带来功能实现上的突破,反倒是经历过很长一段时间考验、被多次优化的经典语言更加安全有效。

目前有不少区块链采纳基于WebAssembly(WASM)的虚拟机来实现智能合约。在WASM生态里,结合LLVM这种可以把实现语言和目标编译代码解耦合的成熟技术,理论上未来用任何语言进行开发都是可行的。

误解五:智能合约必须“图灵完备”。以太坊的智能合约是图灵完备的,这一直是以太坊的一个重要卖点,但并非所有的区块链智能合约都需要图灵完备。智能合约完全可以多样,例如,比特币脚本特意设计成非图灵完备。图灵完备与否只是一种设计需要,并不代表其优劣。

越来越多的区块链会考虑实现非图灵完备的领域专用语言(Domain Specific Language,缩写为DSL),来实现高效率、安全的智能合约开发。

图灵完备的极简搞笑语言

Brainfuck是一种极简主义的编程语言,是图灵完备的最小语言之一。这个语言的设计应该就是为了开玩笑,这从某个角度说明了图灵完备本身并不是很高深复杂的事情。顾名思义,这个语言除了非常“烧脑”、搞笑之外,并没有实际意义。

不要吃惊,上面就是用这种搞笑语言写出来的代码,输出的是“hello world”(你好,世界)。这种语言可以解释实现,也有好事者为其开发了虚拟机实现。

误解六:支持智能合约必须使用虚拟机。这也是人们目睹以太坊风靡之后产生的误解。区块链的共识机制要求所有参与者的计算结果保持一致,但各节点可能会因为各种原因输出不同的结果。以太坊为了让所有节点保持一致写了一个虚拟机,就是为了实现智能合约代码的一致性,并让以太坊的智能合约在这个容器里面运行。然而,理论上虚拟机并不是支持区块链运行智能合约的必要条件。

区块链的智能合约需要在一个资源隔离的环境中运行,但这个环境不局限于虚拟机。只要达到一个沙盒[插图]执行环境标准(可以通过命名空间的隔离),保证合约和合约之间、合约和宿主系统之间进行了有效的资源隔离就可以实现(见图1)。而智能合约是用户编写的,需要预防恶意或故障智能合约的不良影响。

打开网易新闻 查看精彩图片

图1 以太坊虚拟机的沙盒机制