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