1 拜占庭将军问题

Leslie Lamport(莱斯利·兰波特)在论文《The Byzantine Generals Problem》提出拜占庭将军问题:

一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。

出现的问题:

  1. 假如有5支部队,低于3支部队则无法攻打下来反而会被反攻,有2支部队选择进攻,2支选择撤退,这时候出现一个叛徒,对其中2支选择进攻的部队送信说要进攻,选择进攻的部队一看有3支部队选进攻则进攻;叛徒对2支选择撤退的部队送信说要撤退,选择撤退的部队一看有3支部队选撤退则撤退了,最终3支部队攻城失败,整个部队失败。一致性遭到破坏。
  2. 也可能送信的过程中,送信人被敌人截杀,部队一直不能收到所有其他部队传递过来的消息。

2 分布式计算机系统

以上问题放到计算机系统中,各支部队便是计算机,信差便是通信系统。

3 PBFT(Practical Byzantine Fault Tolerance)实用拜占庭容错

PBFT算法的核心理论是N>=3F+1,其中N是总节点数,F是故障节点(故障包括叛徒或不响应)。假如有F个故障节点,至少有3F+1个节点才能保证整个系统正确运行。

算法要求至少要4个参与者ABCD,1个为总司令,3个师长

没有叛徒:

  1. 4个将军分别为ABCD,选举A为总司令,总统(终端用户)向A说进攻
  2. A对BCD说进攻
  3. BCD都各自对其他节点说进攻
  4. 每个节点都收到其他人说进攻的指令,则进攻

假如出现1个叛徒D:

  1. A对BCD说进攻
  2. D对BC说撤退
  3. 对B而言,A和C说进攻(2票)大于D说撤退(1票),进攻

假如出现2个叛徒CD:

  1. A对BCD说进攻
  2. CD对B说撤退,撤退
  3. A又进攻,一致性失败

所以当有4个节点时,只能容许1个节点出问题,该问题可能是叛徒(伪造消息)或者没有消息(无响应)

实际上PBFT会更复杂一些,分为预准备(pre-prepare)、准备(prepare)和确认(commit)

  1. request:总统Z向A发消息
  2. pre-prepare:服务端A收到Z的请求后进行广播,扩散至ABC
  3. prepare:BCD,收到后记录并再次广播,B->ACD,C->ABD,D因为宕机无法广播
  4. commit:ABCD节点在Prepare阶段,若收到2F(F为可容忍错误个数)个或以上和自己相同的请求,则进入Commit阶段,广播Commit请求
  5. reply:ABCD节点在Commit阶段,若收到2F+1个的相同请求,则对Z进行反馈

加入出现1个伪装节点D,对于B号节点来说,有A、C号节点和自己相同,大于等于2F个即2个,则进入commit阶段,并告知其他节点;同理对于A号节点和C号节点也会进入commit阶段。最终有ABC三个节点进入commit阶段,3个请求满足2F+1个即3个,它们会对Z进行反馈。

  • 为什么是3F+1

容错,就是不需要等待的数量,当有4个节点,只需要有3个节点反馈数据就立即决策了,那么3个有可能是一个是有伪装的,这种情况下也能保证系统一致性(节点不能无限制的等待所有其他节点都发数据过来,他只需要等待N-F即2F+1个反馈)。

  1. 如果未接到反馈的恰好是叛徒节点,剩下的全都保持一致,没有问题。
  2. 如果未反馈的是好节点,叛徒节点只有1票,则2个好节点>1个叛徒,系统正常。
  3. 3F+1。系统只等N-F个就做决策。极端情况下,所有的F个叛徒都先发数据,那么剩下的必须必须是F+1个正确的节点才能保证 F+1个叛徒 > F个叛徒,那么所有N的节点为(F+1个收到的节点 + F个未收到节点 + F个叛徒)也就是3F+1个。

4 比特币POW(Proof Of Word)工作量证明

比特币通过工作量证明来解决一致性问题,通过数学的方式,让其中一个节点成为当前情况下的总司令,后续所有的命令都是根据该结果来进行。

举例来到将军问题,先假定某个数序规则Puzzle需要将军的军师平均花一天即24小时的时间才能解开。每次算出来的将军可以获得总司令给的军械奖励。

  1. 任何一个将军都可以说6天后进攻或撤退,然后根据‘6天后进攻’或者‘6天后撤退’内容按照Puzzle规则进行计算。
  2. 将军A花了23个小时率先发现‘天行健’和‘6天后进攻’符合Puzzle规则,于是他送信给其他将军。
  3. 其他将军收到该信息之后,下一步‘攻击东城门’或者‘攻击西城门’,根据‘6天后进攻&天行健&A#攻击东城门’或‘6天后进攻&天行健&A#攻击西城门’作为内容按照Puzzle规则进行计算。
  4. 将军B花了25个小时率先发现‘天圆地方’和‘6天后进攻&天行健&A#攻击东城门’符合Puzzle规则,于是他送信给其他将军。
  5. 其他将军收到该信息之后,下一步‘使用云梯’或者‘使用攻城锤’,根据‘6天后进攻&天行健&A#攻击东城门&天圆地方&B#使用云梯’或‘6天后进攻&天行健#攻击东城门&天圆地方&B#使用攻城锤’作为内容按照Puzzle规则进行计算。
  6. 一直重复以上4、5。

为了获得奖励,他们一般都是谁先到这里就根据谁的算。并且谁的指令最长最有可能被司令认可获得奖励军械,这样,所有的将军都会在第六天进行进攻。

其中的问题:

  1. 在步骤2将军Z也花了23个小时发现‘自强不息’和‘6天后撤退’符合Puzzle规则,也送信给其他将军。那么其他将军一部分根据将军A的结果往下算,一部分根据将军Z的结果往下算,在第二天谁最先解开Puzzle那么极有机会率先通知其他将军。结果将军B率先发现第二个Puzzle,并通知了70%的将军的时候,这70%的将军解开第三个Puzzle的概率远远大于剩下的30%的将军解开第三个Puzzle。到第四个Puzzle的时候就可能变成90%:10%,第五个Puzzle的时候变成98%:3%,第六个Puzzle的时候变成99.99%:0.01%。这样差不多所有将军都会进行进攻。(即为比特币的6次确认可以判定交易真实)
  2. 也可能将军Z胜出,只不过上面的比例反过来,那么内容变成‘6天后撤退&人之初&Z#向东撤退5公里&赵钱孙&Y#扎营做饭&弟子规&X’等。但是并不影响第6天他们集体进攻还是撤退。

5 总结

  1. PBFT算法要求知道节点数是确定的,比如22个节点,那么F可以为7,有15个节点的数据即可做决定,适合联盟链
  2. POW共识不限定节点数,不是实时结算的,一般而言6次确认之后基本上没有问题

拜占庭将军问题与PBFT算法和POW共识相关推荐

  1. 拜占庭将军问题与区块链共识算法PBFT

    概述 1.两军问题 两军问题中信道是不可靠的,并且其中没有叛徒之说. 解决方式:Tcp的三次握手可以提供相对可靠地信道通信. 2.拜占庭将军问题 概述 拜占庭将军问题中并不去考虑通信兵是否会被截获或无 ...

  2. 丢失的拜占庭将军问题之谜

    众所周知,比特币作为一个开放的.分布式的点对点网络,所需要克服的一个非常关键的问题就是拜占庭将军问题,也就是关于分布式共识的问题. 共识机制,也是区块链领域一个非常热门的创新点.各种项目层出不穷,热衷 ...

  3. 区块链:3、共识算法 拜占庭将军问题

    区块链:3.共识算法 拜占庭将军问题 区块链系统采用分布式共识算法在无中心节点控制,又可能存在破坏节点的环境下确立系统状态,从而建立信任.区块链因此也被称为信任机器. 共识算法因不同的应用场景而有所不 ...

  4. 分布式共识四】POW共识算法

    下面我来说说Bitcoin是如何通过Pow算法解决拜占庭将军问题的. 比特币 2008年,中本聪介绍了一个点对点的电子现金系统--比特币.比特币的基石是拜占庭共识协议.比特币怎样实现了拜占庭共识协议将 ...

  5. [区块链] 拜占庭将军问题 [BFT]

    背景: 拜占庭将军问题很多人可能听过,但不知道具体是什么意思.那么究竟什么是拜占庭将军问题呢? 本文从最通俗的故事讲起,并对该问题进行抽象,并告诉大家拜占庭将军问题为什么在区块链领域作为一个重点研究问 ...

  6. 区块链 :拜占庭将军问题 [BFT]

    目录 背景: 什么是拜占庭将军问题: 通俗分析: 问题抽象: 中本聪的解决方案: 经济学分析 REFERENCE 正文 回到顶部 背景: 拜占庭将军问题很多人可能听过,但不知道具体是什么意思.那么究竟 ...

  7. 区块链--拜占庭将军问题--区块链

    目录 背景: 什么是拜占庭将军问题: 通俗分析: 问题抽象: 中本聪的解决方案: 经济学分析 REFERENCE 正文 回到顶部 背景: 拜占庭将军问题很多人可能听过,但不知道具体是什么意思.那么究竟 ...

  8. 学习区块链,绕不过去的“拜占庭将军问题”!!这里正好有通俗易懂的解释

    "拜占庭将军问题"维基百科: 拜占庭将军问题(Byzantine Generals Problem),是由莱斯利·兰波特在其同名论文中提出的分布式对等网络通信容错问题.在分布式计算 ...

  9. 这怕是我看过的最好的关于 “ 拜占庭将军问题 ” 的文章

    虽然在之前的博客中,我也有写过类似的,拜占庭将军问题.但是,个人认为这是我看过介绍的最好的.推荐给你们! 拜占庭将军问题(The Byzantine Generals Problem)提供了对分布式共 ...

最新文章

  1. div 自动换行_js自动打字--autotypejs
  2. 超级黑科技代码!Python打造电脑人脸屏幕解锁神器附带接头暗号
  3. 简易数字频率计(verilog HDL设计)(2020维护版本)
  4. Java能抵挡住JavaScript的进攻吗?
  5. cgroup限制oracle,Yarn 使用 Cgroup 实现任务资源限制
  6. boost::math模块使用 agm 以高精度计算 lemniscate 常量
  7. linux之SQL语句简明教程---UNION ALL
  8. leetcode 605. 种花问题(贪心算法)
  9. hbase scala 实例_scala操作HBase2.0
  10. 工作中一些环境问题解决记录
  11. proxy ip 收集方式总结
  12. 【深度学习技术】小样本医学影像的深度学习关键技术之深度模型的可解释性
  13. 硬盘转速和平均寻道时间
  14. 上海浦东生育津贴领取记录
  15. 阿里飞天云平台架构简介
  16. 从头学习爬虫(十六)进阶篇----第三方接口
  17. leetcode 347
  18. Ubuntu 更改环境变量 PATH
  19. C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-夏曹俊-专题视频课程...
  20. 主编推荐 | 深度学习如何影响运筹学?

热门文章

  1. 北京通州规划图全面汇总
  2. 从SGS认识晚安月亮纸尿裤,换个角度更专业
  3. 3.4 利用Pandas进行数据清洗和数据规整化
  4. 鲲鹏代码迁移工具介绍
  5. hudi mor表数据ro和rt表问题 rt更新数据表无法使用count
  6. 关于《后浪》的B站弹幕分析总结(四)——Python实现LDA内容主题挖掘及主题可视化
  7. 微积分 = 微分 + 积分
  8. 关于认知力的学习总结
  9. 【UML】关系之依赖关系
  10. CSS中#号、.号、*号详解