當(dāng)Daniel Larimer在4月5日發(fā)布了EOSIO Dawn 3 0不久后EOS價(jià)格大幅度上漲多天。該預(yù)備版本的發(fā)布代表著目標(biāo)在2018年6月發(fā)布正式版EOSIO
當(dāng)Daniel Larimer在4月5日發(fā)布了EOSIO Dawn 3.0不久后EOS價(jià)格大幅度上漲多天。該預(yù)備版本的發(fā)布代表著目標(biāo)在2018年6月發(fā)布正式版EOSIO 1.0的奮斗途中一個(gè)重要里程碑,并且EOS全球開發(fā)團(tuán)隊(duì)為使EOSIO成為構(gòu)建區(qū)塊鏈應(yīng)用最強(qiáng)大的平臺(tái)正日以繼夜地工作著。筆者發(fā)現(xiàn)該版本中最引人矚目的地方要數(shù)500毫秒出塊間隔和BFT-DPoS的共識(shí)算法,這無(wú)疑是EOS為達(dá)到支持百萬(wàn)級(jí)別用戶的區(qū)塊鏈系統(tǒng)中最核心的技術(shù)突破,因此本文將詳細(xì)分析BFT-DPoS共識(shí)算法并解讀其為何可達(dá)到遠(yuǎn)遠(yuǎn)超出其它區(qū)塊鏈系統(tǒng)的500毫秒出塊間隔的性能。
為使讀者能順利理解BFT-DPoS共識(shí)算法,筆者在這里首先簡(jiǎn)單介紹一下BFT 協(xié)議和DPoS算法。
一、BFT協(xié)議
BFT協(xié)議全稱為拜占庭容錯(cuò)協(xié)議,在介紹該協(xié)議之前首先需理解何為“拜占庭問(wèn)題”。該問(wèn)題是由著名計(jì)算機(jī)科學(xué)家Leslie Lamport在1982年發(fā)表的論文“The Byzantine generals problem”中提出的,拜占庭是古代東羅馬帝國(guó)的首都,由于地域?qū)拸V,守衛(wèi)邊境的多個(gè)將軍(系統(tǒng)中的多個(gè)節(jié)點(diǎn))需要通過(guò)信使來(lái)傳遞消息,達(dá)成某些一致的決定。但由于將軍中可能存在叛徒(系統(tǒng)中節(jié)點(diǎn)出錯(cuò)),這些叛徒將努力向不同的將軍發(fā)送不同的消息,試圖干擾共識(shí)的達(dá)成。拜占庭問(wèn)題即為:在此情況下,如何讓忠誠(chéng)的將軍們能達(dá)成行動(dòng)的一致。
該問(wèn)題的提出對(duì)后來(lái)區(qū)塊鏈的發(fā)展有著直接的影響,區(qū)塊鏈在本質(zhì)上就是在一群無(wú)相互信任的節(jié)點(diǎn)間(有的節(jié)點(diǎn)會(huì)丟棄信息,有的節(jié)點(diǎn)會(huì)篡改信息),如何達(dá)成有效的共識(shí)。Lamport對(duì)該問(wèn)題的研究指出“對(duì)于拜占庭問(wèn)題來(lái)說(shuō),假如節(jié)點(diǎn)總數(shù)為N,叛變將軍數(shù)為F,則當(dāng)N大于或等于3F+1時(shí),問(wèn)題才有解。”也就是說(shuō)當(dāng)一群節(jié)點(diǎn)中惡意節(jié)點(diǎn)的數(shù)量少于總數(shù)量的三分之一時(shí),這群節(jié)點(diǎn)便可通過(guò)某種協(xié)議達(dá)成對(duì)某一狀態(tài)的共識(shí),而這種協(xié)議就是BFT協(xié)議。
BFT協(xié)議簡(jiǎn)單的表述就是:首先在一群數(shù)量有限的節(jié)點(diǎn)中通過(guò)輪換或者隨機(jī)算法選出某個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn),該節(jié)點(diǎn)在此時(shí)具有出塊的權(quán)利。當(dāng)主節(jié)點(diǎn)將該時(shí)段的交易打包成區(qū)塊后用自己的私鑰對(duì)該區(qū)塊簽名,并將其廣播到所有節(jié)點(diǎn)。其它節(jié)點(diǎn)對(duì)該區(qū)塊進(jìn)行驗(yàn)證和確認(rèn),若某個(gè)節(jié)點(diǎn)確認(rèn)該區(qū)塊后對(duì)該區(qū)塊進(jìn)行簽名并發(fā)送給主節(jié)點(diǎn)。當(dāng)主節(jié)點(diǎn)收到至少三分之二的不同節(jié)點(diǎn)的簽名區(qū)塊后,則該區(qū)塊完成了所有節(jié)點(diǎn)的驗(yàn)證成為不可逆區(qū)塊串聯(lián)到區(qū)塊鏈中。
二、DPoS 算法
在比特幣的共識(shí)算法中由于PoW資源消耗過(guò)大,并且算力也越來(lái)越集中,因此Dan Larimer在2014年作為比特股的首席開發(fā)者時(shí)提出了一種快速、安全且能源消耗比較小的授權(quán)股權(quán)證明(DPoS)共識(shí)機(jī)制。DPoS在最小化網(wǎng)絡(luò)成本的同時(shí),賦予每個(gè)持股人一定的投票權(quán),由他們投票產(chǎn)生“超級(jí)節(jié)點(diǎn)”代表。最后由獲得票數(shù)最多的一定數(shù)量的超級(jí)節(jié)點(diǎn)輪流平等地產(chǎn)生區(qū)塊。在比特股中Dan Larimer選擇了101個(gè)超級(jí)節(jié)點(diǎn),但在EOS中選擇了21個(gè)超級(jí)節(jié)點(diǎn),主要有兩方面原因:一是由于用戶很難對(duì)較多數(shù)量的超級(jí)節(jié)點(diǎn)充分了解,所以過(guò)多的超級(jí)節(jié)點(diǎn)會(huì)降低用戶投票的活躍度;二是規(guī)模為20的節(jié)點(diǎn)數(shù)目可以在拜占庭問(wèn)題中以更低的資源成本來(lái)獲得高效的共識(shí)。
這些超級(jí)節(jié)點(diǎn)的主要職責(zé)是:提供相關(guān)計(jì)算資源和網(wǎng)絡(luò)資源,保證節(jié)點(diǎn)的正常運(yùn)行;當(dāng)輪到某超級(jí)節(jié)點(diǎn)擁有出塊權(quán)時(shí),超級(jí)節(jié)點(diǎn)收集該時(shí)段內(nèi)的所有交易,并對(duì)交易驗(yàn)證后打包成區(qū)塊廣播至其他超級(jí)節(jié)點(diǎn),其他節(jié)點(diǎn)驗(yàn)證后把區(qū)塊添加到自己的數(shù)據(jù)庫(kù)中。在EOS技術(shù)白皮書中,每個(gè)出塊間隔定義為3秒,這主要是由于在當(dāng)前的網(wǎng)絡(luò)環(huán)境下,一個(gè)超級(jí)節(jié)點(diǎn)打包區(qū)塊并將其廣播,絕大多數(shù)其他節(jié)點(diǎn)收到該區(qū)塊的過(guò)程耗時(shí)最多3秒。只有下一個(gè)超級(jí)節(jié)點(diǎn)收到了上一個(gè)超級(jí)節(jié)點(diǎn)廣播的區(qū)塊時(shí),再進(jìn)行新區(qū)塊的生成才不會(huì)造成對(duì)某個(gè)超級(jí)節(jié)點(diǎn)產(chǎn)生區(qū)塊的忽略。而一個(gè)區(qū)塊要成為不可逆區(qū)塊需要超過(guò)三分之二的超級(jí)節(jié)點(diǎn)進(jìn)行確認(rèn),在DPoS中只有超級(jí)節(jié)點(diǎn)產(chǎn)生一個(gè)新區(qū)塊,才表示它對(duì)之前收到的區(qū)塊鏈進(jìn)行了確認(rèn),所以一個(gè)區(qū)塊產(chǎn)生后,其后續(xù)串聯(lián)14個(gè)區(qū)塊才表明該區(qū)塊是不可逆區(qū)塊,區(qū)塊中的交易是不可逆交易,整個(gè)確認(rèn)過(guò)程需要45秒。
DPoS共識(shí)算法也具有極強(qiáng)的抗分叉能力,因?yàn)閰^(qū)塊添加到一條區(qū)塊鏈分叉的速率與擁有該共識(shí)的超級(jí)節(jié)點(diǎn)比例是相關(guān)的,也就是說(shuō),具有較多超級(jí)節(jié)點(diǎn)的分叉會(huì)比擁有較少的那一條分叉增長(zhǎng)速率快。任何時(shí)候一個(gè)誠(chéng)實(shí)的超級(jí)節(jié)點(diǎn)看到一條有效的更長(zhǎng)鏈時(shí),都會(huì)從當(dāng)前的分叉切換過(guò)來(lái),又由于超級(jí)節(jié)點(diǎn)數(shù)量為奇數(shù)個(gè),所以在任何時(shí)刻一定會(huì)有一條較長(zhǎng)的鏈。當(dāng)一個(gè)超級(jí)節(jié)點(diǎn)設(shè)法在兩條分叉上同時(shí)生產(chǎn)區(qū)塊時(shí),EOS的持有者會(huì)在下一輪投票中將該超級(jí)節(jié)點(diǎn)刪掉,并且EOS社區(qū)會(huì)給予相關(guān)惡意節(jié)點(diǎn)一定的懲罰。因此,在一般情況下,使用DPoS的EOS都是很難經(jīng)歷分叉的。
三、BFT-DPoS 共識(shí)機(jī)制
在最早的EOS技術(shù)白皮書中,EOS主要采用上述的DPoS機(jī)制每3秒來(lái)產(chǎn)生一個(gè)區(qū)塊,而在最新版的EOS Dwan 3.0中為使區(qū)塊鏈系統(tǒng)有更快的出塊速度,EOS 采用了BFT-DPoS共識(shí)機(jī)制從而達(dá)到了500毫秒的出塊間隔。該機(jī)制的具體過(guò)程是:EOS的持有者通過(guò)投票系統(tǒng)對(duì)各個(gè)超級(jí)節(jié)點(diǎn)競(jìng)選者進(jìn)行投票,選出21個(gè)節(jié)點(diǎn)為超級(jí)節(jié)點(diǎn)。然后這21個(gè)超級(jí)節(jié)點(diǎn)以自身的網(wǎng)絡(luò)資源狀況商議出一個(gè)出塊權(quán)擁有順序,在每個(gè)超級(jí)節(jié)點(diǎn)擁有出塊權(quán)時(shí),以間隔為500毫秒(500毫秒是EOS團(tuán)隊(duì)通過(guò)大量實(shí)驗(yàn)測(cè)試得出的當(dāng)前網(wǎng)絡(luò)狀態(tài)下可達(dá)到的最小的穩(wěn)定狀態(tài)下的出塊間隔)連續(xù)產(chǎn)生12個(gè)新區(qū)塊,然后切換到下一個(gè)超級(jí)節(jié)點(diǎn)連續(xù)產(chǎn)生之后的12個(gè)區(qū)塊。
該方式可以保證一個(gè)超級(jí)節(jié)點(diǎn)可以連續(xù)以500毫秒的間隔產(chǎn)生區(qū)塊,因?yàn)樵谕怀?jí)節(jié)點(diǎn)產(chǎn)生新區(qū)塊時(shí)不受當(dāng)前網(wǎng)絡(luò)狀況的影響,但由于網(wǎng)絡(luò)的延遲很難使得其他節(jié)點(diǎn)對(duì)已經(jīng)產(chǎn)生的區(qū)塊進(jìn)行確認(rèn),使其成為不可逆區(qū)塊。因此EOS引入了 BFT協(xié)議,當(dāng)超級(jí)節(jié)點(diǎn)A產(chǎn)生第一個(gè)新區(qū)塊后,A將該區(qū)塊進(jìn)行簽名并廣播給其他超級(jí)節(jié)點(diǎn),其他超級(jí)節(jié)點(diǎn)對(duì)該區(qū)塊進(jìn)行驗(yàn)證后對(duì)其進(jìn)行簽名并返回給A節(jié)點(diǎn),當(dāng)A節(jié)點(diǎn)收到來(lái)自14個(gè)不同節(jié)點(diǎn)簽名的區(qū)塊后,該區(qū)塊就成為不可逆區(qū)塊串聯(lián)到之前的區(qū)塊鏈中(以500毫秒產(chǎn)生新區(qū)塊的過(guò)程和對(duì)區(qū)塊進(jìn)行BFT協(xié)議共識(shí)的過(guò)程在超級(jí)節(jié)點(diǎn)中是同時(shí)進(jìn)行的,即確認(rèn)過(guò)程不影響超級(jí)節(jié)點(diǎn)產(chǎn)生新的區(qū)塊)。EOS團(tuán)隊(duì)通過(guò)大量實(shí)驗(yàn)測(cè)試,在當(dāng)前的網(wǎng)絡(luò)狀況下,一個(gè)超級(jí)節(jié)點(diǎn)廣播一個(gè)新區(qū)塊并確認(rèn)的過(guò)程可在1秒的時(shí)間內(nèi)完成。因此,每個(gè)新區(qū)塊的產(chǎn)生到成為不可逆區(qū)塊最多需要1.5秒的時(shí)間,這就使得跨鏈通信的時(shí)延大大縮小。因?yàn)橐粋€(gè)區(qū)塊鏈在引入另一條區(qū)塊鏈的交易狀態(tài)時(shí)必須等待其成為不可逆交易,所以兩個(gè)基于EOS的區(qū)塊鏈在3秒鐘以內(nèi)就可以進(jìn)行一次來(lái)回的通信,而以太坊進(jìn)行類似的通信需要9分鐘,比特幣需要3小時(shí)以上。
上述過(guò)程雖然可以保證同一超級(jí)節(jié)點(diǎn)產(chǎn)生新區(qū)塊時(shí)可以達(dá)到500毫秒的間隔,但當(dāng)切換超級(jí)節(jié)點(diǎn)產(chǎn)生區(qū)塊時(shí),由于網(wǎng)絡(luò)延遲使得上一節(jié)點(diǎn)產(chǎn)生的最后幾個(gè)新區(qū)塊有可能被該超級(jí)節(jié)點(diǎn)忽略。為解決此問(wèn)題,EOS選用了確定順序的超級(jí)節(jié)點(diǎn)輪流出塊,比如以紐約(美國(guó)東海岸)、芝加哥(美國(guó)中部)、洛杉磯(美國(guó)西海岸)、日本東京、中國(guó)上海這樣的順序,該順序使得上一節(jié)點(diǎn)產(chǎn)生的最后區(qū)塊傳播到下一節(jié)點(diǎn)時(shí)有最小的延遲,從而避免下一個(gè)超級(jí)節(jié)點(diǎn)忽略上一節(jié)點(diǎn)產(chǎn)生的區(qū)塊。如果是隨機(jī)定義出塊權(quán)的超級(jí)節(jié)點(diǎn),那么在現(xiàn)有的網(wǎng)絡(luò)條件下,出塊間隔只有控制在3 秒時(shí)才可保證下一節(jié)點(diǎn)較大概率上不會(huì)忽略上一節(jié)點(diǎn)產(chǎn)生的區(qū)塊。
使用上述BFT-DPoS協(xié)議就可以使得EOS的出塊間隔從原來(lái)的3秒降低到500毫秒,這也使得跨鏈通信的時(shí)延大大縮短,單位時(shí)間內(nèi)可確認(rèn)的交易數(shù)量大大提升。筆者相信如果這樣的機(jī)制在EOSIO1.0的正式版本中成功實(shí)現(xiàn),那無(wú)疑是區(qū)塊鏈技術(shù)向支持百萬(wàn)級(jí)別用戶的目標(biāo)邁出的巨大一步。