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

相关文章
相关标签/搜索