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