作者 張錚文卡辰、達(dá)鴻飛蛆橡;來自:小蟻區(qū)塊鏈
本文兩位作者均系小蟻區(qū)塊鏈(www.antshares.org)的創(chuàng)始人。小蟻區(qū)塊鏈起源于2014年赋元,是一個(gè)探索可編程智能經(jīng)濟(jì)的開源公有鏈忘蟹。2017年,小蟻的前期技術(shù)積累將進(jìn)入兌現(xiàn)期搁凸,會(huì)在智能合約媚值、跨鏈互操作、共識(shí)機(jī)制护糖、密碼學(xué)等多個(gè)方向?qū)崿F(xiàn)技術(shù)突破褥芒。
從擴(kuò)展性的角度繼續(xù)比較幾種智能合約系統(tǒng)的優(yōu)劣,并提出改進(jìn)的思路嫡良。
1锰扶、前言
本文是小蟻的兩位創(chuàng)始人過去兩年中在設(shè)計(jì)小蟻智能合約時(shí)所做的深度思考和技術(shù)探索的結(jié)果∏奘埽《重構(gòu)智能合約》系列文章將分為上坷牛、中、下三篇很澄,分別從確定性和資源控制漓帅、擴(kuò)展性和耦合度锨亏、通用性和生態(tài)兼容三個(gè)方面來剖析現(xiàn)有智能合約系統(tǒng)的優(yōu)缺點(diǎn),并提出新的智能合約體系的設(shè)計(jì)思路忙干。
在上一篇《重構(gòu)智能合約(上):非確定性的幽靈》中我們分析了智能合約對(duì)確定性、資源控制和隔離的需求浪藻,得出了虛擬機(jī)作為智能合約的執(zhí)行環(huán)境在上述三點(diǎn)都相對(duì)與容器技術(shù)具備相當(dāng)?shù)膬?yōu)勢(shì)捐迫。本篇中,我們將從擴(kuò)展性的角度繼續(xù)比較幾種智能合約系統(tǒng)的優(yōu)劣爱葵,并提出改進(jìn)的思路施戴。
2、執(zhí)行環(huán)境的性能
智能合約的執(zhí)行環(huán)境會(huì)對(duì)合約的性能起到非常重要的作用萌丈。目前主流的區(qū)塊鏈架構(gòu)對(duì)智能合約執(zhí)行環(huán)境的設(shè)計(jì)主要分為兩種:虛擬機(jī)和容器(Docker)赞哗。無論是虛擬機(jī)還是容器,它們的作用都是在一個(gè)沙盒中執(zhí)行合約代碼辆雾,并對(duì)合約所使用的資源進(jìn)行隔離和限制肪笋。
1) 虛擬機(jī)
虛擬機(jī)通常是指能夠像真實(shí)機(jī)器一樣執(zhí)行程序的計(jì)算機(jī)的軟件實(shí)現(xiàn)。有些虛擬機(jī)會(huì)模擬出一個(gè)完整的物理計(jì)算機(jī)度迂,比如VMware藤乙、Hyper-V等奥额,可以在這些虛擬機(jī)上安裝操作系統(tǒng)和應(yīng)用程序侵续;另一些虛擬機(jī)則只提供了硬件的抽象層腔长,而與具體的底層硬件無關(guān)内列,例如Java虛擬機(jī)剩蟀。
區(qū)塊鏈智能合約系統(tǒng)的設(shè)計(jì)中涨共,很少會(huì)采用模擬完整物理計(jì)算機(jī)的模式熟史,因?yàn)檫@種方式會(huì)消耗大量的資源并嚴(yán)重影響性能氧映,且很難兼容不同的硬件架構(gòu)钧萍。所以絕大多數(shù)的區(qū)塊鏈會(huì)采用更加輕量級(jí)的虛擬機(jī)架構(gòu)褐缠,例如以太坊開發(fā)了EVM,R3 Corda則直接采用了JVM划煮,還有一些區(qū)塊鏈采用了V8引擎——Google的JavaScript引擎(虛擬機(jī))送丰。
當(dāng)我們分析執(zhí)行環(huán)境的性能時(shí),有兩個(gè)指標(biāo)是非常關(guān)鍵的:(1)指令的執(zhí)行速度(2)執(zhí)行環(huán)境本身的啟動(dòng)速度弛秋。對(duì)于智能合約而言器躏,執(zhí)行環(huán)境的啟動(dòng)速度往往要比指令的執(zhí)行速度更為重要。智能合約中較多是一些甚少涉及IO操作的邏輯判斷指令蟹略,這些指令的執(zhí)行速度很容易得到優(yōu)化登失。上一篇《重構(gòu)智能合約(上):非確定性的幽靈》中,我們提到了出于安全性考慮挖炬,智能合約必須在相互隔離的沙盒執(zhí)行環(huán)境中運(yùn)行揽浙。每個(gè)智能合約每次被調(diào)用,都必須啟動(dòng)一個(gè)新的虛擬機(jī)/容器。因此執(zhí)行環(huán)境本身的啟動(dòng)速度(啟動(dòng)一個(gè)虛擬機(jī)/容器)對(duì)智能合約系統(tǒng)的性能影響更大馅巷。
上述的EVM膛虫、JVM、V8引擎這些輕量級(jí)的虛擬機(jī)架構(gòu)對(duì)智能合約的性能提升有顯著的優(yōu)勢(shì)钓猬。它們的啟動(dòng)速度非成缘叮快,占用資源也很小敞曹,適合像智能合約這樣短小的程序账月。缺點(diǎn)是,這類虛擬機(jī)的執(zhí)行效率會(huì)相對(duì)略低澳迫,好在智能合約一般都比較短小局齿,會(huì)更加注重環(huán)境加載的速度而非代碼執(zhí)行的速度。另外橄登,通過JIT(即時(shí)編譯器)技術(shù)對(duì)熱點(diǎn)智能合約進(jìn)行靜態(tài)編譯和緩存可以顯著提升虛擬機(jī)的執(zhí)行效率抓歼。
2) 容器(Docker)
與其它主流區(qū)塊鏈設(shè)計(jì)不同的是,超級(jí)帳本中的子項(xiàng)目Fabric獨(dú)樹一幟地采用Docker作為其智能合約的執(zhí)行環(huán)境示绊。與虛擬機(jī)的作用一樣锭部,Docker也進(jìn)行了資源的隔離,但不如虛擬機(jī)那么隔離充分面褐。Docker本身沒有采用虛擬化技術(shù)拌禾,而是讓程序直接運(yùn)行在底層操作系統(tǒng)上,因此代碼執(zhí)行的效率很高展哭。但由于其相對(duì)于輕量級(jí)虛擬機(jī)而言過于龐大的體型湃窍,部署和啟動(dòng)Docker本身需要消耗大量的時(shí)間和資源。當(dāng)使用在智能合約系統(tǒng)時(shí)匪傍,Docker的啟動(dòng)時(shí)間成為了制約整體效率的瓶頸您市。Fabric在性能測(cè)試時(shí),即便用上了IBM的大型機(jī)LinuxONE這樣的強(qiáng)悍硬件役衡,性能依然不高茵休。
執(zhí)行環(huán)境的代碼執(zhí)行速度就好比汽車的最高時(shí)速,而執(zhí)行環(huán)境的啟動(dòng)速度則好比汽車的0-100km/h加速度手蝎。和一般程序相比榕莺,智能合約短小精悍,總是處在“啟動(dòng)—停止—啟動(dòng)—停止”的狀態(tài)棵介,很少能夠跑到極速钉鸯。執(zhí)行環(huán)境的啟動(dòng)速度才是影響智能合約性能的關(guān)鍵因素。
3邮辽、并發(fā)唠雕、分片與無限擴(kuò)展
當(dāng)談及一個(gè)系統(tǒng)的擴(kuò)展性時(shí)贸营,總會(huì)涉及到兩個(gè)詞Scale Up(垂直擴(kuò)展)和Scale Out(水平擴(kuò)展)。最典型的垂直擴(kuò)展案例是單核時(shí)代的CPU——主要靠提高主頻達(dá)到性能的提升岩睁。垂直擴(kuò)展很容易就碰上天花板钞脂,當(dāng)CPU制程工藝的提升越來越困難后,通過多核實(shí)現(xiàn)水平擴(kuò)展笙僚,對(duì)指令進(jìn)行并行處理芳肌,成為了提升CPU性能的重要手段。
正因?yàn)榇怪睌U(kuò)展會(huì)很快觸及造價(jià)肋层、技術(shù)的極限,一個(gè)不可拆分業(yè)務(wù)的串行系統(tǒng)的擴(kuò)展性(或曰性能提升能力)就會(huì)很弱——它取決于單臺(tái)設(shè)備的最大處理能力翎迁。當(dāng)我們需要對(duì)系統(tǒng)進(jìn)行擴(kuò)展時(shí)栋猖,如果有辦法將串行系統(tǒng)改造成并行系統(tǒng),那么理論上我們將可以獲得近乎無限的擴(kuò)展性汪榔。我們?cè)诳紤]對(duì)區(qū)塊鏈系統(tǒng)進(jìn)行擴(kuò)展時(shí)蒲拉,是否有無限擴(kuò)展的可能?換言之痴腌,區(qū)塊鏈能否并行地對(duì)業(yè)務(wù)進(jìn)行處理雌团?
區(qū)塊鏈?zhǔn)且粋€(gè)分布式的大賬本,里面記錄了各式各樣的狀態(tài)數(shù)據(jù)士聪,同時(shí)也記錄了這些狀態(tài)如何變化的規(guī)則锦援,智能合約正是用來記錄這些規(guī)則的載體。區(qū)塊鏈能否并行地對(duì)業(yè)務(wù)進(jìn)行處理剥悟,就取決于多個(gè)智能合約能否并發(fā)執(zhí)行——即合約的執(zhí)行是否是順序無關(guān)的灵寺。
舉個(gè)例子,某賬戶中有10元的余額区岗,現(xiàn)有兩個(gè)合約對(duì)該賬戶進(jìn)行修改略板,第一個(gè)合約在賬戶中增加5元,第二個(gè)合約在賬戶中扣除11元慈缔。如果先執(zhí)行前者叮称,則最終賬戶的余額為4元;如果先執(zhí)行后者藐鹤,由于余額不足瓤檐,第二個(gè)合約將會(huì)執(zhí)行失敗,而第一筆合約會(huì)執(zhí)行成功教藻,最終賬戶余額為15元距帅。像這樣的兩個(gè)合約由于執(zhí)行的順序不同而導(dǎo)致不同的結(jié)果,那么它們是不可以并發(fā)執(zhí)行的括堤,只能串行處理碌秸。
反過來绍移,如果兩個(gè)合約分別對(duì)兩個(gè)不同的賬戶進(jìn)行修改,那么它們無論哪一個(gè)先執(zhí)行讥电,結(jié)果都不會(huì)不同蹂窖,所以它們是可以并發(fā)執(zhí)行的。
從上面的例子可以看出恩敌,兩個(gè)合約是否可以并行處理瞬测,取決于這兩個(gè)合約是否是順序無關(guān)的;而是否順序無關(guān)纠炮,則取決于他們是否能夠?qū)ν粭l狀態(tài)記錄進(jìn)行修改月趟。
基于上面的分析,我們可以很容易設(shè)計(jì)出一個(gè)具備“無限擴(kuò)展”能力的智能合約系統(tǒng)恢口。只需要簡(jiǎn)單地規(guī)定:(1)一個(gè)智能合約只能修改屬于該合約自己的狀態(tài)記錄孝宗;(2)同一個(gè)事務(wù)批次(區(qū)塊)中,一個(gè)合約只能被運(yùn)行一次耕肩。這樣一來因妇,所有的智能合約之間都是順序無關(guān)可以平行處理了。干的漂亮猿诸!
但是婚被,等等……如果“一個(gè)智能合約只能修改屬于該合約自己的狀態(tài)記錄”,就意味著合約間無法相互調(diào)用梳虽,每個(gè)合約都是一個(gè)孤島址芯;如果“一個(gè)區(qū)塊中,一個(gè)合約只能被運(yùn)行一次”怖辆,就意味著用智能合約發(fā)行的某種數(shù)字資產(chǎn)在一個(gè)區(qū)塊里只能處理一筆交易是复。這顯然和“智能”二字的設(shè)計(jì)初衷大相徑庭。畢竟合約間的相互調(diào)用竖螃,同一區(qū)塊中多次調(diào)用同一個(gè)合約淑廊,都是我們想要的設(shè)計(jì)目標(biāo)。
這樣一來情況就變得復(fù)雜多了特咆,特別是像以太坊這種支持動(dòng)態(tài)調(diào)用(通過CALL指令)的智能合約系統(tǒng)季惩,不可能在運(yùn)行前就判斷出合約的行為和調(diào)用路徑,也就無法判斷合約會(huì)修改哪些狀態(tài)記錄腻格。因此画拾,以太坊的擴(kuò)展性一直是其設(shè)計(jì)上的一大弊病,其目前的架構(gòu)設(shè)計(jì)難以支撐以太坊成為“全球計(jì)算平臺(tái)”的遠(yuǎn)大愿景菜职。為了解決擴(kuò)展性問題青抛,以太坊提出了分片(Sharding)方案:
打個(gè)比方,分片就類似于戶籍制度酬核。計(jì)算一個(gè)合約的散列值再對(duì)256取模蜜另,就可以把合約分配到256個(gè)片區(qū)中去适室,這相當(dāng)于給每個(gè)合約分配了一個(gè)該片區(qū)的“戶口”。江蘇戶口的合約只能調(diào)用江蘇的合約举瑰,上海戶口的合約就只能調(diào)用上海的捣辆,不能直接彼此調(diào)用。
這樣一來此迅,江蘇汽畴、上海等256個(gè)片區(qū)的合約就可以按片區(qū)進(jìn)行并行處理了,看起來執(zhí)行效率可以得到256倍的提升耸序。但是在這種設(shè)計(jì)下忍些,想要跨片區(qū)調(diào)用,就必須向一個(gè)全局賬本(區(qū)塊鏈)寫入調(diào)用請(qǐng)求坎怪,另一片區(qū)的合約收到請(qǐng)求后再執(zhí)行操作坐昙,并再次寫入全局賬本來返回調(diào)用結(jié)果。這導(dǎo)致了跨片區(qū)調(diào)用無法在同一個(gè)業(yè)務(wù)批次(區(qū)塊)中完成芋忿,效率顯著降低。在真實(shí)的應(yīng)用場(chǎng)景中疾棵,分片的結(jié)果很可能是大家都擠到一個(gè)“繁華片區(qū)”中去戈钢,因?yàn)檫@樣才能最高效的進(jìn)行相互調(diào)用,避免跨區(qū)操作是尔。在城市郊區(qū)修建再多的干道殉了,也無法解決市中心的擁堵問題。
另外拟枚,智能合約代碼的加載方式也會(huì)影響到擴(kuò)展性薪铜。目前主流的區(qū)塊鏈智能合約系統(tǒng)都會(huì)要求將智能合約代碼發(fā)布到鏈上恩溅,然后再?gòu)逆溕霞虞d代碼執(zhí)行。有些合約代碼可能只被使用一次就廢棄了,但在區(qū)塊鏈中永久性地存在,占用節(jié)點(diǎn)的存儲(chǔ)資源谓传,久而久之這些廢棄代碼會(huì)成為區(qū)塊鏈的巨大負(fù)擔(dān)充边,影響擴(kuò)展性。
另一種方案际乘,是將智能合約的散列值記錄在鏈上养葵,用IPFS等以散列值為索引的新型分布式存儲(chǔ)網(wǎng)絡(luò)來存儲(chǔ)完整合約代碼庸娱。在執(zhí)行合約的時(shí)候臣樱,再?gòu)逆溚饧虞d代碼。由于合約的散列值已經(jīng)在鏈上記錄枚粘,即使從鏈外加載代碼也不用擔(dān)心合約的內(nèi)容被篡改,這樣可以為節(jié)點(diǎn)節(jié)省大量的存儲(chǔ)空間飘蚯。同時(shí)也能對(duì)智能合約的內(nèi)容進(jìn)行一定程度的隱私保護(hù)馍迄。
4福也、耦合度
耦合是指兩個(gè)或兩個(gè)以上的實(shí)體相互依賴于對(duì)方的一個(gè)量度。在區(qū)塊鏈與智能合約系統(tǒng)的設(shè)計(jì)中攀圈,對(duì)于耦合度的控制有兩個(gè)非常極端的例子:
1) 以太坊
以太坊在智能合約系統(tǒng)的設(shè)計(jì)中是高耦合的典型暴凑,區(qū)塊鏈與EVM之間到處充斥著相互依賴的關(guān)系,例如:
費(fèi)用的計(jì)算混雜在虛擬機(jī)的實(shí)現(xiàn)邏輯中赘来;
虛擬機(jī)指令集中包含大量用于訪問賬本數(shù)據(jù)的指令现喳;
虛擬機(jī)直接提供以區(qū)塊鏈賬本作為載體的持久化存儲(chǔ)指令。
將區(qū)塊鏈的業(yè)務(wù)邏輯與虛擬機(jī)混在一起犬辰,并不是一個(gè)良好的設(shè)計(jì)嗦篱。這會(huì)造成一系列的問題,一旦區(qū)塊鏈的功能需要改進(jìn)或者升級(jí)幌缝,勢(shì)必就要對(duì)EVM也進(jìn)行相應(yīng)的修改灸促,這種修改多數(shù)情況都會(huì)體現(xiàn)在增加新的指令上;而EVM幾乎沒有辦法移植到其它區(qū)塊鏈系統(tǒng)中涵卵,除非另一個(gè)鏈的底層架構(gòu)與以太坊高度一致浴栽,或者專門針對(duì)EVM開發(fā)一個(gè)對(duì)接層。這種模式會(huì)對(duì)以太坊的生態(tài)應(yīng)用造成很大的局限性轿偎,關(guān)于這一點(diǎn)我們將會(huì)在《重構(gòu)智能合約(下):兼容性與生態(tài)》中詳述吃度。
2) Fabric
與以太坊的設(shè)計(jì)模式相反,F(xiàn)abric的智能合約系統(tǒng)采用了低耦合的設(shè)計(jì)贴硫,區(qū)塊鏈賬本與Docker之間幾乎沒有任何依賴關(guān)系,因?yàn)镈ocker本身就被廣泛應(yīng)用于區(qū)塊鏈以外的大量場(chǎng)景之中伊者。在Docker中運(yùn)行的智能合約程序只能通過gRPC協(xié)議與節(jié)點(diǎn)進(jìn)行通信英遭,協(xié)議中包含了訪問賬本和持久化存儲(chǔ)的功能。當(dāng)區(qū)塊鏈的功能需要改進(jìn)或者升級(jí)時(shí)亦渗,只需要對(duì)gRPC協(xié)議進(jìn)行改動(dòng)即可挖诸。這種超低耦合度的設(shè)計(jì)模式值得其它區(qū)塊鏈的開發(fā)者學(xué)習(xí)參考。
高內(nèi)聚法精、低耦合是設(shè)計(jì)系統(tǒng)架構(gòu)時(shí)所常常追求的目標(biāo)多律。Fabric的設(shè)計(jì)目標(biāo)是打造通用的許可型區(qū)塊鏈的技術(shù)框架,因此一開始就采用了高度模塊化的設(shè)計(jì)思想搂蜓;而以太坊最初的設(shè)計(jì)目標(biāo)是一個(gè)具體的公有鏈實(shí)例狼荞,而非技術(shù)框架。因此以太坊中存在著系統(tǒng)耦合度過高的問題帮碰。這將會(huì)妨礙以太坊作為一種通用技術(shù)被使用在聯(lián)盟鏈相味、私有鏈上。
5殉挽、小結(jié)
在本篇中丰涉,我們分析了智能合約系統(tǒng)理想的執(zhí)行環(huán)境性能拓巧、并發(fā)處理能力、耦合度和代碼加載方式一死,發(fā)現(xiàn)了以太坊的一些高度抽象肛度,無灰度的設(shè)計(jì)帶來的擴(kuò)展性問題,提出了可以做到理論上“無限擴(kuò)展”的高度并行化智能合約系統(tǒng)的設(shè)計(jì)思路投慈。我們認(rèn)為一個(gè)可以良好進(jìn)行并發(fā)執(zhí)行的智能合約系統(tǒng)承耿,應(yīng)該具有以下特征:
輕量級(jí)的執(zhí)行環(huán)境:快速的啟動(dòng)時(shí)間和較高的執(zhí)行效率。
可插拔的執(zhí)行環(huán)境架構(gòu):默認(rèn)的執(zhí)行環(huán)境應(yīng)該不提供持久化存儲(chǔ)逛裤,從而讓合約默認(rèn)是一種類似于微服務(wù)的無狀態(tài)函數(shù)瘩绒,從而可以直接并發(fā)處理。僅在需要存儲(chǔ)狀態(tài)時(shí)带族,才提供可插拔的持久化存儲(chǔ)模塊锁荔。這樣的虛擬機(jī)默認(rèn)只有一個(gè)CPU和棧,僅在需要時(shí)才提供“硬盤”和其他IO設(shè)備蝙砌。
明示化的調(diào)用關(guān)系:即只提供靜態(tài)調(diào)用的功能阳堕,從而使得程序的調(diào)用關(guān)系可以在運(yùn)行它之前就整理清楚。一旦調(diào)用路徑明確了择克,那么合約可能會(huì)修改到的狀態(tài)數(shù)據(jù)也就明確了恬总,依據(jù)這些明示的調(diào)用路徑就可以進(jìn)行即時(shí)的動(dòng)態(tài)分片提高合約執(zhí)行的并行能力。
可鏈外存儲(chǔ)的合約代碼:通過鏈上存儲(chǔ)散列值肚邢,鏈外存儲(chǔ)合約代碼實(shí)現(xiàn)存儲(chǔ)空間的擴(kuò)展性壹堰。
低耦合度的設(shè)計(jì):合約語言、執(zhí)行環(huán)境骡湖、區(qū)塊鏈之間的低耦合度贱纠,提高智能合約系統(tǒng)的通用性。
在本系列最后一篇《重構(gòu)智能合約(下):兼容性與生態(tài)》中响蕴,我們將會(huì)分析現(xiàn)有智能合約系統(tǒng)對(duì)編程語言的選擇谆焊,并提出一種讓非區(qū)塊鏈開發(fā)者也能立即編寫智能合約的新模式。
由開源社浦夷、TopGeek辖试、匯智Tek聯(lián)合主辦的中國(guó)金融創(chuàng)新技術(shù)峰會(huì)(FTCon2017)將于2017年3月25日在上海舉行。
本屆大會(huì)主題為:?“更靈活高效的創(chuàng)新金融科技”劈狐。大會(huì)將邀請(qǐng)來自金融機(jī)構(gòu)罐孝、互聯(lián)網(wǎng)金融公司的CEO和高管、技術(shù)專家肥缔、創(chuàng)業(yè)者和VC投資人肾档,圍繞新時(shí)代的各種金融技術(shù)帶來的變化和機(jī)會(huì),探討創(chuàng)新技術(shù)、商業(yè)模式怒见、技術(shù)應(yīng)用俗慈、展示產(chǎn)品成果,為金融行業(yè)的CEO遣耍,高管和技術(shù)專家們搭建一個(gè)學(xué)習(xí)交流闺阱、思想碰撞的干貨分享平臺(tái)。
報(bào)名請(qǐng)點(diǎn)擊鏈接:http://event.3188.la/578804555