清華X-LAB區(qū)塊鏈公開課上,OK區(qū)塊鏈工程院負責人SHINE JIANG現(xiàn)場講述了OK公鏈(OKCHAIN)的創(chuàng)新架構(gòu)設(shè)計和實現(xiàn)其高性能的解決方案:
當前,比特幣以太坊等為代表的傳統(tǒng)公鏈,每筆交易都需要全網(wǎng)驗證和存儲,可擴展性受到很大的限制,導致目前的區(qū)塊鏈底層平臺上很難支撐大規(guī)模的應(yīng)用。
而OK公鏈的設(shè)計理念就是在保障安全性和去中心化的提前下,提升區(qū)塊鏈的可擴展性。設(shè)計上OKCHAIN采用多鏈狀態(tài)分片方案和基于BLS多簽方案的改進版PBFT快速共識算法大幅提升可擴展性和交易處理能力。
此外,OK區(qū)塊鏈工程院技術(shù)負責人SHINE JIANG還表示,我們要拋開“浮躁”的討論(比如顛覆互聯(lián)網(wǎng)、下一代技術(shù)革命等等),從技術(shù)層面出發(fā),研究一下區(qū)塊鏈有哪些技術(shù)的特點,為什么會受到這樣的關(guān)注,它目前的一些制約點是什么,以及現(xiàn)今在技術(shù)研究上都有哪些進展。
區(qū)塊鏈技術(shù)的發(fā)展歷程
區(qū)塊鏈1.0時代是以比特幣為代表,2008年這個概念被首次提出,2009年正式啟動了比特幣的網(wǎng)絡(luò)。這個網(wǎng)絡(luò)有別于普通意義上互聯(lián)網(wǎng),因為它在互聯(lián)網(wǎng)上面實現(xiàn)了價值的轉(zhuǎn)移。
之前互聯(lián)網(wǎng)經(jīng)歷幾十年發(fā)展,主要解決的問題是信息的互聯(lián)互通,我們在使用互聯(lián)網(wǎng)服務(wù)的同時,后面是一個個的服務(wù)商和中心化的節(jié)點。
在區(qū)塊鏈網(wǎng)絡(luò)里,它有這樣幾個特點:一是去中心化、二是不可篡改、三是可信任。它用到了計算機科學、密碼學、網(wǎng)絡(luò)和經(jīng)濟學的博弈論等等,同時加了一些創(chuàng)新性的設(shè)計。
區(qū)塊鏈的2.0是以以太坊為代表,主要特點是加入智能合約(智能合約是1995年提出的概念)。
受限于當時的環(huán)境,計算機依賴于可信的第三方,加上數(shù)據(jù)的不可篡改,操作涉及到多方會有一些限制。區(qū)塊鏈的誕生,帶來了天然的運行基礎(chǔ)平臺,區(qū)塊鏈技術(shù)與以太坊進行結(jié)合,同時擴大了場景。溯源、經(jīng)濟領(lǐng)域、游戲等很多應(yīng)用,都可以在以太坊為代表的區(qū)塊鏈2.0上去做。
了區(qū)塊鏈3.0時代,是區(qū)塊鏈的大規(guī)模應(yīng)用。盡管區(qū)塊鏈技術(shù)發(fā)展了近十年,但真正走到我們身邊的應(yīng)用很少,可以說幾乎是寥寥無幾。
目前很多的應(yīng)用,是基于聯(lián)盟鏈的企業(yè)級應(yīng)用,像天貓跨境物流的跟蹤、跨境的支付,還有像我們前面公布的疫苗溯源方案。
掣肘規(guī)模化應(yīng)用的根源
為什么發(fā)展了那么久,炒的也很熱,但區(qū)塊鏈在應(yīng)用上還沒有深入到用戶的身邊去?我們認為主要是它的可擴展性受到很大的限制,這也是目前絕大多數(shù)公鏈所努力攻破的一個點。
區(qū)塊鏈的可擴展性到底有哪些問題呢?比如去年年底風靡全球的一個游戲“加密貓”,直接導致了以太坊的嚴重堵塞。原因就是以太坊從設(shè)計上,不能支撐大規(guī)模的交易,導致了它在打包、入塊的流程上受到了阻礙。
而傳統(tǒng)中心化的交易平臺,比如Visa和支付寶,Visa的處理能力是2.4萬的TPS,支付寶“雙十一”峰值32.5萬TPS的峰值,和比特幣和以太坊最大理論的峰值(比特幣是7,以太坊是15)相比有天壤之別。
什么原因讓它的性能這么低下呢?區(qū)塊鏈里有“三元悖論”,這是以太坊提出的概念,意思是說區(qū)塊鏈領(lǐng)域不可能在同一時間、同一層面從去中心化、安全性和可擴展性三個方面做到提升。
2008年比特幣設(shè)計的時候,主要解決是資產(chǎn)的價值轉(zhuǎn)移,而在資產(chǎn)里面很重要的一個特點就是要安全性。比如說要理財、投資,肯定考慮資金的安全性,這是首要的。
在安全上的基礎(chǔ)上,我們才能考慮的是它的收益,如果你的本金都沒了,其實你投資的價值也就很少。
像比特幣和以太坊,為了提升去中心化和安全性,設(shè)計的時候每一個節(jié)點、每一筆交易都需要全網(wǎng)去廣播,全網(wǎng)節(jié)點去做驗證,每一個塊也是需要全網(wǎng)去同時爭取這樣一個記賬的過程。
當然,從這兩個點上就失去了它的可擴展性,全網(wǎng)的性能制約點就相當于取決于每個節(jié)點單點性。加入的節(jié)點越多,性能不僅沒有得到提升,消息的擴大、通信的復雜度反而更高,讓它的可擴展性受到了極大的限制。
比如EOS比較“聰明”,犧牲了去中心化,用了21個超級節(jié)點的概念,但前提認為這21個超級節(jié)點是可信的。共識基于21個超級節(jié)點之間去達成,雖然提供可擴展性,性能也得到比較大的提升,但是犧牲了去中心化區(qū)塊鏈本質(zhì)的特點。
另外有一些區(qū)塊鏈公鏈,為了提升去中心化和可擴展,只用了一些分散的存儲計算,從全網(wǎng)里面選出一小部分節(jié)點來做共識,選出一小部分節(jié)點,不同的節(jié)點之間存儲的賬本不一樣,這就讓去中心化和擴展性有一定的提升。但是這樣的話就會讓它的安全性降低,攻擊的難度也降低。
四大擴容方案
目前在區(qū)塊鏈的擴容方案里,可擴展性有四種方法:DAG、二層擴容、共識創(chuàng)新和分片技術(shù)。
DAG(有向無環(huán)圖):
DAG也叫有向無環(huán)圖,是計算機領(lǐng)域里一個比較重要的數(shù)據(jù)結(jié)構(gòu)。意思是從一個節(jié)點出發(fā),沿著箭頭的方向,不管從哪個路徑走都不會回到這個節(jié)點本身。
我們看到在傳統(tǒng)區(qū)塊鏈,比如比特幣和以太坊里面,存儲方面是一條主鏈的結(jié)構(gòu),按照時間順序由一個個的區(qū)塊組成,當一個區(qū)塊入塊了,剩下所有的節(jié)點去競選下一個區(qū)塊的記賬權(quán),從而來獲取記賬的分紅。
我們可以認為,這是一個同步的過程,一是全網(wǎng)同步的去出同一個區(qū)塊,另外對每一筆交易全網(wǎng)都要去做驗證,并且每個節(jié)點存儲區(qū)塊鏈的信息,帶來的好處就是保證了嚴格的一致性。
而DAG里面它改變了這樣一個存儲結(jié)構(gòu),它認為區(qū)塊鏈里面比特幣、以太坊等,每一個塊包含了多筆交易,并且基于時間順序來做的。
在DAG這個網(wǎng)絡(luò)里面,每一個這樣的節(jié)點只是一筆交易,不是一個塊的概念。后面的一筆交易通過一定的策略,會連到前面的多筆交易上面去,并且會對前面這樣一個交易做一個驗證。
這樣做的好處,就是它把這樣一個原來同步的存儲改成了異步,理論上來說是支持無限的擴展。TPS也可以無限的大,但是它有一個問題,就是如果有一個節(jié)點,后面沒有人鏈接到他,相當于沒有人驗證他這一筆交易的有效性,就永遠得不到確認。
另外由于沒有使用強一致性,尤其是智能合約運行的時候,它運行一段時間有可能會導致出現(xiàn)“雙花”、不一致的現(xiàn)象,安全性并沒有得到廣泛的驗證。在這種存儲結(jié)構(gòu)里,由于比特幣和以太坊都是這種存儲結(jié)構(gòu),運行了十年,也沒出現(xiàn)問題,它的安全性經(jīng)過了實際工程的檢驗。
另外在DAG里,每一筆交易之間的溯源,因為它的圖復雜度極高,和區(qū)塊鏈里單鏈的結(jié)構(gòu)來比,它的復雜度極高。
二層擴容:
其中的邏輯是把鏈分成兩種,原來的鏈還是比特幣、以太坊的主鏈,但另外又生成了側(cè)鏈,將復雜的交易和頻繁的交易放到鏈下,最終的確認放到主鏈上去做,這樣做的好處就是減少了主鏈的壓力。
但最后總體的性能瓶頸很明顯還是主鏈,最高像以太坊來說也就是15,對性能的提升很有限。
Algorand是圖靈獎得主Micali提出公鏈的設(shè)計方案,他認為這個方案突破了“不可能三角”,共識算法采用了VRF+POS+BA*的算法。
它的設(shè)計的思路是,比特幣和以太坊里每一筆交易要全網(wǎng)廣播、全網(wǎng)做驗證,這里只是隨機選出來一小部分節(jié)點,讓一小部分節(jié)點去做出塊的提名人、驗證人和出塊節(jié)點。
共識的范圍降到了幾個節(jié)點之間,用一些算法保證節(jié)點選取的隨機性,得到了一定的安全保證,所以說加快了交易的吞吐量。但是這個方案目前并不完善,可擴展性也是有限的,它的理論值是2000,但最終的理論值是200,實測會到1000左右。
Dfinity是另外一個從共識方法上去改進區(qū)塊鏈可擴展性的一條公鏈,一度被認為是區(qū)塊鏈的3.0。它的思路和Algorand有點相似,也是將整個網(wǎng)絡(luò)選舉出一小塊的局域的幾個節(jié)點,在這個節(jié)點之間再選出共識的委員會,在這個委員會用了BLS多簽的方法出塊。
一定程度上來說,兩個方面,一是共識組由全網(wǎng)變成局部的網(wǎng)絡(luò),第二是在共識的方法上做了創(chuàng)新,用了BLS多簽的方案,也是提升了交易量。
分片技術(shù)(Sharding):
和前面兩個共識相比,隨機選取一小個節(jié)點來說,就更近了一步。在比特幣、以太坊里性能取決于單點的性能,加入的節(jié)點越多,網(wǎng)絡(luò)沒有更好,反而更壞。
是不是存在這樣一種方案讓它可以并行?比如說把它切分到一塊,這就有了分片技術(shù)。分片是數(shù)據(jù)庫里面的概念,提供數(shù)據(jù)庫橫向擴展的方法,通過將數(shù)據(jù)庫切分到不同的數(shù)據(jù)庫上,來提升服務(wù)器對數(shù)據(jù)庫訪問IO的可擴展性。
把分片用在區(qū)塊鏈里面,通過一定的機制和方法,將整個區(qū)塊鏈網(wǎng)絡(luò)分成若干的共識組,每個共識組交易量之和,就是整個這條鏈的整體吞吐量。
這個地方設(shè)計了幾個重點,第一是如何進行共識組的選舉?選出來的共識組,如果里面有大量的拜占庭節(jié)點(可以理解為壞的節(jié)點),相當于在這個節(jié)點組里安全性受到極大的挑戰(zhàn)。
另外,就是分片的大小是不是合理。如果分片太小了,幾個拜占庭節(jié)點有可能影響分片的安全性。如果分片太大,影響片內(nèi)的交易太多,也會影響一定的吞吐量。當然,分片太小還有一個問題,就是跨片的交易會多,跨片的交易還不如原來的一個網(wǎng)絡(luò)。
分片技術(shù)目前分為三個:網(wǎng)絡(luò)分片、交易分片和狀態(tài)分片。
交易分片是在網(wǎng)絡(luò)分片的基礎(chǔ)上去實現(xiàn),通過將整體網(wǎng)絡(luò)分成若干分片,每個分片并行進行交易,但是全網(wǎng)所存儲的還是一個賬本。
每個節(jié)點的存儲壓力依然是存在,狀態(tài)分片的好處就是每個分片只存儲本分片的部分賬本,這樣的話從交易和存儲兩方面去提升它的擴展性。隨著分片的越多,整體網(wǎng)絡(luò)性能也就越大。這也是OK公鏈選擇的方式,也是我們選擇分片的原因之一。
這是我們的設(shè)計目標,我們在“不可能三角”這個理論下做的一些工作。保證一定的去中心化和一定安全的前提下,去提升公鏈的可擴展性。其實在比特幣和以太坊里面,也嘗試過有很多其他的方法,比如說是增加區(qū)塊的大小,一個區(qū)塊是不是能打包更多的交易,第二個是縮短區(qū)塊的出塊時間,時間縮短。但是這些方案一是有一定問題,二是對性能的提升也極其有限。
五大角度解讀OK公鏈技術(shù)選型
關(guān)于OK公鏈的技術(shù)選型,我們選擇了這樣的分片技術(shù),理由有二:
其一,它能夠從存儲和交易兩個方面去提升區(qū)塊鏈的可擴展性;
其二,它的理論模型并不復雜,在可推導的理論模型里面,我們能證明它是能滿足一定的去中心化和安全性,并且還能夠?qū)蓴U展性做一定的提升。
它的難點我們在前文已經(jīng)介紹了,而且其在工程上也是非常復雜,目前在整個業(yè)界里還沒有一個公開出來的分片技術(shù)。
我們可以從網(wǎng)絡(luò)分片、交易分片、狀態(tài)分片、片內(nèi)共識、分片伸縮等五個方面來具體解釋和了解。
第一,網(wǎng)絡(luò)分片;
在P2P網(wǎng)絡(luò)里我們分成了若干的共識組,在每個共識組里再去運行一定的共識機制。這些共識組內(nèi)有一個Leader節(jié)點。
我們再把這些共識組分成兩類:一是委員會、二是普通分片,也可以稱之為交易分片。
委員會扮演兩個作用:一是對整個網(wǎng)絡(luò)進行管理;二是管理自身委員會內(nèi)部的成員。而所有委員會的內(nèi)部成員,可以分為三種:委員會的成員、分片的礦工、普通礦工。
邏輯上比較復雜的是,究竟如何選舉委員會、如何進行分片,來保證整個公鏈的安全性,同時實現(xiàn)片內(nèi)的交易更多,跨片的交易更少?
這里共分為4大階段,首先是準備階段。
我們定義為一個epoch(在下面有兩個管理區(qū)塊,兩次委員會的輪替之間的間隔)一個epoch結(jié)束時,各分片統(tǒng)計本分片內(nèi)符合條件的賬戶作為侯選礦工,上報給委員會。
這是為了防止女巫攻擊,我們使用了PoS股權(quán)證明的方法,每一個參與挖礦的礦工,必須交一定的保證金,這樣想注冊大量礦工節(jié)點去執(zhí)行拜占庭攻擊的時候,成本會有一定的提升,這也是我們對安全性的第一步保證。
其次分別是開始和POW階段,委員會收集到礦工的集合,然后廣播競選的消息,各個礦工開始計算自己的PoW,并將計算結(jié)果提交給委員會,此處計算PoW不是為了挖礦,只是為了算隨機值,作為分片和選舉的依據(jù)。
最后是確定階段,委員會搜集到PoW的消息,按照哈希值的排序選出新的委員會節(jié)點和分片節(jié)點(哈希值最小的節(jié)點是委員會的節(jié)點),并且將競選結(jié)果寫入管理區(qū)塊,這個管理區(qū)塊是在委員會里面進行共識,全網(wǎng)廣播,同時宣布新一輪的epoch開始。
這里我們需要著重強調(diào)的有幾個地方。第一,我們用了PoS來抵制女巫攻擊;第二,PoW不是進行挖礦,只是計算隨機值,對資源的消耗也比較少一些。
第二,交易分片;
進行網(wǎng)絡(luò)分片只是第一步 ,只有實現(xiàn)了交易分片,才能使各個分片能并行處理,減少冗余計算和增加整個系統(tǒng)的吞吐性。
在交易分片里面會涉及到兩方,一個是發(fā)送方,一個是接收方。我們采用的方法就是以發(fā)送方的地址進行分片,這樣的好處就是發(fā)送方進行雙發(fā)消息的時候,交易在同一個區(qū)塊里進行打包共識,很容易被發(fā)現(xiàn),一定程度上是讓雙花攻擊的難度變大。
同時,我們允許一個用戶用一對公鑰在每一個分片里面創(chuàng)建賬戶(可以簡單理解為一個用戶用一個公鑰可以在每一個分片里面建賬戶,文章后面我們會介紹它的好處)。
第三,狀態(tài)分片;
狀態(tài)分片里面的設(shè)計思路,是讓片內(nèi)的交易逐步增多,讓跨片的交易逐步減少,而并不是排斥這種跨片的交易。一個跨片交易所執(zhí)行的步驟,就是分片a和分片b,分片a里的用戶a和分片b里的用戶b進行交易,有兩個步驟減少a的余額和增加b的余額。
現(xiàn)在,我們提出了一個支票的概念,就是分片a里出塊以后,通過一個“支票”發(fā)給分片b處理,分片a在出塊以后通過一個區(qū)塊,會發(fā)出支票的消息。
在這個里面有三個分片,分片a、分片b和分片c,其中有三個是跨分片交易。為了減少通信復雜度,在區(qū)塊里面,每個分片相關(guān)的交易會打包成一個支票區(qū)塊。
將多筆支票打包成一個支票的區(qū)塊,發(fā)給分片a和分片b,分片b里面兩筆支票打包成一個支票區(qū)塊,發(fā)給分片b,c里面有一筆,這樣的話整個系統(tǒng)在跨分片交易的時候,通信復雜度是O(n)方,在跨分片交易足夠少,因為分片也不會特別大,這是一個很容易實現(xiàn)的方案。
另外,我們在存儲上面使用了雙鏈的結(jié)構(gòu),每個分片內(nèi)存儲兩條鏈,一個是狀態(tài)區(qū)塊,一個是交易區(qū)塊,交易區(qū)塊是只存儲本分片的交易,而狀態(tài)區(qū)塊它是由交易區(qū)塊和支票區(qū)塊派生而來的。
那一筆跨分片的交易是如何進行的?我們將其分成了兩個階段:
第一個階段,假設(shè)a和b之間轉(zhuǎn)賬,這里有一個分片派生出來三個“支票”區(qū)塊,分別是C12和C13、C21和C23,C31和C32,六個跨分片的支票區(qū)塊和三個交易區(qū)塊;
第二個階段,通過廣播將支票區(qū)塊發(fā)送到對應(yīng)的分片里去,對應(yīng)的分片接收支票區(qū)塊,通過交易區(qū)塊和支票區(qū)塊生成最終的狀態(tài)區(qū)塊。
另外,分片里面智能合約和以太坊里面的智能合約有不一樣的地方,就是它有跨分片的智能合約調(diào)用。
如何理解跨分片的智能合約調(diào)用?首先,調(diào)用分片2里面的交易區(qū)塊,鎖定賬戶余額,發(fā)送調(diào)用信息到分片b,分片b調(diào)用相應(yīng)的合約,修改合約的狀態(tài),收取交易的gas費用,將剩余的gas費用返回給分片1,涉及到三次更新和兩次的跨分片交易。
為了減少跨分片調(diào)用,我們在設(shè)計的時候,只支持分片內(nèi)的調(diào)用,而不支持跨分片的調(diào)用。原因是相互關(guān)聯(lián)、相互調(diào)用的合約不會部署在同一個分片上,這對于開發(fā)者來說是比較合理,也是容易做到的。
另外用戶可以在任意分片里創(chuàng)建自己的賬戶。比如說分片1里的用戶,要想調(diào)用分片2里合約的話,可以在分片2里面去建賬戶,把跨分片變成了一個片內(nèi)智能合約的調(diào)用交易。這從一定程度上我們希望把相關(guān)的業(yè)務(wù)都放在一個分片里,這樣相關(guān)性越高,片內(nèi)交易也就越高,并發(fā)性也就越好。相當于我們支持了一個片內(nèi)的合約調(diào)用:用戶到合約、合約到合約、合約到用戶。
還有一個方法是在分片2里建一個用戶,我們可以用跨分片的交易來做到。首先分片1里面的用戶,調(diào)用分片2里的合約,給分片2里面的用戶做一筆轉(zhuǎn)賬交易,然后分片2里面的用戶再調(diào)用這個合約,這就是跨分片之間智能合約的調(diào)用的流程。
第四,片內(nèi)共識;
分片技術(shù)有一個值得注意的點,每個分片里節(jié)點數(shù)是固定的,比較方便用其他的共識算法。缺點是它存在51%的算力的攻擊,因為它是一個開放的網(wǎng)絡(luò),誰都可以動態(tài)接入、動態(tài)退出,而分片里面每一個分片的用戶數(shù)是一定的,比較方便用其他的共識算法,比如PBFT算法的好處,第一它能抵三分之一的拜占庭節(jié)點,它的網(wǎng)絡(luò)依然能保證安全運行。
我們進一步改進了PBFT。首先,Leader打包一個區(qū)塊(我們前面介紹的分片里面都有一個Leader的角色,PBFT共識里面需要有一個Leader,他是負責發(fā)起共識的一個發(fā)起方。),廣播給其他節(jié)點,每個節(jié)點去驗證這個區(qū)塊,驗證通過的其他節(jié)點再廣播這個區(qū)塊摘要。
如果一個節(jié)點收到2f+1(f是容忍的拜占庭節(jié)點的個數(shù))個其它節(jié)點發(fā)來的摘要都和自己相等,就向全網(wǎng)廣播一條Commit消息,即可提交新區(qū)塊及其交易到本地的區(qū)塊鏈的狀態(tài)數(shù)據(jù)庫。在這里,我們可以告訴他們通信的復雜度,假設(shè)節(jié)點數(shù)是n的話,這個復雜度就是O(n2)方。
另外,我們用了BLS的簽名,有兩個特點。一是聚合、一是短簽名,可以將多筆交易聚合成一個簽名,這樣把消息通信的復雜度和存儲簽名的大小做到了降低,而且不需要進一步通信就能生成一個多重簽名,減少通信的次數(shù)。
我們改進了PBFT的算法,這里的邏輯首先同樣是Leader打包區(qū)塊,廣播給其他的節(jié)點,每個節(jié)點來驗證這個區(qū)塊,驗證通過區(qū)塊簽名發(fā)送給Leader。
leader收集到2f+1個簽名之后,可以聚合成一個多重簽名sig1,leader將sig1和sig1參與方bitmap1廣播給其他節(jié)點,其他節(jié)點對sig1和bitmap1的合法性進行驗證。
為了確保全網(wǎng)賬本一致,還需對block+sig1+bitmap1進行一輪多簽;leader收集到2f+1個簽名之后,可以聚合成一個多重簽名sig2。leader將sig1,sig2和對應(yīng)的bitmap2發(fā)送給其他節(jié)點,其他節(jié)點驗證通過后將block+sig1+bitmap1寫入賬本,通過改進PBFT的算法,將消息的復雜度從O(n2)方變成了O(n)。
還有一個就是Leader的輪替,如果Leader是拜占庭節(jié)點的話,會阻礙區(qū)塊的產(chǎn)生,常用方案第一個是Round-Robin順序選取的方法,一個是VRF生成隨機生成區(qū)塊。
第五,分片伸縮;
在分片里比較難的就是分片伸縮,這里有兩個操作:一是新增分片,一是凍結(jié)分片。
新增分片的時候,各個分片會出現(xiàn)負載過重的情況,網(wǎng)絡(luò)中有足夠多的礦工可以安全性的去維護這個分片,達到一個新分片所安全運行的理論值,這個時候我們通過線上的委員會的監(jiān)控和線下社區(qū)的投票,由委員會修改參數(shù),來增加這分片。
凍結(jié)分片是在狀態(tài)分片里比較難做的,相當于在每個狀態(tài)分片里,每個分片存儲的局部賬本,如果一個分片砍掉的話,這個分片里的賬本有可能失效。
在這種情況下,每個分片的節(jié)點少,不滿足安全性的時候,也是通過委員會和社區(qū)共識之后,該分片遷移到其他分片。這個分片里面的賬本由委員會來維護。下一次新建的時候再有委員會交給分片,這從一定程度上保證了全局賬本的一致性。
評論
查看更多