最小可行性区块链设计系列:Day 8 智能合约

前言

《最小可行性区块链设计系列》的第七讲(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语言的智能合约化展开讨论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335