張迪 燕山大學理學院
以區塊鏈為核心的分布式系統近年來受到了廣泛的關注。中本聰是比特幣的開發者兼創始者,他提出的區塊鏈結構是在沒有中央權威的情況下對交易進行時間戳的方式[1]。中本聰共識能夠使網絡參與者在不受信任或半可信的環境中操作,并且可以在網絡參與者之間存在拜占庭式故障的情況下進行操作[2]。由于需要保證交易的終結性以及計算效率,研究人員重點關注在不超過f 個故障節點的假設下,以確定性方式運行的拜占庭容錯共識算法[3,4]。
本文提出的另一種拜占庭容錯(Byzan tine Fault Tolerant,BFT)共識算法具有模塊化結構,并且可以很簡單的實現,主要應用于超級賬本區塊鏈平臺中,優點是既可以實現交易的低延遲,又實現了相當高的交易吞吐量。
另一種BFT 共識算法中的典型參與者:
客戶端:每個在區塊鏈系統中注冊了公鑰的用戶即為客戶端,作用是生成交易并將交易發送到排序服務。
節點:即網絡參與者,負責對提案中的交易進行驗證以達成共識,并將共識后的交易存儲到塊中,節點可以維護完整的交易歷史記錄,以驗證提案。誠實節點是嘗試與網絡同步、創建有效選票、提交,并且從不創建分叉塊的節點。
排序服務:負責獲取交易集和創建塊提案的功能模塊,提案中包括一組要由節點驗證和表決的交易。
為了簡化一般流水線,本文做出以下假設:首先,假設客戶端是由節點知道的,且客戶端有一個已知節點的列表來進行交互;其次,客戶端有自己的秘鑰安全地存儲在設備上;最后,客戶端有權在區塊鏈上執行特定的命令子集或智能合約。區塊鏈系統中的另一種BFT 共識算法的一個回合可描述為以下5 個步驟:
·客戶端使用命令形成交易,并使用其私鑰對交易簽名;
·客戶端將交易發送給節點。節點接收交易,執行無狀態驗證,即驗證格式是否錯誤,并將其轉接到操作系統中;
·操作系統生成一個包含有序交易列表的提案并將其發送給節點;
·提案已被送交給有表決權的節點,節點進入協作階段,本階段中節點通過網絡交換選票并決定塊;
·節點將該塊提交到其本地存儲中。
·操作系統收集交易以便將其包含到新的提案中,提案是在操作系統中收集了一定數量的交易之后或在一個時間限制之后生成的,然后操作系統在提案創建后向所有節點廣播該提案。
節點在收到來自排序服務的提案后計算經驗證的提案。節點生成的塊由提案的哈希值、驗證提案的交易和鏈加密驗證所需的附加元數據組成。不同的節點可以從同一個提案中計算不同的塊,一條投票消息包含一對哈希值和一個簽名,當從網絡中接收到消息時,簽名用于節點進行身份驗證。
當節點對塊哈希進行投票時,它會將當前一輪驗證節點生成一個順序,該順序是在網絡中傳播投票所需的節點的排序。該順序由一個函數生成,該函數將塊哈希和初始節點列表作為參數,返回均勻分布的列表。
本節描述了A、B、C、D 四個節點進行的一輪另一種BFT 共識算法的執行步驟。每個客戶端將自己的交易發送到排序服務,排序服務的責任是收集所有交易、排序交易以及創建塊提案P1,然后與網絡中的每個節點共享提案P1。
A 的驗證過程:A 是P1的驗證者,如果交易根據驗證規則不存在錯誤,則該交易是有效的,A 將所有的有效交易創建一個塊,并計算塊的哈希值H1。A 在得知提案哈希值H1和節點的初始順序(A,B,C,D)后,使用哈希值H1作為排序函數的輸入,計算得出當前一回合的排序,結果為(C,D,A,B)。于是,A 創建了一張選票并將選票傳遞給本回合排列名單上的第一個節點C。A 將其本地狀態切換為等待提交消息,直到某個時間延遲。
C 的狀態:C 接受了A 的投票。假設C 從P1的驗證過程中計算出相同的哈希值H1,進而使用排序函數計算出相同的順序,則C 將投票傳遞給自己,此時,C 現在有兩票,A 的和C 的,但B 和D 還沒有投票。
D 分享投票:D 同樣計算出哈希值H1,并將他的選票傳遞給C,現在C 擁有的票數大于此刻網絡中所有節點的三分之二。C 將來自節點的所有選票廣播提交消息。除了B 之后,每個節點都接收到一條提交消息,并使用哈希值H1向塊添加簽名,并更新本地狀態。
B 的狀態:假設B 的網絡存在問題,錯過了之前回合,包括C 的提交信息。B沒有將哈希值H1的投票傳播給C,因此他的狀態不一致,B 計算出哈希值H1,得到不同的節點順序(A,B,D,C),B 將他的選票傳播給A,此時A 已經收到C 的提交信息,他將C 的提交信息轉發給B,B 驗證來自A 的提交信息并應用。在達成共識之后,B 擁有與其他人相同的狀態。
本文提出的另一種BFT 共識算法通過對塊提案的投票,在網絡中至少3f+1個節點中存在不超過f 個故障節點的假設下,保證了交易處理的安全性和活性,同時對算法在不同情況下的執行步驟進行了全面的描述。