1. 程式人生 > >PBFT 演算法 java實現(下)

PBFT 演算法 java實現(下)

PBFT 演算法的java實現(下)

在上一篇部落格中(如果沒有看上一篇部落格建議去看上一篇部落格),我們介紹了使用Java實現PBFT演算法中節點的加入,view的同步等操作。在這篇部落格中,我將介紹PBFT演算法中共識過程的實現。

專案地址:GitHub

共識過程

這個是hyperchain的官方圖,展示的是一個RBFT常規流程。如果想了解更多,可以去參考hyperchain官網,或者我以前的部落格。


在共識的過程一共有3個階段:PrePrepare,prepare,commit。上面的圖介紹的還是比較簡單明瞭的。下面將用通俗的語言來介紹這個過程。

我們設想一個場景,我們生活在一個村子裡面,每一個人都有著自己的小本本,小本本上面記錄著這個村子裡面的所有的支出。某一天村子支出了100¥,然後村長(主節點)將這個支出訊息進行廣播,廣播的訊息型別是preprepare。村子中的村民收到這個訊息後,肯定會看看村子裡面是不是真的支出了100¥,如果訊息是真的的話就告訴其他的村民村子裡面是真的支出了100¥(訊息型別是prepare)。當一個村名接收到$quorum = \lceil \frac {N + f +1 }{2 }\rceil $數量的prepare訊息,就認為這個訊息是真的訊息(當然實際上的情況會更復雜),然後向外廣播我同意(commit)這份支出寫入賬本,當一個節點收到quorum

個commit訊息的時候,就會真的將這個100¥的交易資訊寫入自己的小本本。

上面便是PBFT演算法的交易部分的邏輯,其實還是蠻好理解的,遵循少數服從多數的原則。

接下來了將在程式碼的方面來理解這個過程。

程式碼實現

繼續祭出我的神筆馬良。

首先我們假設一個有4個節點,其中一個主節點3個從節點。

主節點首先向所有的從節點廣播pre-prepare訊息(其中AC代表A_Client,AS代表A_Server)。


從節點(上面圖片中的BCD節點)肯定會(實際上不一定會,因為會受到網路的因素)收到主節點發送過來的pre_prepare訊息,當從節點驗證此訊息正確時,就會廣播prepare訊息。下面的一張圖就是B從節點向ACD節點發送prepare訊息。


在上面我們知道B節點會廣播訊息,其他的CD節點同樣會廣播訊息。當節點受到一定數量(quorum)的prepare訊息時,就會向外廣播commit訊息。


同樣當節點受到一定數量(quorum)的commit訊息時,節點就會將這個訊息寫入自己的塊(block)中。


以上便是共識過程中的手繪流程圖,在圖中我們可以很清楚的知道當傳送訊息的時候,誰扮演的是客戶端,誰又扮演的是服務端。至於為什麼不是server廣播訊息而是client廣播訊息,在上一篇部落格中已有說明,這裡便不再贅述。

emm,至於怎麼實現,可以去參考我的原始碼,因為這個還是挺簡單的,只要我們理解這個過程,其實實現起來還是比較簡單的。

專案地址:GitHub,如果有任何問題,歡迎在評論區下方留言,或者使用Email私信我。