接触区块链的同学,多少都听说过拜占庭将军问题,经常看到或听到某某区块链使用某某算法解决了拜占庭将军问题,那么究竟什么是拜占庭将军问题呢?

什么是拜占庭将军问题

也被称为“拜占庭容错”、“拜占庭将军问题”。 拜占庭将军问题是Leslie Lamport(2013年的图灵讲得住)用来为描述分布式系统一致性问题(Distributed Consensus)在论文中抽象出来一个著名的例子。

这个例子大意是这样的:

拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击。这10支军队在分开的包围状态下同时攻击。他们任一支军队单独进攻都毫无胜算,除非有至少6支军队(一半以上)同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵骑马相互通信来协商进攻意向及进攻时间。困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭将军们才能保证有多于6支军队在同一时间一起发起进攻,从而赢取战斗?

拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问题。Lamport已经证明了在消息可能丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。所以,在研究拜占庭将军问题的时候,已经假定了信道是没有问题的.

问题分析

单从上面的说明可能无法理解这个问题的复杂性,我们来简单分析一下:

  1. 先看在没有叛徒情况下,假如一个将军A提一个进攻提议(如:明日下午1点进攻,你愿意加入吗?)由通信兵通信分别告诉其他的将军,如果幸运中的幸运,他收到了其他6位将军以上的同意,发起进攻。如果不幸,其他的将军也在此时发出不同的进攻提议(如:明日下午2点、3点进攻,你愿意加入吗?),由于时间上的差异,不同的将军收到(并认可)的进攻提议可能是不一样的,这是可能出现A提议有3个支持者,B提议有4个支持者,C提议有2个支持者等等。

  2. 再加一点复杂性,在有叛徒情况下,一个叛徒会向不同的将军发出不同的进攻提议(通知A明日下午1点进攻, 通知B明日下午2点进攻等等),一个叛徒也会可能同意多个进攻提议(即同意下午1点进攻又同意下午2点进攻)。

叛徒发送前后不一致的进攻提议,被称为“拜占庭错误”,而能够处理拜占庭错误的这种容错性称为「Byzantine fault tolerance」,简称为BFT。

相信大家已经可以明白这个问题的复杂性了。

中本聪的解决方案

在出现比特币之前,解决分布式系统一致性问题主要是Lamport提出的Paxos算法或其衍生算法。Paxos类算法仅适用于中心化的分布式系统,这样的系统的没有不诚实的节点(不会发送虚假错误消息,但允许出现网络不通或宕机出现的消息延迟)。

中本聪在比特币中创造性的引入了“工作量证明(POW : Proof of Work)”来解决这个问题,有兴趣可进一步阅读工作量证明。 通过工作量证明就增加了发送信息的成本,降低节点发送消息速率,这样就以保证在一个时间只有一个节点(或是很少)在进行广播,同时在广播时会附上自己的签名。 这个过程就像一位将军A在向其他的将军(B、C、D...)发起一个进攻提议一样,将军B、C、D...看到将军A签过名的进攻提议书,如果是诚实的将军就会立刻同意进攻提议,而不会发起自己新的进攻提议。

以上就是比特币网络中是单个区块(账本)达成共识的方法(取得一致性)。

理解了单个区块取得一致性的方法,那么整个区块链(总账本)如果达成一致也好理解。 我们稍微把将军问题改一下:假设攻下一个城堡需要多次的进攻,每次进攻的提议必须基于之前最多次数的胜利进攻下提出的(只有这样敌方已有损失最大,我方进攻胜利的可能性就更大),这样约定之后,将军A在收到进攻提议时,就会检查一下这个提议是不是基于最多的胜利提出的,如果不是(基于最多的胜利)将军A就不会同意这样的提议,如果是的,将军A就会把这次提议记下来。

这就是比特币网络最长链选择。

经济学分析

工作量证明其实相当于提高了做叛徒(发布虚假区块)的成本,在工作量证明下,只有第一个完成证明的节点才能广播区块,竞争难度非常大,需要很高的算力,如果不成功其算力就白白的耗费了(算力是需要成本的),如果有这样的算力作为诚实的节点,同样也可以获得很大的收益(这就是矿工所作的工作),这也实际就不会有做叛徒的动机,整个系统也因此而更稳定。

很多人批评工作量证明造成巨大的电力浪费,促使人们去探索新的解决一致性(共识)问题的机制:权益证明机制(POS: Proof of Stake)是一个代表。在拜占庭将军问题的角度来看,它同样提高了做叛徒的成本,因为账户需要首先持有大量余额才能有更多的几率广播区块,POS不是本文重点,以后在讲。

共识算法的核心就是解决拜占庭将军问题(分布式网络一致性问题)。

扩展阅读

The Byzantine Generals Problem

☛ 深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

☛ 我的知识星球为各位解答区块链技术问题,欢迎加入讨论。

☛ 关注公众号“深入浅出区块链技术”第一时间获取区块链技术信息。

什么是拜占庭将军问题相关推荐

  1. 【分布式共识三】拜占庭将军问题----书面协议

    2019独角兽企业重金招聘Python工程师标准>>> 区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:吴寿鹤 来源:区块链兄弟 原文链接:http:// ...

  2. 拜占庭将军问题与中本聪

    拜占庭将军问题很多人可能听过,但不知道是什么意思,本文从非专业的角度来讲讲,拜占庭将军问题到底是说什么的. 拜占庭将军问题(Byzantine Generals Problem),首先由Leslie ...

  3. 【分布式共识二】拜占庭将军问题----口头协议

    拜占庭将军问题是一个共识问题: 首先由Leslie Lamport与另外两人在1982年提出,被称为The Byzantine Generals Problem或者Byzantine Failure. ...

  4. 如何理解拜占庭将军问题?

    11位拜占庭将军去打仗, 他们各自有权力观测敌情并作出判断, 进攻或撤退, 那么怎么让他们只用传令兵达成一致呢? 一种很符合直觉的方法就是投票, 每位将军作出决定后都将结果"广播" ...

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

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

  6. 分布式系统概念 | 一致性协议:拜占庭将军问题、Paxos、Raft

    文章目录 拜占庭将军问题 Paxos 问题描述 执行过程 Prepare阶段 Accept阶段 Learner获取提案 活锁问题 Raft 状态机 执行流程 主节点选举 数据同步 拜占庭将军问题 拜占 ...

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

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

  8. 漫画:什么是拜占庭将军问题

    转载自 漫画:什么是拜占庭将军问题 什么是拜占庭将军问题? 在很久很久以前,拜占庭是东罗马帝国的首都.那个时候罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信使传递消息. ...

  9. 五、工作量证明链解决拜占庭将军问题之模拟程序(Objective-C)

    一.概述: 此程序用来模拟工作量证明链如何解决拜占庭将军问题,使用Objective-C语言,需要使用Xcode开发工具运行并执行演示,演示结果打印在Xcode控制台. 二.示例程序: 程序下载地址: ...

最新文章

  1. python opencv 画矩形框 外接矩形
  2. 数据库 ACCESS与SQL SERVER 2000分页SQL语句 分析
  3. 浅谈Aho-Corasick automaton(AC自动机)
  4. Redis: Useful commands
  5. Linux程序实现弹框,jQuery实现弹出框 效果绝对美观
  6. 十二、HTML5新增标签特性详解(audio、video、input)
  7. python列表去括号_python的常用序列
  8. AdWords是什么
  9. fps游戏 三角函数+模拟
  10. css px转rem工具,支持生产整个css文件统一修改
  11. Win10提示没有权限使用网络资源问题解决
  12. 数字通信计算机仿真问题汇总,燕山大学数字通信计算机仿真课设模板.doc
  13. H3C数通 H3CNE H3CSE 资料下载 肖哥视频下载
  14. 浅谈数字证书安装证书原理
  15. pinpoint集群的安装配置
  16. 阿里云服务器 —— linux是什么样子的呢(适合新手,建议收藏!)
  17. JAVA利用第三方平台发送短信验证码
  18. Linux磁盘管理基础——分区(MBR分区格式)
  19. Vue项目supermall仿蘑菇街详解(一)首页开发详解
  20. gpio上拉失效问题

热门文章

  1. Drawable Resource 之旅(一):BitmapDrawable 详解
  2. 从零开始学ios开发(十二):Table Views(中)UITableViewCell定制
  3. PHP经典乱码“口”字与解决办法
  4. Linux软raid创建和维护
  5. Oracle RAC删除节点
  6. 什么是CS/BS(一)转
  7. MySQL 误操作恢复表
  8. SpringBoot+Mybatis配置Druid多数据源
  9. Snap和Flatpak 通吃所有发行版的打包方式。
  10. F5配置irule,使其系统在X个时间段提供服务,其余时间显示维护页面