PBFT 算法 java實現(下)

PBFT 算法的java實現(下)

在上一篇博客中(若是沒有看上一篇博客建議去看上一篇博客),咱們介紹了使用Java實現PBFT算法中節點的加入,view的同步等操做。在這篇博客中,我將介紹PBFT算法中共識過程的實現。html

項目地址:GitHubjava

共識過程

這個是hyperchain的官方圖,展現的是一個RBFT常規流程。若是想了解更多,能夠去參考hyperchain官網,或者我之前的博客git


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

咱們設想一個場景,咱們生活在一個村子裏面,每個人都有着本身的小本本,小本本上面記錄着這個村子裏面的全部的支出。某一天村子支出了100¥,而後村長(主節點)將這個支出消息進行廣播,廣播的消息類型是preprepare。村子中的村民收到這個消息後,確定會看看村子裏面是否是真的支出了100¥,若是消息是真的的話就告訴其餘的村民村子裏面是真的支出了100¥(消息類型是prepare)。當一個村名接收到$quorum = \lceil \frac {N + f +1 }{2 }\rceil $數量的prepare消息,就認爲這個消息是真的消息(固然實際上的狀況會更復雜),而後向外廣播我贊成(commit)這份支出寫入帳本,當一個節點收到quorum個commit消息的時候,就會真的將這個100¥的交易信息寫入本身的小本本。算法

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

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

代碼實現

繼續祭出個人神筆馬良。ui

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

主節點首先向全部的從節點廣播pre-prepare消息(其中AC表明A_Client,AS表明A_Server)。3d


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


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


一樣當節點受到必定數量(quorum)的commit消息時,節點就會將這個消息寫入本身的塊(block)中。


以上即是共識過程當中的手繪流程圖,在圖中咱們能夠很清楚的知道當發送消息的時候,誰扮演的是客戶端,誰又扮演的是服務端。至於爲何不是server廣播消息而是client廣播消息,在上一篇博客中已有說明,這裏便再也不贅述。

emm,至於怎麼實現,能夠去參考個人源代碼,由於這個仍是挺簡單的,只要咱們理解這個過程,其實實現起來仍是比較簡單的。

項目地址:GitHub,若是有任何問題,歡迎在評論區下方留言,或者使用Email私信我。

相關文章
相關標籤/搜索