黃振業(yè) 蘇 波
1(浙江金融職業(yè)學(xué)院信息技術(shù)學(xué)院 浙江 杭州 310018)2(北京魔鏈科技有限公司 北京 100080)
2008年11月,有人以中本聰(Satoshi Nakamoto)為化名發(fā)表了一篇研究論文[1],介紹了一種名叫比特幣(Bitcoin)的新型電子現(xiàn)金系統(tǒng)。這種全新的數(shù)字貨幣具有使用方便、難以追蹤等特性,它組合了密碼學(xué)、工作證明和點對點網(wǎng)絡(luò)等技術(shù)[2],創(chuàng)新地提出了一種分布式時間戳服務(wù)器,可用于分布式系統(tǒng)中數(shù)據(jù)的有序存儲,這項技術(shù)在之后被稱為“區(qū)塊鏈”(Blockchain)[3]。世界各地的一些計算機愛好者利用設(shè)備和特殊軟件進行“挖礦”,并形成一個網(wǎng)絡(luò)來共同維持區(qū)塊鏈。經(jīng)過幾年的發(fā)展,人們發(fā)現(xiàn)其潛力遠不止電子貨幣。以2015年10月英國《經(jīng)濟學(xué)人》雜志發(fā)表的《信任的機器》(The Trust Machine)的封面文章為標志,大家意識到作為比特幣底層技術(shù)的區(qū)塊鏈,其價值甚至超過了比特幣本身的價值。
比特幣被稱為區(qū)塊鏈1.0,因為比特幣本身只是區(qū)塊鏈技術(shù)在金融領(lǐng)域的一個應(yīng)用,并沒有太多辦法在其上開發(fā)其他去中心化的應(yīng)用。2015年初,被稱為區(qū)塊鏈2.0的以太坊的第一個版本面世了。以太坊是一個去中心化區(qū)塊鏈應(yīng)用的開發(fā)平臺,它對比特幣區(qū)塊鏈的一個最主要的增強是引入了圖靈完備的智能合約,開發(fā)者可以編寫智能合約代碼來實現(xiàn)其行業(yè)內(nèi)在的業(yè)務(wù)邏輯,這為應(yīng)用區(qū)塊鏈技術(shù)解決行業(yè)問題打開了廣闊的空間。
隨著區(qū)塊鏈技術(shù)在傳統(tǒng)行業(yè)中的大量應(yīng)用,現(xiàn)有區(qū)塊鏈平臺的局限逐漸暴露出來,人們發(fā)現(xiàn)以太坊在實際行業(yè)應(yīng)用落地中面臨著諸多問題。
在分布式系統(tǒng)領(lǐng)域有一個帽子(CAP)理論:一個分布式系統(tǒng)不可能同時實現(xiàn)一致性(Consistency),可用性(Availability)以及分區(qū)容忍性(Partition Tolerance)。它可滿足其中任意兩個要求,但不能同時滿足三個。對應(yīng)在區(qū)塊鏈工程技術(shù)領(lǐng)域,也有一個“不可能三角”:完全去中心化、安全性和可擴展性,三者不可以兼得。如圖1所示。
(1) 完全去中心化(Fully Decentralized):網(wǎng)絡(luò)中在邏輯上不存在單個或多個中心節(jié)點。
(2) 安全性(Security):網(wǎng)絡(luò)是否存在被惡意攻擊導(dǎo)致癱瘓、區(qū)塊被篡改的可能性。
(3) 可擴展性(Scalability):可以通過增加計算資源等方式有效提高網(wǎng)絡(luò)的吞吐能力。
圖1 區(qū)塊鏈“不可能三角”
比特幣和以太坊做到了完全去中心化和安全性,所以可擴展性(效率)很差,比特幣的交易處理能力約為7 TPS,以太坊的交易處理能力大約為15 TPS,并且無法通過擴展服務(wù)器數(shù)量和計算能力來提高。
既然區(qū)塊鏈技術(shù)領(lǐng)域存在一個無法突破的“不可能三角”,那么怎樣在工程領(lǐng)域突破這個理論限制,讓區(qū)塊鏈技術(shù)可以在更廣闊的空間里得到應(yīng)用?目前存在以下幾種探索的思路。
犧牲“不可能三角”的一維,只實現(xiàn)部分的去中心,即可達到較好的可擴展性。時下比較熱門的EOS項目即采用這種辦法[4],使用委托權(quán)益證明機制(Delegated Proof of Stake,DPOS)共識算法,只有“授權(quán)代表”有記賬的權(quán)力?!笆跈?quán)代表”是擁有超級計算能力的超級節(jié)點,由區(qū)塊鏈網(wǎng)絡(luò)中用戶投票選舉產(chǎn)生,因為總數(shù)不多且計算能力強,因此,提高了全網(wǎng)同步的速度及出塊的速度。
這種實現(xiàn)部分去中心的做法在實際應(yīng)用中是有應(yīng)用場景的,因為現(xiàn)實世界中很難找到可以完全去中心化的業(yè)務(wù)場景,所以很難說它不是比完全去中心化的區(qū)塊鏈更符合實際;缺點則是中心化導(dǎo)致的不安全、超級節(jié)點易被攻擊以及串通作惡等問題。
傳統(tǒng)的區(qū)塊鏈是鏈表式數(shù)據(jù)結(jié)構(gòu),每個區(qū)塊(Block)唯一記錄著前一個區(qū)塊內(nèi)容的哈希值(Hash),每個區(qū)塊有固定的出塊時間,必須保證一定的時間間隔,才能在全網(wǎng)或者“授權(quán)代表”間達成共識。這種鏈表結(jié)構(gòu)以及同步機制決定了傳統(tǒng)區(qū)塊鏈網(wǎng)絡(luò)的吞吐能力。
對此,有一種做法是采用圖論中的有向無環(huán)圖(Directed Acyclic Graph,DAG)進行改進。相比于一般圖,DAG的很多問題可以在多項式級甚至線性復(fù)雜度條件下得到解決,這使得通過DAG結(jié)構(gòu)記錄交易賬本并取得分布式共識成為可能。
采用DAG技術(shù)的區(qū)塊鏈中,交易不再是按照區(qū)塊進行組織,各個交易之間按照一定的規(guī)則組成DAG網(wǎng)絡(luò),確實可以提高區(qū)塊鏈網(wǎng)絡(luò)的吞吐能力。原因在于,不必在一定的時間間隔后才能出塊,交易經(jīng)過廣播后可以直接上鏈。但缺點是,即使上鏈了,仍然需要等待一段時間以得到足夠多的交易確認才算達成共識;同時系統(tǒng)的復(fù)雜度大大增加了。
圖2為采用DAG技術(shù)的區(qū)塊鏈網(wǎng)絡(luò)結(jié)構(gòu)圖,來自Byteball項目白皮書[5]。
圖2 采用DAG的區(qū)塊鏈結(jié)構(gòu)
分層處理方法在計算機軟件系統(tǒng)設(shè)計中是一種經(jīng)過驗證的比較普遍的系統(tǒng)設(shè)計思路,適用于設(shè)計復(fù)雜的軟件系統(tǒng),可以提升系統(tǒng)的處理能力?;ヂ?lián)網(wǎng)最成功的分層設(shè)計就是網(wǎng)絡(luò)協(xié)議分層,就是我們熟知的七層網(wǎng)絡(luò)結(jié)構(gòu)。其基本設(shè)計原則是:各層是獨立的,各自層做好自己的事即可;層和層之間的功能是不一樣的;層和層之間的交流都是通過接口通信,只要接口保持不變,層內(nèi)部的設(shè)計可以改變,且不會影響別的層。
區(qū)塊鏈系統(tǒng)的技術(shù)堆棧可分三個層次:相互通信的計算機節(jié)點網(wǎng)絡(luò);讓節(jié)點可以一致認可新區(qū)塊的共識算法;擁有自身狀態(tài)的應(yīng)用層(區(qū)塊鏈狀態(tài)機,存儲智能合約的最終計算結(jié)果)。這三個部分構(gòu)成一條完整的區(qū)塊鏈,如圖3所示。
圖3 區(qū)塊鏈系統(tǒng)分層結(jié)構(gòu)圖
除此之外,區(qū)塊鏈系統(tǒng)還流行一種多鏈的技術(shù)架構(gòu),即:一個單一的區(qū)塊鏈網(wǎng)絡(luò)由多條區(qū)塊鏈組成,不同的鏈有不同的角色定位。如比特幣區(qū)塊鏈有閃電網(wǎng)絡(luò)作為側(cè)鏈[6],以太坊有Plasma作為二層鏈[7],卡爾達諾鏈分為兩層[8]。多鏈架構(gòu)中的主鏈通常是完全去中心化,負責(zé)記賬結(jié)算;所謂的側(cè)鏈、子鏈或二層鏈有部分中心化的特征,以提高處理效率。
本文方案將以太坊區(qū)塊鏈的交易處理和智能合約的計算分離。這是一個雙層鏈:L1層是結(jié)算層,只處理交易數(shù)據(jù),沒有智能合約,采用DAG技術(shù),以提高網(wǎng)絡(luò)吞吐能力,提升終端用戶體驗;L2層是計算層,實現(xiàn)智能合約,采用高性能的超級計算節(jié)點,在后臺實現(xiàn)商業(yè)應(yīng)用要求的復(fù)雜計算。L1層和L2層區(qū)塊鏈可解耦,將來L2層可以適配新的更高效的L1層區(qū)塊鏈; L1層可以采用適用于記賬結(jié)算的任何共識算法,L2層則必須采用委托權(quán)益證明共識算法或類似的“授權(quán)代表”算法。
技術(shù)架構(gòu)如圖4所示。
圖4 技術(shù)架構(gòu)圖
如圖4所示,在系統(tǒng)中并行著兩條區(qū)塊鏈,基礎(chǔ)的是結(jié)算層。結(jié)算層記錄用戶之間的轉(zhuǎn)賬交易,也可以觸發(fā)對智能合約的調(diào)用;但是智能合約的發(fā)布和運行并不在結(jié)算層,是在計算層區(qū)塊鏈上。
我們在從頭同步一個以太坊全節(jié)點時會發(fā)現(xiàn),區(qū)塊的同步很快就可以完成,通常是幾個小時的工作量;之后對狀態(tài)的同步經(jīng)常要花費數(shù)天的時間才可以更新到最新的狀態(tài)。原因是區(qū)塊僅僅是記錄著交易,沒有計算的工作量,截至本文撰稿日時,一共有7 750 921個區(qū)塊,平均大概每分鐘產(chǎn)生一個區(qū)塊。但是狀態(tài)就不同了,狀態(tài)的數(shù)量是由智能合約中記錄的可持久變量和智能合約被調(diào)用的次數(shù)決定的。而且狀態(tài)的同步是需要每個節(jié)點在本地重新對智能合約進行運算來完成的。這對以太坊節(jié)點來說是個不可承受的工作量。
這就是將以太坊原有的結(jié)構(gòu)分拆為兩條鏈的原因。讓結(jié)算層區(qū)塊鏈只完成記賬結(jié)算的功能,這樣結(jié)算層的節(jié)點以普通的計算機資源即可運行,可以加入更多的節(jié)點來去中心化;把智能合約的運算放在計算層,留給計算層的超級節(jié)點或者云來完成。兩者采用異步通信的方式。
(1) 結(jié)算層。結(jié)算層采用DAG技術(shù)實現(xiàn),賬戶系統(tǒng)采用未花費的交易輸出(Unspent Transaction Output,UTXO)模式[1],不像以太坊通過狀態(tài)記錄賬戶錢包余額,僅僅通過區(qū)塊即可計算賬戶余額。交易分為兩種,一種是用戶間轉(zhuǎn)賬,另一種是調(diào)用智能合約。對智能合約的調(diào)用是異步的,計算層將監(jiān)聽對智能合約的調(diào)用進行實際的合約代碼執(zhí)行。在結(jié)算層上可以采用去中心化效果較好的工作量證明(Proof of Work,PoW)或權(quán)益證明(Proof of Stake,PoS)共識算法,以獲得更多的用戶支持和更安全的網(wǎng)絡(luò)。對于普通的轉(zhuǎn)賬結(jié)算的用戶來說,只同步結(jié)算層的區(qū)塊鏈就可以了,不需要對計算層做同步,可以實現(xiàn)點對點支付、積分等簡單記賬類的應(yīng)用。
(2) 計算層。在計算層我們采用超級節(jié)點的方法,超級節(jié)點提供智能合約的計算服務(wù)。可以在超級節(jié)點上提供強大的計算資源,甚至在超級節(jié)點的背后采用云計算、并行計算技術(shù)來提供充足的算力。超級節(jié)點讀取到結(jié)算層發(fā)起的對智能合約的調(diào)用請求,采用委托權(quán)益證明共識機制,選舉一個出塊人,執(zhí)行智能合約的計算,并應(yīng)用計算結(jié)果修改狀態(tài)機的全局最終狀態(tài),將此全局最終狀態(tài)打包進區(qū)塊并用私鑰簽名,廣播給其他節(jié)點進行驗證;其他節(jié)點驗證無誤后添加自己的簽名,該區(qū)塊最終獲得足夠多的簽名確認,被區(qū)塊鏈網(wǎng)絡(luò)所接受。智能合約的調(diào)用者可以選擇信任某個超級節(jié)點,訂閱事件通知,異步收到智能合約的調(diào)用結(jié)果;有一定算力的用戶也可以同步計算層的狀態(tài),以在本地進行驗證。
(3) 層間通信。結(jié)算層不知道計算層的存在,計算層可以看到結(jié)算層,并監(jiān)聽和讀取結(jié)算層的區(qū)塊數(shù)據(jù)。兩者的數(shù)據(jù)分開存儲:交易數(shù)據(jù)存儲在結(jié)算層,狀態(tài)數(shù)據(jù)存儲在計算層。
本文給出的設(shè)計架構(gòu)仍然在設(shè)計開發(fā)階段,并沒有得到實際的測試數(shù)據(jù)來檢驗是否能夠達到預(yù)期的改進目標。
一份對采用DAG技術(shù)的區(qū)塊鏈Byteball主網(wǎng)的最新測試給出了三點結(jié)論:
(1) 交易處理速度僅能達到15 TPS左右;
(2) 網(wǎng)絡(luò)容易遭受DoS攻擊,大量突發(fā)式的惡意交易會阻塞網(wǎng)絡(luò)、降低網(wǎng)絡(luò)的交易處理速度;
(3) 隨著交易數(shù)量增加,交易確認時間可以保持平穩(wěn)。
作為DAG基礎(chǔ)鏈,這個壓力測試和大家的預(yù)期很不相符,顯然沒有充分發(fā)揮DAG技術(shù)的優(yōu)勢。不同于傳統(tǒng)區(qū)塊鏈交易處理速度受限于區(qū)塊大小,Byteball網(wǎng)絡(luò)的交易處理速度與代碼執(zhí)行速度、網(wǎng)絡(luò)傳輸時延、硬件處理能力等都可能有關(guān)系。Byteball的創(chuàng)始人認為其代碼實現(xiàn)中大量的SQL連接操作增加了處理時延,這可能是影響B(tài)yteball處理性能的重要原因。
顯然,如果僅僅是SQL查詢導(dǎo)致的性能問題,這實際上是區(qū)塊鏈技術(shù)限制之外的領(lǐng)域,是比較容易進行優(yōu)化的。但仍然需要在實際的產(chǎn)品測試中不斷地去檢驗其產(chǎn)品的設(shè)計架構(gòu)是否滿足預(yù)期,并適時調(diào)整。
我們已經(jīng)計劃使用以上的設(shè)計架構(gòu)來實現(xiàn)一些行業(yè)應(yīng)用的需求,比如在藝術(shù)品行業(yè),我們正在開展一個全新的基于區(qū)塊鏈的藝術(shù)品平臺,在此之上建立一個開放的藝術(shù)品價值發(fā)現(xiàn)平臺,通過技術(shù)手段為藝術(shù)品建立可信的價值評判體系。如表1所示,藝術(shù)品行業(yè)存在的行業(yè)痛點,以及期待采用區(qū)塊鏈技術(shù)可以解決的問題。
表1 藝術(shù)品行業(yè)痛點
為解決以上的痛點,規(guī)劃該藝術(shù)品區(qū)塊鏈的三大功能模塊:登記平臺、定價平臺和交易平臺,如圖5所示。為了完成藝術(shù)品的完整交易流程,在區(qū)塊鏈上實現(xiàn)對藝術(shù)品的登記追溯、定價投票和在線交易。
圖5 藝術(shù)品區(qū)塊鏈功能結(jié)構(gòu)圖
以上業(yè)務(wù)流程需要在智能合約中實現(xiàn),包含大量的計算工作量,需要良好的用戶體驗,這在目前的以太坊區(qū)塊鏈上是無法進行的,而本文提出的方案可以解決這個問題。
本文介紹了區(qū)塊鏈2.0時代的代表——以太坊在當(dāng)前階段面臨的問題,同時面臨著解決當(dāng)前問題的“不可能三角”,在此種情況下根據(jù)區(qū)塊鏈行業(yè)技術(shù)的最新發(fā)展,提出幾種可能的改進方向,包括:部分犧牲去中心化、應(yīng)用DAG技術(shù)和系統(tǒng)分層。
同時,基于這幾種改進的方向,提出一個分層的區(qū)塊鏈設(shè)計架構(gòu),在底層結(jié)算層應(yīng)用DAG技術(shù)提供交易的吞吐量,建立一個“第二層”——計算層實現(xiàn)智能合約功能。
雖然該設(shè)計架構(gòu)并未得到實際測試數(shù)據(jù)的支持,但在一定程度上代表著區(qū)塊鏈技術(shù)的演進方向,至少是一種短期內(nèi)有效的臨時解決方案,因為不可否認,目前對于區(qū)塊鏈技術(shù)來講還是處于早期的發(fā)展演進階段,長期的解決方案仍然在技術(shù)構(gòu)想或者正在開發(fā)中。