前言
《最小可行性區(qū)塊鏈設(shè)計系列》的第七講(http://www.reibang.com/p/0cd9c04ac744 ) 討論了以太坊的重要數(shù)據(jù)結(jié)構(gòu)PatriciaTrie箕宙,本文繼續(xù)討論智能合約(Smart Contract)的原理與實現(xiàn)钠怯。
本文設(shè)計了一種簡單的智能合約語言Kong Lang涉瘾,代碼地址:(https://github.com/qikh/kong-lang) (開發(fā)語言為Kotlin,更簡潔的Java)
正文
智能合約的本質(zhì)就是存儲并運行在區(qū)塊鏈上的程序模塊兵志,其運算得到區(qū)塊鏈全網(wǎng)的執(zhí)行汤功,并且就輸入和輸出數(shù)據(jù)達成全網(wǎng)共識柏靶。因其程序形態(tài)而被成為“智能”弃理,因其全網(wǎng)共識而被稱為“合約”。
比特幣(BitCoin)設(shè)計了簡單的腳本系統(tǒng)屎蜓,支持有限的指令集(OP CODE痘昌,類似匯編語言),借助堆棧的方式進行計算炬转,這個腳本系統(tǒng)可以看做智能合約的雛形辆苔。例如,比特幣的交易就通過以下腳本語言實現(xiàn):
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
以太坊在此基礎(chǔ)上扼劈,大大增強了腳本語言的指令集驻啤,計算方式仍然是堆棧的方式。以太坊設(shè)計了功能強大的虛擬機(VM)來執(zhí)行腳本語言荐吵,每一個以太坊的客戶端都可以看成一臺虛擬電腦骑冗,能夠執(zhí)行比較復(fù)雜的運算。在指令集的基礎(chǔ)上先煎,以太坊社區(qū)還設(shè)計了Solidy(類Javascript)和Serpent(類Python)的高級編程語言贼涩,這些高級語言的編譯器會將程序編譯成基礎(chǔ)指令集,然后保存到以太坊上薯蝎,每個合約(程序)都會生成一個唯一的地址遥倦,用戶通過向合約地址發(fā)送交易流水(Transaction)的方式來執(zhí)行合約。
以太坊的智能合約讓區(qū)塊鏈社區(qū)看到了無限的可能性良风,隨著合約功能的增強和網(wǎng)絡(luò)基礎(chǔ)設(shè)施的發(fā)展谊迄,區(qū)塊鏈有可能顛覆現(xiàn)在的互聯(lián)網(wǎng)網(wǎng)絡(luò),成為新一代的網(wǎng)絡(luò)基礎(chǔ)設(shè)施烟央。從社交網(wǎng)站到金融應(yīng)用统诺,都可以通過智能合約的設(shè)計運行在區(qū)塊鏈網(wǎng)絡(luò)上,甚至隨著AI算法的發(fā)展疑俭,智能合約可以成為自我進化的人工智能網(wǎng)絡(luò)粮呢。
以太坊社區(qū)開始了各類智能合約的應(yīng)用嘗試,其中就包括著名的DAO(去中心化自我管理組織)項目钞艇,成為有史以來最大的眾籌項目啄寡。但是,以太坊智能合約功能的強大也是一檳雙刃劍哩照,有黑客發(fā)現(xiàn)并利用了以太坊智能合約設(shè)計的一個循環(huán)執(zhí)行缺陷挺物,竊取了大量DAO的資產(chǎn),最終造成了以太坊的硬分叉飘弧。
最新的區(qū)塊鏈產(chǎn)品识藤,包括HyperLedger(www.hyperledger.org)、Corda(www.corda.net)次伶、Kadena(kadena.io)等都提供了各自的智能合約功能:
HyperLedger借助Docker容器實現(xiàn)了VM的功能痴昧,智能合約被定義為容器對外暴露的接口定義,內(nèi)部的合約語言可以是Go冠王、Java等主流語言赶撰。HyperLedger的實現(xiàn)比較討巧,節(jié)省了基礎(chǔ)指令集和VM的設(shè)計成本柱彻,但是缺乏對智能合約功能邊界的定義豪娜,很難對部署到區(qū)塊鏈上的合約進行審計和邏輯證明。
Corda弱化了智能合約的概念绒疗,把JVM直接定義為區(qū)塊鏈的VM侵歇,所有支持JVM的語言都可以作為其智能合約語言。Corda的這種實現(xiàn)方式很難說是智能合約了吓蘑,更像是金融業(yè)務(wù)的開發(fā)框架惕虑。
Kadena是一個非常有趣的項目,它采取了和以太坊不一樣的智能合約設(shè)計理念磨镶,弱化了智能合約的一些功能點(例如不支持循環(huán)調(diào)用)溃蔫,把智能合約設(shè)計成類Scheme語言的函數(shù)式語言,并遵循代碼即數(shù)據(jù)(Code is data)的設(shè)計理念琳猫,以源碼形式部署到區(qū)塊鏈上伟叛。Kadena的實現(xiàn)有其獨到之處:一方面弱化的智能合約語言能夠設(shè)定比較合理的功能邊界,避免“壞”合約(大量復(fù)雜運算脐嫂、邏輯漏洞等等)對區(qū)塊鏈網(wǎng)絡(luò)的性能和安全帶來損害统刮。另一方面紊遵,源代碼形式的合約部署形式讓合約的多方審計和邏輯驗證更加簡便可行。
Kong語言的設(shè)計
Mini BlockChain合約語言的設(shè)計參考了以太坊和Kadena的設(shè)計思想侥蒙,被設(shè)計成為函數(shù)式語言暗膜,但是語言風(fēng)格更加接近Javascript。作者在智能合約的設(shè)計階段參考了一個名為Monkey的腳本語言鞭衩,所以把這個智能合約語言命名為Kong学搜,以示致敬。
Kong語言遵循Code is Data的設(shè)計理念论衍,并沒有設(shè)計成以太坊類型的指令集瑞佩,而是設(shè)計成支持有限邏輯運算并可以擴展自定義方法的解釋器(Interpreter)。有限的邏輯運算可以保證智能合約的功能邊界坯台,避免合約用戶編寫過于復(fù)雜的合約而造成性能和安全漏洞炬丸。可擴展自定義方法讓智能合約可以方便得擴展合約功能捂人,復(fù)雜運算和實現(xiàn)可以由外部方法來實現(xiàn)御雕,保證合約的簡潔性,加強了合約的可審計性和可驗證性滥搭。
Kong的實現(xiàn)有兩個版本酸纲,一個版本參考了"Wrinting an interpreter in Go"一書,實現(xiàn)了自定義的Lexer瑟匆、Parser和Interpreter闽坡,另一個版本使用Antlr4將Grammar的定義轉(zhuǎn)換成Lexer和Parser的實現(xiàn)。前者可以更好地自定義Lexer和Parser的實現(xiàn)愁溜,后者的語法定義和Lexer疾嗅、Parser框架實現(xiàn)更加規(guī)范,兩者的語法也有細微的差別冕象。
Kong的一段示例代碼如下:
def add(a,b) = a+b
let c = add(10,15)
println(c)
Kong語言目前還屬于Toy語言范疇代承,下一步會以Antlr4版本為基礎(chǔ)進行改進,并且集成到Mini BlockChain產(chǎn)品里渐扮,下一講我們將圍繞Kong語言的智能合約化展開討論论悴。