前言
《最小可行性区块链设计系列》的第七讲(http://www.jianshu.com/p/0cd9c04ac744 ) 讨论了以太坊的重要数据结构PatriciaTrie,本文继续讨论智能合约(Smart Contract)的原理与实现。
本文设计了一种简单的智能合约语言Kong Lang,代码地址:(https://github.com/qikh/kong-lang) (开发语言为Kotlin,更简洁的Java)
正文
智能合约的本质就是存储并运行在区块链上的程序模块,其运算得到区块链全网的执行,并且就输入和输出数据达成全网共识。因其程序形态而被成为“智能”,因其全网共识而被称为“合约”。
比特币(BitCoin)设计了简单的脚本系统,支持有限的指令集(OP CODE,类似汇编语言),借助堆栈的方式进行计算,这个脚本系统可以看做智能合约的雏形。例如,比特币的交易就通过以下脚本语言实现:
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
以太坊在此基础上,大大增强了脚本语言的指令集,计算方式仍然是堆栈的方式。以太坊设计了功能强大的虚拟机(VM)来执行脚本语言,每一个以太坊的客户端都可以看成一台虚拟电脑,能够执行比较复杂的运算。在指令集的基础上,以太坊社区还设计了Solidy(类Javascript)和Serpent(类Python)的高级编程语言,这些高级语言的编译器会将程序编译成基础指令集,然后保存到以太坊上,每个合约(程序)都会生成一个唯一的地址,用户通过向合约地址发送交易流水(Transaction)的方式来执行合约。
以太坊的智能合约让区块链社区看到了无限的可能性,随着合约功能的增强和网络基础设施的发展,区块链有可能颠覆现在的互联网网络,成为新一代的网络基础设施。从社交网站到金融应用,都可以通过智能合约的设计运行在区块链网络上,甚至随着AI算法的发展,智能合约可以成为自我进化的人工智能网络。
以太坊社区开始了各类智能合约的应用尝试,其中就包括著名的DAO(去中心化自我管理组织)项目,成为有史以来最大的众筹项目。但是,以太坊智能合约功能的强大也是一槟双刃剑,有黑客发现并利用了以太坊智能合约设计的一个循环执行缺陷,窃取了大量DAO的资产,最终造成了以太坊的硬分叉。
最新的区块链产品,包括HyperLedger(www.hyperledger.org)、Corda(www.corda.net)、Kadena(kadena.io)等都提供了各自的智能合约功能:
HyperLedger借助Docker容器实现了VM的功能,智能合约被定义为容器对外暴露的接口定义,内部的合约语言可以是Go、Java等主流语言。HyperLedger的实现比较讨巧,节省了基础指令集和VM的设计成本,但是缺乏对智能合约功能边界的定义,很难对部署到区块链上的合约进行审计和逻辑证明。
Corda弱化了智能合约的概念,把JVM直接定义为区块链的VM,所有支持JVM的语言都可以作为其智能合约语言。Corda的这种实现方式很难说是智能合约了,更像是金融业务的开发框架。
Kadena是一个非常有趣的项目,它采取了和以太坊不一样的智能合约设计理念,弱化了智能合约的一些功能点(例如不支持循环调用),把智能合约设计成类Scheme语言的函数式语言,并遵循代码即数据(Code is data)的设计理念,以源码形式部署到区块链上。Kadena的实现有其独到之处:一方面弱化的智能合约语言能够设定比较合理的功能边界,避免“坏”合约(大量复杂运算、逻辑漏洞等等)对区块链网络的性能和安全带来损害。另一方面,源代码形式的合约部署形式让合约的多方审计和逻辑验证更加简便可行。
Kong语言的设计
Mini BlockChain合约语言的设计参考了以太坊和Kadena的设计思想,被设计成为函数式语言,但是语言风格更加接近Javascript。作者在智能合约的设计阶段参考了一个名为Monkey的脚本语言,所以把这个智能合约语言命名为Kong,以示致敬。
Kong语言遵循Code is Data的设计理念,并没有设计成以太坊类型的指令集,而是设计成支持有限逻辑运算并可以扩展自定义方法的解释器(Interpreter)。有限的逻辑运算可以保证智能合约的功能边界,避免合约用户编写过于复杂的合约而造成性能和安全漏洞。可扩展自定义方法让智能合约可以方便得扩展合约功能,复杂运算和实现可以由外部方法来实现,保证合约的简洁性,加强了合约的可审计性和可验证性。
Kong的实现有两个版本,一个版本参考了”Wrinting an interpreter in Go”一书,实现了自定义的Lexer、Parser和Interpreter,另一个版本使用Antlr4将Grammar的定义转换成Lexer和Parser的实现。前者可以更好地自定义Lexer和Parser的实现,后者的语法定义和Lexer、Parser框架实现更加规范,两者的语法也有细微的差别。
Kong的一段示例代码如下:
def add(a,b) = a+b
let c = add(10,15)
println(c)
Kong语言目前还属于Toy语言范畴,下一步会以Antlr4版本为基础进行改进,并且集成到Mini BlockChain产品里,下一讲我们将围绕Kong语言的智能合约化展开讨论。