PBFT算法实现过程

2023-11-12

转载:https://www.jianshu.com/p/2383c7841d41

PBFT算法

三个阶段:预准备(pre-prepare)、准备(prepare)、和确认(commit)

步骤:

  1. 从全网节点选举出一个主节点(Leader),新区块由主节点负责生成
  2. Pre-Prepare:每个节点把客户端发来的交易向全网广播,主节点0将从网络收集到需放在新区块内的多个交易排序后存入列表,并将该列表向全网广播,扩散至123
  3. Prepare:每个节点接收到交易列表后,根据排序模拟执行这些交易。所有交易执行完后,基于交易结果计算新区块的哈希摘要,并向全网广播,1->023,2->013,3因为宕机无法广播
  4. Commit:如果一个节点收到的2f(f为可容忍的拜占庭节点数)个其它节点发来的摘要都和自己相等,就向全网广播一条commit消息
  5. Reply:如果一个节点收到2f+1条commit消息,即可提交新区块及其交易到本地的区块链和状态数据库。

拜占庭容错能够容纳将近1/3的错误节点误差,IBM创建的Hyperledger 0.6版本就是使用了该算法作为共识算法(1.0版本已弃用,使用kafka)。

这个机制下有一个叫视图view的概念,在一个视图里,一个是主节点,其余的都叫备份节点。主节点负责将来自客户端的请求给排好序,然后按序发送给备份节点们。但是主节点可能会是拜占庭的:它可能会给不同的请求编上相同的序号,或者不去分配序号,或者让相邻的序号不连续。备份节点应当有职责来主动检查这些序号的合法性,并能通过timeout机制检测到主节点是否已经宕掉。当出现这些异常情况时,这些备份节点就会触发视图更换view change协议来选举出新的主节点。

视图是连续编号的整数。主节点由公式p = v mod |R|计算得到,这里v是视图编号,p是副本编号,|R|是副本集合的个数。当主节点失效的时候就需要启动视图更换(view change)过程。

预准备阶段

在预准备阶段,主节点分配一个序列号n给收到的请求,然后向所有备份节点群发预准备消息,预准备消息的格式为<<PRE-PREPARE,v,n,d>,m>,这里v是视图编号,m是客户端发送的请求消息,d是请求消息m的摘要。

请求本身是不包含在预准备的消息里面的,这样就能使预准备消息足够小,因为预准备消息的目的是作为一种证明,确定该请求是在视图v中被赋予了序号n,从而在视图变更的过程中可以追索。另外一个层面,将“请求排序协议”和“请求传输协议”进行解耦,有利于对消息传输的效率进行深度优化。

备份节点对预准备消息的态度:

只有满足以下条件,各个备份节点才会接受一个预准备消息:

  1. 请求和预准备消息的签名正确,并且d与m的摘要一致。
  2. 当前视图编号是v。
  3. 该备份节点从未在视图v中接受过序号为n但是摘要d不同的消息m。
  4. 预准备消息的序号n必须在水线上下限h和H之间。

水线存在的意义在于防止一个失效节点使用一个很大的序号消耗序号空间。

进入准备阶段:

如果备份节点i接受了预准备消息<<PRE-PREPARE,v,n,d>,m>,则进入准备阶段。在准备阶段的同时,该节点向所有副本节点发送准备消息<PREPARE,v,n,d,i>,并且将预准备消息和准备消息写入自己的消息日志。如果看预准备消息不顺眼,就什么都不做。

接受准备消息需要满足的条件:

包括主节点在内的所有副本节点在收到准备消息之后,对消息的签名是否正确,视图编号是否一致,以及消息序号是否满足水线限制这三个条件进行验证,如果验证通过则把这个准备消息写入消息日志中。

准备阶段完成的标志:

我们定义准备阶段完成的标志为副本节点i将(m,v,n,i)记入其消息日志,其中m是请求内容,预准备消息m在视图v中的编号n,以及2f个从不同副本节点收到的与预准备消息一致的准备消息。每个副本节点验证预准备和准备消息的一致性主要检查:视图编号v、消息序号n和摘要d。

预准备阶段和准备阶段确保所有正常节点对同一个视图中的请求序号达成一致。

进入确认阶段

(m,v,n,i)条件为真的时候,副本i将<COMMIT,v,n,D(m),i>向其他副本节点广播,于是就进入了确认阶段。每个副本接受确认消息的条件是:

  1. 签名正确;
  2. 消息的视图编号与节点的当前视图编号一致;
  3. 消息的序号n满足水线条件,在h和H之间。

一旦确认消息的接受条件满足了,则该副本节点将确认消息写入消息日志中。(补充:需要将针对某个请求的所有接受的消息写入日志,这个日志可以是在内存中的)。

接受确认消息需要满足的条件

我们定义确认完成committed(m,v,n)为真得条件为:任意f+1个正常副本节点集合中的所有副本i其prepared(m,v,n,i)为真;本地确认完成committed-local(m,v,n,i)为真的条件为:prepared(m,v,n,i)为真,并且i已经接受了2f+1个确认(包括自身在内)与预准备消息一致。确认与预准备消息一致的条件是具有相同的视图编号、消息序号和消息摘要。

确认被接受的形式化描述

确认阶段保证了以下这个不变式:对某个正常节点i来说,如果committed-local(m,v,n,i)为真则committed(m,v,n)也为真。这个不变式和视图变更协议保证了所有正常节点对本地确认的请求的序号达成一致,即使这些请求在每个节点的确认处于不同的视图。更进一步地讲,这个不变式保证了任何正常节点的本地确认最终会确认f+1个更多的正常副本。

故事的终结

每个副本节点i在committed-local(m,v,n,i)为真之后执行m的请求,并且i的状态反映了所有编号小于n的请求依次顺序执行。这就确保了所有正常节点以同样的顺序执行所有请求,这样就保证了算法的正确性。在完成请求的操作之后,每个副本节点都向客户端发送回复。副本节点会把时间戳比已回复时间戳更小的请求丢弃,以保证请求只会被执行一次。

使用计时器的超时机制触发视图变更事件

视图变更将在主节点失效的时候仍然保证系统的活性。视图变更可以由超时触发,以防止备份节点无期限地等待请求的执行。备份节点在接收到一个有效请求,但是还没有执行它时,会查看计时器是否在运行,如果没有,那么它将启动计时器;当请求被执行时就把计时器停止。如果计时器超时,将会把视图变更的消息向全网广播。

各个节点会收集视图变更信息,并发送确认给 view v+1 中的主节点。新的主节点收集了视图变更和视图变更确认消息(包含自己的信息),然后选出一个checkpoint作为新view处理请求的起始状态。它会从checkpoint的集合中选出编号最大(假设编号为h)的checkpoint。接下来,主节点会从h开始依次选取h到h+L(L是高低水位之差)之间的编号n对应的请求在新的view中进行pre-prepare,如果一条请求在上一个view中到达了committed状态,主节点就选取这个请求开始在新的view中进行第三阶段。但是如果选取的请求在上一view中并没有被prepare,那它的编号n有可能是不被同意的,我们选择在新的view中作废这样的请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PBFT算法实现过程 的相关文章

  • 【虾说区块链】什么是hash算法?什么是好的hash算法?

    欢迎收听 虾说区块链 现在区块链这个概念在互联网上相当火热 这里简单做一个普及 不涉及项目推广投资 单纯地对区块链相关基础知识概念作一个说明讲解 本人区块链技术爱好者 结合相关区块链资料总结整理了 虾说区块链 也是自己一个学习笔记 涉及相关
  • 关于区块链技术的3大特点,你都了解吗?--甲由

    跟着区块链技术的开展 全球引起了比特币的张狂影响 如果说互联网是信息的高速公路 那么区块链便是金钱的高速公路 它甚至可以加快人们通往财富之路的速度 那么 什么是区块链 区块链起源于中本聪的比特币 作为比特币的底层技术 本质上是一个去中心化的
  • 以太坊(一)——概述

    一 以太坊出现的原因 比特币的不足 交易速度慢 出块时间为10分钟 采用POW算法 拼的是计算机的算力 耗电量大 会释放大量的温室气体 仅仅完成了货币的去中心化 以太坊的解决方法 交易速度加快 出块时间为15秒 以太币为10分钟 采用POW
  • 一起学习以太坊

    1 原 理 以太坊数字签名和比特币的关系 以太坊数字签名 几乎完全沿用了比特币的数字签名算法ECDSA secp256k1 只有哈希的生成方式不一样 这个之后会说 ECDSA secp256k1是一种非对称加密算法 什么是ECDSA 以太坊
  • 北京大学肖臻老师《区块链技术与应用》公开课 笔记目录

    北京大学肖臻老师 区块链技术与应用 公开课学习笔记 分章节进行整理 持续更新中 该系列文章中如有任何侵权内容请及时与我个人联系删除或修改 北京大学肖臻老师 区块链技术与应用 视频链接 点击这里 文章目录 01 课程介绍 点击这里 BTC 0
  • 区块链在版权保护上有什么作用?

    我国在版权保护方面的制度和法律越来越完善 版权行业的规模也是不断扩大 虽然版权行业的确权的发展有一定的时间 但其还存在着一些问题 那目前比较前沿的区块链版权保护应用又能有效解决这些问题呢 根据腾讯研究员的数据 中国网络核心版权产业行业规模从
  • 关于区块链的所有英文知识,看这篇文章就够了

    上周HiBlock区块链社区发布了一则区块链翻译小组成员招募信息 一些感兴趣的小伙伴说很多英文名词不知道怎么翻译比较准确 有砖家提出 翻译的基本原则是信达雅 即先要基于约定俗成 也就是共识 那么到底这些区块链相关的名词 共识下的中文对照是什
  • 简析区块链的特点和每个分层的作用

    区块链技术在这几年不停的发展更新 相应的区块链服务应用和技术也逐渐走向成熟 区块链技术相对于行业内的内来说就相对熟悉一些 但对于那些还未接触这些技术知识的人来说就相当陌生 区块链技术有什么特点 区块链底层系统有哪些分层 对应的作用分别是什么
  • 区块链技术在网络安全中的应用

    区块链是一个现代的数字分类账本 不仅记录货币交易 还可以记录任何有价值的东西 输入的数字数据在Blockchain上作为相互共享的和永久记录的数据库 利用系统本身去中心化的特性具有明显的优势 区块链数据库不存储在集中位置 这意味着记录确实是
  • Merkle Tree与区块链

    什么是merkle tree 假设你已经知道了什么是哈希算法以及哈希是用来干啥的 网络传输数据的时候 A收到B的传过来的文件 需要确认收到的文件有没有损坏 如何解决 有一种方法是B在传文件之前先把文件的hash结果给A A收到文件再计算一次
  • 区块链+跨境支付的优势

    全球互联网的高速发展也带动了跨境电商的快速发展 跨境支付也瞬间成为第三方支付领域的一个风口 而将区块链技术应用在跨境支付领域也逐渐成为市场的热点需求 传统的跨境支付方式中间环节繁杂 费时又费力 而且跨境电商卖家在跨境支付环节 存在境外银行账
  • 区块链笔记4--BTC实现

    1 UTXO 区块链是一个去中心化的账本 比特币采用了 基于交易的账本模式 然而 系统中并无显示记录账户包含BTC数 实际上其需要通过交易记录进行推算 在比特币系统中 全节点需要维护一个名为 UTXO UnspentTransaction
  • 对话量子链创始人帅初:区块链发展目标是构建协同进化的生命体

    有人说 区块链没有春节 只有春天 2月17日 大年初二 Qtum量子链创始人帅初在社区分享了自己关于区块链的25个看法 涵盖了公有链技术演进 区块链项目估值模型 区块链领域投资机会 区块链技术未来畅想等方方面面 引发了热议 ETH最大的风险
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记【03-BTC-数据结构】

    北大肖臻老师 区块链技术与应用 课程链接 点击这里 全系列文章链接 点击这里 主要补充内容及图片来源 区块链 技术驱动金融 该系列文章如中有任何侵权内容 或者有链接无法打开 图片加载上传失败等情况 请及时与我个人联系删除或修改 一 哈希指针
  • 区块链:一场始料未及的革命

    当主流媒体还在忙于猜测加密货币价格及其黑市阴谋时 他们已经遗漏了这一切的本质事实 那就是 密码学家们悄然发明了一套全新的技术原型 Unitimes特约作者Haseeb Qureshi在其文章 区块链 一场始料未及的革命 Blockchain
  • 为什么区块链是互联网的100倍?

    区块链的本质究竟是什么 如果区块链只是一个简单的分布式账本 凭什么在全世界的所有国家 商业领域掀起一浪又一浪的轩然大波 而如此多的精英人士不顾一切的争相入场 假设比特币是第一张多米诺骨牌 区块链究竟翻倒了哪些牌 洗牌的底层逻辑又是什么 未来
  • 区块链系统面临哪些风险以及有哪些防范措施

    区块链是涉及多方的开放系统 早期的应用又与虚拟加密货币相关 由此使得区块链系统所内含的和面对的风险得以暴露 同时各种安全措施也得以被及时使用和验证 但区块链在真实世界的大规模应用尚未展开 因此区块链所内含以及面临的风险暴露尚不完全 预防措施
  • 经济学人:重塑世界的区块链技术

    比特币背后的技术可让彼此互不认识的人建立可依赖的账簿 这远远超出了加密数字货币本身的意义 Mariana Catalina Izaguirre女士在她简陋的房子已经居住了三十年 但洪都拉斯的警察在2009年突然要将她赶走 不同于她在特古西加
  • 智能合约-Solidity官方文档(1)

    写在前面 HiBlock区块链社区成立了翻译小组 以太坊中文社区 翻译区块链相关的技术文档及资料 本文为solidity官方文档翻译的第一部分 智能合约概述 特发布出来邀请solidity爱好者 开发者做公开的审校 您可以添加微信baoba
  • 首个数字银行卡明年发行,广州出台区块链措施支持大湾区

    锌链接作为首个提出产业区块链的机构媒体 一直积极推动产业区块链落地 通过深度报道直戳行业痛点 通过分享会聆听行业声音 通过周报呈现行业大观 通过评论展现独特产业观察视角 本周 广州出台66条措施支持粤港澳大湾区金融发展 其中多项与区块链有关

随机推荐

  • GAMES101回顾 -- Geometry

    Geometry Examples of geometry 隐式几何 Inplict 定义 用函数进行表示 如 f x y z 0 显式几何 Explict 定义 所有点都是直接或通过参数映射给出 所有的 u v 映射到对应的 x y z
  • 【毕业设计】爱琴海——基于HTML5的婚庆用品商城网页设计

    一 内容简介 一 背景与意义 婚俗 是指结婚的风俗 各国各族人民按照自己的习俗 举行各具特色的婚礼 具有各自浓厚的民族独特风采 婚俗元素在是中国婚俗文化的媒介 承载了中华儿女对幸福和吉祥的追求 在中国婚俗文化的发展过程中 婚庆用品设计一直在
  • 题目 2307: 蓝桥杯2019年第十届省赛真题-灵能传输

    题目 在游戏 星际争霸 II 中 高阶圣堂武士作为星灵的重要 AOE 单位 在 游戏的中后期发挥着重要的作用 其技能 灵能风暴 可以消耗大量的灵能对 一片区域内的敌军造成毁灭性的伤害 经常用于对抗人类的生化部队和虫族的 刺蛇飞龙等低血量单位
  • Android卡顿分析中常见的log

    1 看内存 bugreport 开始的时候有pss的信息 并且进行排序 之后会写一个解析和计算的 2 找system log中关键部分 一般设备hang 住的时候用户会疯狂按keycode 可以找相关log keyCode 3 down t
  • 工作与生活如何平衡?

    工作与生活如何平衡 最近忙的有些不像话了 完全没时间可以让自己慢下来思考一些事情 一方面 最近一直感觉自己身体不舒服 一方面 工作上的压力越来越大 要承担的东西也越来越多 生活 发现自己身体体质变差也有一段时间了 从一开始的小腿长时间有酸痛
  • PackageManagerService启动及初始化流程

    PackageManagerService也是有ServerThread启动的 运行在system process进程 我们先来看下PackageManagerService是怎么启动的 PackageManagerService的启动需要
  • 数据结构小白之稀疏数组

    说在前面 这部分笔记是边学习韩顺平老师的图解数据结构与算法边整理出来的 其中也加入了一些拙见 希望2019的暑假可以让自己的编程基础更加扎实 稀疏数组 概念 应用实例 代码 二维数组转稀疏数组 代码 稀疏数组转二维数组 概念 当一个数组中的
  • react 中引入 ant-design

    react 中引入 ant design 一 安装 二 引入 1 全局引入 2 按需加载 手动按需加载 使用 babel plugin import 按需加载 1 运行 npm run eject 暴露出webpack的配置文件 项目会多出
  • 做一个微信小程序的完整流程

    一 引言 最近在帮朋友开发一个小程序 都说今年是小程序快速发展的一年 不懂技术的人 大部分零售店面都开始想做一个小程序帮助推广销售 虽然小程序技术门槛没那么高 但自己独立做一个小程序还是需要了解的内容比较多的 帮朋友做的是一个电商小程序 下
  • android 文件下载

    Download java中放入的是程序的主体 util包中放入的是一些公用的方法 其中FileUtils java放入的是对文件的一些基本操作 HttpDownloader java中是对下载的一些基本操作 第一步 先来看看主程序部分 p
  • 泪目!阿里大佬国庆8天花了50个小时,整理出这份18万字Android-360°性能优化实战解析

    缘起 经过近十年的发展 Android技术优化日新月异 如今Android 10 0 已经发布 Android系统性能也已经非常流畅 可以在体验上完全媲美iOS 到了各大厂商手里 改源码 自定义系统 使得Android原生系统变得鱼龙混杂
  • es AggregationBuilders 聚合查询

    es的聚合查询 聚合的分类 DSL语言实现Bucket聚合 DSL实现Metrics聚合 结合Bucket 在项目中遇到一块关于es的多条件聚合的代码 如下 AggregationBuilders terms agg name field
  • JAVA中String的用法详解

    创建字符串的几种方法 1 直接赋值 String s HelloWord 2 使用构造方法 2 1 根据传入的字符串创建字符串对象 String s new String HelloWord 2 2 根据字符数组创建字符串对象 char v
  • 如何更改ElementUI组件的图标大小以及标签属性

    话不多说 直接上菜 ElementUI提供的Rate评分组件的默认大小是这样的 图标太小了 想设置宽高 行高 尺寸 但代码不起作用 打开浏览器调试 发现是用font size设置才有用 由此代码存在优先级问题 要提高优先级 css中使用 g
  • CMakeLists.txt实例和语法介绍

    帮助文档 1 官方文档 一 实例 1 实例介绍 构建一个简单的加减法运算 需要调用静态库和动态库的实例 将add编译为静态库 sub编译为动态库 目录架构 gt tree LF 2 add add build sh add cpp add
  • urllib.error.URLError: 「urlopen error [Errno 11004] getaddrinfo failed」

    代码 import seaborn as sns anscombe sns load dataset tips print anscombe 报错 urllib error URLError
  • 关于单片机ADC采样参考电压应注意事项

    问题描述 工程和品质部反应现场安装的水表有水量跳变的情况 就是基表上显示0吨 远程抄读水量的时候电子读数是4400 4000 4440等错误的数字 在排除了传感器板本身晶圆损坏的情况下 发现还有几只表总是存在电子读数错误 而且这种错误发生在
  • 使用echarts当数据为空时展示空状态占位图

    在开发echarts的时候我们不得不考虑数据为空的情况 其实有很多种解决办法 我自己是这样做的 有更好的办法请私信我 共同学习 大概长这样 创建你的utils export const setNotopt demo subtext 暂无数据
  • 四.结构型——装饰者模式-Java代码

    0 设计模式 摘录 问题 动态地给一个对象 不是类 添加一些额外的职责 从增加功能的角度 Decorate模式比用子类更为灵活 Decorator和所装饰的对象具有相同的接口 使用它们的程序不必区别它们 对比组合模式 都是声明一个公共的接口
  • PBFT算法实现过程

    转载 https www jianshu com p 2383c7841d41 PBFT算法 三个阶段 预准备 pre prepare 准备 prepare 和确认 commit 步骤 从全网节点选举出一个主节点 Leader 新区块由主节