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)_用朴素贝叶斯进行文本分类(下) 带你搞懂朴素贝叶斯分类 ...
随机推荐
- oa办公系统是什么?对企业有什么作用?
OA办公系统是指利用计算机网络帮助企业实现办公自动化,用系统软件代替传统的手工工作帮助企业处理内部事务,例如文档共享.部门协作.报销.业务流程等等,最终目的帮助企业提高工作效率,实现利益最大化. 随着 ...
- FLASK 三剑客 request jinjia2
Flask Web 框架Django 15 优势 : 组件全 - admin - Model ORM - Forms 教科书式 劣势 : 加载所有组件 - 占用资源较高 重型框架 Flask 3 优势 ...
- CentOS7主机名的查看和修改
CentOS7主机名的查看和修改 在CentOS7中,有三种定义的主机名: 静态的(Static hostname) "静态"主机名也称为内核主机名,是系统在启动时从/etc/ho ...
- Java并发专栏
1. Java并发 2. 守护线程与非守护线程 3. 为什么启动线程用start()而不用run()? 4. Java线程join方法总结 5. 生产者与消费者 6. wait.notify/noti ...
- 前端url参数中带有callback并产生错误
错误截图: 初步诊断是由于后端返回值的数据格式不正确造成的 解决方式: 1).接受在springmvc中接受callback参数 2).将对象转为Object 3).拼接callback方法,其中返回 ...
- Docker的save和export命令的区别
我最近在玩Docker,一种应用程序容器和Linux的虚拟技术.它太酷了,创建Docker镜像和容器只需要几分钟.所有的工作都是开箱即用的. 在结束我一天的工作之前,我希望能保存下我的工作.但我在Do ...
- windows配置Lua开发环境
官网上下载的不靠谱,很多库不能用,你如 require "socket" 如果没有vc那些编译也麻烦,摸索了很久,直接下载安装文件安装即可: 安装这两个就行: 先安装C++2005 ...
- CUDA 计算pi (π)
通过简单的程序设计熟练CUDA的使用步骤 下面是cuda代码及相关注释 #include <stdio.h> #include <iostream> #include < ...
- Leetcode 题目整理 Sqrt && Search Insert Position
Sqrt(x) Implement int sqrt(int x). Compute and return the square root of x. 注:这里的输入输出都是整数说明不会出现 sqrt ...
- Java:多线程概述与创建方式
目录 Java:多线程概述与创建方式 进程和线程 并发与并行 多线程的优势 线程的创建和启动 继承Thread类 start()和run() 实现Runnable接口 实现Callable接口 创建方 ...