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私信我。
PBFT 算法 java实现(下)的更多相关文章
- PBFT算法java实现
PBFT 算法的java实现(上) 在这篇博客中,我会通过Java 去实现PBFT中结点的加入,以及认证.其中使用socket实现网络信息传输. 关于PBFT算法的一些介绍,大家可以去看一看网上的博客 ...
- 从零开始学 Java - CentOS 下安装 Nginx
早上下起了暴雨 闹钟还未响起就听到雨滴哗啦啦击打窗户的声音,被吵醒了.起床上班,在楼下的十字路口,暴雨大到完全看不清对面,两个穿着雨衣的交警站在路口中间指挥着过往的车辆,大家都慌慌张张.急急忙忙的打着 ...
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- Atitit 电子商务订单号码算法(java c# php js 微信
Atitit 电子商务订单号码算法(java c# php js 微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...
- Java 环境下使用 AES 加密的特殊问题处理
在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...
- 数据结构--图 的JAVA实现(下)
在上一篇文章中记录了如何实现图的邻接表.本文借助上一篇文章实现的邻接表来表示一个有向无环图. 1,概述 图的实现与邻接表的实现最大的不同就是,图的实现需要定义一个数据结构来存储所有的顶点以及能够对图进 ...
- ID3算法Java实现
ID3算法java实现 1 ID3算法概述 1.1 信息熵 熵是无序性(或不确定性)的度量指标.假如事件A的全概率划分是(A1,A2,...,An),每部分发生的概率是(p1,p2,...,pn).那 ...
- 一文读懂实用拜占庭容错(PBFT)算法
在区块链中有一个著名的问题,就是拜占庭将军问题,对于拜占庭将军问题,网上的文章已经多得不要不要了,今天和大家分享的是其相关的实用拜占庭容错算法,一起来看看吧. 实用拜占庭容错算法(Practi ...
- 朴素贝叶斯算法java实现(多项式模型)
网上有很多对朴素贝叶斯算法的说明的文章,在对算法实现前,参考了一下几篇文章: NLP系列(2)_用朴素贝叶斯进行文本分类(上) NLP系列(3)_用朴素贝叶斯进行文本分类(下) 带你搞懂朴素贝叶斯分类 ...
随机推荐
- hdfs断电报错解决
一,/home/hadoop/tmp/dfs/name/current 目录下查看文件二,1.stop hadoop所有的服务;2.重新格式化namenode即可: hadoop根目录下: hadoo ...
- 由Kaggle竞赛wiki文章流量预测引发的pandas内存优化过程分享
pandas内存优化分享 缘由 最近在做Kaggle上的wiki文章流量预测项目,这里由于个人电脑配置问题,我一直都是用的Kaggle的kernel,但是我们知道kernel的内存限制是16G,如下: ...
- visul studio 使用git扫盲帖。
写给和一样的菜B 有必要知道的命令: git rm --cached (文章底部有git命令大全) 创建.gitignore文件 windows版: 在项目根目录下面创建gitignore.txt文件 ...
- Qt Installer Framework翻译(4)
教程:创建安装程序 本教程描述如何为一个小项目创建一个简单的安装程序: 本节描述创建安装程序所必须完成的步骤: 创建一个包文件夹,其中将包含所有配置文件和可安装的包. 创建一个配置文件,其中包含有关如 ...
- axios请求方法封装.
axios的使用上一般封装好对应的方法,ES6导出,直接调用,消息通知使用了ElementUI的Message组件. 这是一个封装了axios的Rest风格的工具类,包扩常用的POST,GET,PUT ...
- Mysql梳理-关于索引/引擎与锁
前言 最近突发新型肺炎,本来只有七天的春节假期也因为各种封锁延长到了正月十五,在家实在闲的蛋疼便重新研究了一下Mysql数据库的相关知识,特此总结梳理一下.本文主要围绕以下几点进行: 1.Mysql的 ...
- Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例
这一节我们通过一个简单的实例,学习Sentinel的基本应用. 一.Sentinel 限流核心概念 在学习Sentinel的具体应用之前,我们先来了解一下Sentinel中两个核心的概念,资源和规则. ...
- mysql--->mysql的事务和锁
mysql 事务和锁 什么是事务?及其特性? 答:事务:是一系列的数据库操作,是数据库应用的基本逻辑单位. 或者这样理解: 事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操 ...
- 平滑重启更新(GR机制)
平滑重启更新(GR机制) 什么是平滑启动机制 是一种在协议重启时保证转发业务不中断的机制. 什么时候用到平滑重启 平滑重启一般应用于业务更新或者版本发布过程中,能够避免因为代码发布重启服务导致的暂时性 ...
- C# 解析JSON遇到以错误提示:应为状态“Element”。。遇到名称为“”、命名空间为“”的“Text”。
话不多说:仔细看代码: ①json格式错误导致报错 {"TeachIQ":" 语言 0小时0分钟 未完成","Temperature" ...