一、概述
Practical Byzantine Fault Tolerance (PBFT) 演算法是一種通過在拜占庭故障模型下使一個分散式系統達到共識的演算法。PBFT 由 Castro 和 Liskov 於 1999 年提出,它是一種特別的處理器機制,能夠在存在惡意行為的前提下使分散式系統正常運行,並達成共識。PBFT 被廣泛應用於各種採用拜占庭故障容錯模型的應用,如區塊鏈中的共識演算法。
二、演算法流程
PBFT演算法的流程如下:
1.客戶端向主節點發送請求消息 2.主節點將請求消息發送給備用節點 3.備用節點將請求消息發送給其他備用節點 4.節點們進行共識,最終選出結果,並廣播給其他所有節點 5.節點們對結果進行確認 6.節點將確認結果發送給客戶端,客戶端收到超過節點總數 2 / 3 的確認結果後回復確認 7.主節點將確認結果廣播給所有節點 8.節點更新狀態
三、演算法詳解
1. 視圖切換
在 PBFT 演算法中,每次共識都是在一個特定的視圖(view)下進行的。視圖更改時,節點需要進行視圖切換,以選舉出當前視圖的主節點。視圖切換的大致過程如下:
1. 節點將當前視圖中所有已知的節點排序,以便選舉出主節點 2. 節點進行投票,選擇下一個主節點 3. 如果有2f + 1個節點選擇了同一個節點作為主節點,那麼該節點就成為新的主節點,並開始新的視圖
2. 請求消息處理
當客戶端想要向 PBFT 網路發送數據時,它必須首先發送請求消息。請求消息包含以下信息:
- **client_id**:客戶端 ID - **req_id**:請求 ID - **req_data**:請求數據
請求消息處理的過程大致如下:
1. 主節點收到請求消息後,將消息轉發給所有備用節點 2. 備用節點也會將請求消息轉發給所有其他的備用節點 3. 節點們對請求進行完整性檢驗,判斷請求是否合法 4. 如果該請求已經被處理過,則可以直接返回結果 5. 如果請求是合法的,則需要進行共識
3. 共識
在 PBFT 中,共識過程是通過發送特定類型的消息來完成的。演算法共涉及了四種類型的消息:
- **Pre-Prepare**: 主節點發送該消息,表示請求數據已被驗證過並且排隊等待處理 - **Prepare**:節點發送這條消息,表示它已經驗證了來自主節點的數據,且準備好達成共識 - **Commit**:節點發送這條消息,表示它已經對請求進行驗證、準備好達成共識,並且已經在本地應用該請求 - **View-Change**:節點將該消息發送給其他節點,通知它們切換視圖
共識的詳細流程如下:
1. 主節點向備用節點發送預準備消息 Pre-Prepare,消息包含客戶端發送的請求信息,請求被標記為視圖編號和序列編號的一部分 2. 備用節點收到 Pre-Prepare 消息後,會對消息中的請求進行驗證和檢查,並在通過驗證後向其他備用節點和節點發送明確的 Prepare 消息,表示它已經接受了該消息 3. 一旦節點收到 2f + 1 條相同的 Prepare 消息,就會將消息記錄在特定的數據結構中,然後再向所有其他節點廣播 Commit 消息 4. 一旦節點收到相同視圖和相同序列編號的 Commit 消息,它就會應用請求,記入區塊鏈,記錄一條交易 5. 一旦客戶端收到超過節點總數 2/3 的 Confirm 消息,就會向主節點發送 Confirm 消息,並要求將交易納入區塊鏈之中。 6. 主節點將 Confirm 消息廣播給所有節點,節點在準備下一個視圖之前等待某個時間以確保 ack 正確提交。
四、示例代碼
代碼未提供,請見諒。
五、總結
PBFT 演算法是一種實用該容錯技術,從目前眾多的分散式系統實現已經得到了很好的證實。但是,該演算法在實際應用中也存在一些問題,例如可擴展性問題、節點崩潰可能導致整個視圖崩潰等。為了解決這些問題,一些工程師和學者也提出了其他的共識演算法,如 PoW、PoS、DPoS 等,這些演算法也在區塊鏈中得到了廣泛的應用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/270680.html