論文簡介
論文題目:A survey of Blockchain consensus algorithms: mechanism, design and applications
本篇論文提出來一個三段式的分類模型對主流的共識演算法進行分類,並對其優缺點、安全性以及應用場景進行了分析。
區塊鏈型別
按資料結構分類:
- 傳統的鏈式結構區塊鏈
- 有向無環圖式(DAG)結構的區塊鏈
按結點訪問機制分類:
- 公有鏈
- 聯盟鏈
- 私有鏈
拜占庭將軍問題和區塊鏈共識演算法
區塊鏈中的共識演算法是用來解決分散式系統中存在多個故障節點時的資料一致性問題。
故障節點分為兩種:
- 事故故障節點:這類節點只是無響應不工作了,但不存在惡意行為。
- 拜占庭故障節點:可以有任意行為,包括向其他節點傳送錯誤資訊,或向不同節點傳送不同的資訊等破壞共識的行為。
只適用於第一類故障節點的共識演算法比較著名的有 Paxos 和 Raft 兩個(不是本文重點討論的內容)。
應對兩類故障節點的共識演算法
FLP定理指出,在遵循非同步通訊模型的分散式系統中,只要有一個程式失敗(無響應或掛起),就無法達成全面的共識。我們假設區塊鏈系統是一個弱同步通訊模型:即訊息可能會被延遲,但最終會在規定的時間內到達接收者,超過這個時間就認為傳送節點失敗。
一個可用的共識演算法,最基本的就是要保證區塊鏈的一致性與可用性。較為著名的有 PoW, PoS, PBFT 等演算法。
共識演算法的流程模型
公式演算法的流程模型分為三個部分:選取記賬人(accountant selection), 新增區塊(block addition), 交易確認(transaction confirmation)
個人呢覺得第三個環節叫做“區塊確認”會好理解一丟丟
選取記賬人(accountant selection)
記賬人負責驗證與收集交易,將其打包成一個區塊併傳送給其他節點。主要分為以下三種情況:
- 在每一個記賬輪隨機選取一名記賬者(PoW, PoS等)
- 在每一個記賬輪根據預定的規則選取一名記賬者
- 每個節點都是記賬者,且都只記錄自己的交易(DAG結構)
新增區塊(block addition)
在這個環節中,所有節點都會收到記賬者傳送的節點,然後對其中的記賬者資訊以及交易進行驗證。如果會計和該區塊都是有效的,那麼區塊可以被新增到區塊鏈中。
一些共識演算法(如PBFT)在向區塊鏈新增塊之前,還需要獲得大多數節點的投票。
交易確認(transaction confirmation)
每個節點都有一個區塊鏈的本地副本。這一階段需要節點根據自身保留的區塊鏈副本對新新增的區塊進行確認,主要有以下兩種情況:
- 需要實時投票:每個區塊在新增到區塊鏈上之前就已經獲得大多數節點的投票,在這種情況下,每個上鍊的區塊都已經是被確認的區塊了。
- 沒有實時投票:這種情況下的新區塊即使被連線到區塊鏈上,但也並不意味著它被確認了。需要在其後面繼續新增新區塊來對其進行確認(最長鏈原則)。比如比特幣的確認機制是後面接上6個新區塊後,該區塊則能夠被認為是確認區塊。
區塊鏈共識演算法的分類
根據共識演算法的流程,可以將其分為四個類別:“leader-based”型別,“voting-based”型別,“committee + voting”型別,以及“fair accounting”型別
“leader-based”型別
這一型別的演算法主要關注在記賬人的選取上,比較著名的有PoW, PoS演算法。
具體過程不展開說了,感興趣可以另外找資料看看,隨手可以查的到。
PoW機制的缺點就是在記賬人選出來之前,所有節點都要進行競爭式的計算,會消耗大量資源。
PoS機制的免除了競爭式的計算,但是缺點就是容易造成壟斷局面
“voting-based”型別
這種型別最為出名的機制莫過於PBFT,在惡意節點不超過總節點數量的1/3的時候PBFT能夠確保區塊鏈正常執行。
具體過程文章中有,也可以另外查詢資料,就不展開細說了。
PBFT的缺點是它的通訊量很大,每一次三階段確認的時間複雜度為 O(n^2)
“committee + voting”型別
這一類共識機制將重點放在選取記賬人與新增區塊這兩個環節中。
第一階段選取一個記賬人以及委員會;第二階段則是有委員會的成員(或部分成員)進行投票。演算法的核心思想是縮小參與共識過程的節點範圍,從而降低溝通的複雜性。並且,所有節點都有機會成為委員,因此不會犧牲系統的分權。
“fair accounting”型別
這種型別主要應用在DAG結構的區塊鏈上。
在記賬人選取環節,節點只負責打包它生成的交易;在新增區塊環節,節點根據一些連結規則來選擇他們區塊的父塊;在交易確認環節,會根據更為複雜的規則來判斷區塊是否基於DAG上的位置達成共識。
共識演算法的特點
共識演算法的評價維度
針對共識機制的攻擊手法
文章中提到的攻擊手法有:Dos攻擊,女巫攻擊,日蝕攻擊,以及私自挖礦。
Dos攻擊
在區塊鏈中,針對記賬節點的Dos攻擊會對整個區塊鏈系統構成嚴重的威脅。
解決方法:
- 使得攻擊者不能提前預測到記賬者的身份
- 建立一個高效的節點故障處理機制
女巫攻擊
女巫攻擊是指同一個使用者有多個賬號。如果採用投票機制,惡意使用者可能擁有多個投票權,從而可能影響並控制區塊鏈系統。女巫攻擊主要是破壞區塊鏈系統的公平性,帶來集中化的風險。
解決方法:
- 記賬者選取的方法不依靠使用者身份的數量,而採用其他的計量方式(如PoW等)
日蝕攻擊(?)
攻擊者入侵受害者的路由表,通過路由表將攻擊者設為受害者的中介。從而將受害者與真正的區塊鏈網路分離,並控制受害者的外部聯絡。
解決方法:
- 保護好路由表。。。
私自挖礦
私自挖礦指攻擊者在成功挖掘一個區塊後,不將挖掘的區塊釋出和分發給其他網路節點,而是繼續挖掘下一個區塊,以保持了領先地位(此時最長鏈只在攻擊者手中)。當網路中的其他礦工將要趕上時,攻擊者再將他手中的最長鏈釋出到區塊鏈網路上,以獲取大量的獎勵。
解決辦法:
- 設定時間戳,如果一個礦工一次性釋放了一長串連續的塊,那麼網路的其他部分可以考慮不接受這些塊。