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