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私信我。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM