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