草庐IT

拜占庭问题

搬砖手 2023-04-05 原文

拜占庭问题

说明

本文为哈尔滨工程大学计算机科学与技术学院区块链技术课程附加作业

完成人:

(1)学号:2019201131 姓名:周光煜 工作量:50%

(2)学号:2019201120 姓名:孙世威 工作量:50%

区块链简介

区块链是一个基于比特币协议的不需要许可的分布式数据库,它维护了一个持续增长的不可被篡改和修改的数据记录列表,即使对于数据库节点的运营者也是如此。简而言之,区块链是由区块用某种方式组织起来的链条。区块链现如今广泛应用于我们的生产生活之中,例如疫情防控后的有序复工复产等。
区块链是一个分布式账本账本,区块链网络系统务中心地维护一条不停增长的有序的数据区块,每一个数据区块内部都有一个时间戳和一个指针,指向上一个区块,一旦数据上链后就不可修改。由此可见,区块链的典型特点之一就是具备分布式结构。这就要求我们必须解决分布式系统中实现状态共识的算法,保证不同账本节点上的账本数据的一致性和正确性,否则区块链将失去其信用。由此,便有了拜占庭将军问题和拜占庭容错技术。

拜占庭问题简介

拜占庭问题是莱斯特兰伯特等科学家于1982年提出用来解决一致性问题的一个模型。拜占庭是古代东罗马帝国的首都,由于其地域宽广,守卫边境的多个将军需要通过信使来传递消息,以对军事活动达成一致的决定。但是由于将军中可能存在叛徒,这些叛徒将努力向不同的将军传递不同的消息,试图干扰共识的达成并使得某些将军做出错误的决定。拜占庭问题描述的就是在此情况下,如何让忠诚的将军们能够达成行动的一致。

三将军模型

拜占庭有n个将军,他们都可以独立的作出决策,选择进攻和撤退,彼此之间通过信使传递消息。对于一场战争,所有的将军必须作出共同的作战决策并依此执行,只有半数以上的将军同时进攻才能取得战斗的胜利,作战计划的制定遵循“少数服从多数原则”。为了简化问题,我们采用3个将军进行说明。
假设现有三个将军A、B、C,他们都是忠诚于拜占庭的将军,对于一场战斗,他们三人将讨论出一个共识的作战计划,选择进攻或者撤退,并忠诚的执行作战指令。他们首先分别根据自己的判断选择进攻或者撤退,然后将自己的决策发送给其他两个将军,其他两个将军也将他们的作战计划传递给该名将军,然后这名将军根据少数服从多数的原则,执行大多数人选择的作战方案。
假设A、B两名将军选择进攻,C将军选择撤退。那么,
A将军通过信使告知B、C选择进攻;
B将军通过信使告知A、C选择进攻;
C将军通过信使告知A、B选择撤退;

对于每个将军而言,收到的消息中进攻与撤退的比例均为2:1,因此每个将军根据少数服从多数的原则,均执行进攻指令,实现了共同作战的目标。
但是,拜占庭地域辽阔,将军中可能存在叛徒。叛徒并不一定会如实的发送相同的指令,就会导致将军之间的一致性遭到破坏,无法达成共识作战目标。
下面假设叛徒为B,叛徒B将告知A和C不同的作战信息。
A将军通过信使告知B、C选择进攻;
C将军通过信使告知A、B选择撤退;
叛徒B通过信使告知A选择进攻,但告知将军C选择撤退;

在这种情况下,A收到的指令中进攻与撤退的比例为2:1,A将军将选择进攻.C将军收到的指令中,进攻与撤退的比例为1:2,C将军选择了撤退。而叛徒B理所当然会选择撤退。于是我们发现,只有将军A发动了进攻,无法取得战争的胜利,将军之间的共识也被打破,产生了结果的不一致性。

指挥官-副官模型

将拜占庭问题简化一下描述即为:有一个指挥官发送一个命令给他的n-1个副官们,而且在这个问题中要有两个基本条件:

条件一:所有忠实的副官遵从相同的指令;

条件二:如果指挥官是忠实的,那么所有副官都将执行他的命令。

下面我们就用实际的例子讨论一下拜占庭问题,帮助大家理解

指挥官和副官都是忠诚的

指挥官分别向两个副官发出进攻命令。副官1和副官2都是忠诚的,副官2向副官1说:“指挥官下达了进攻的命令”。副官1收到的副官2的消息和指挥官的消息是相同的,这时就达成了共识,共同发起进攻。

副官2是叛徒

指挥官会分别向两个副官发出进攻命令。副官2是叛徒,他欺骗副官1说:“指挥官下达了撤退命令”。副官1收到了两个不同的命令,判定指挥官与副官2中至少有一个叛徒。他无法判断谁是叛徒,因此也无法正确行动。

指挥官是叛徒

指挥官向两个副官下达了不同的命令。副官1收到的是不同的命令,那么指挥官和副官2中有叛徒,但由于不能确定谁是叛徒,无法采取正确的行动。

结论

当三人中有一个是叛徒时,无法达成一致的行动,即拜占庭问题无解,且无法判断叛徒是谁。

如何解决拜占庭问题

F代表叛徒的数量,N代表将军的总数,

根据Lamport对拜占庭问题的研究表明,当N>=3*F+1时,拜占庭问题有解。

证明 n>3m,BGP(n, m)存在
接下来,让我们一起来看下当 n>3m,BGP(n, m)存在时应该如何证明。存在类的证明相比较而言直接一些,如果我们能够找到一个解决 BGP(n, m)的策略就可以证明解法存在。此时的难点变成——如何找到这个策略,对于这类策略问题,同样有一个通用的数学证明方法,那就是数学归纳法。

和反证法类似,数学归纳法的证明通常也分为两步:

证明 n=1 的时候命题成立;
假设 n=k-1 时命题成立,证明 n=k 时命题也成立。
可以看出,数学归纳法和反证法比较类似,在上一个证明中我们利用反证法从假设命题推导已知结论,而在数学归纳法里,我们是从已知结论推导假设命题。

在上一讲中,已经讲了在四个将军、一个叛徒的情况下,也就是BGP(4, 1) 是存在解决方法的。那接下来我们就来小试牛刀,证明一下在 n>=4 的情况下, BGP(n, 1) 存在这个命题。n=4 的情况已经是成立的了,现在假设 n=k-1 命题也成立,也就是 BGP(k-1, 1)存在,看一下 n=k 的情况是怎样的。

首先,假设在 n=k 的情况下发令将军是忠诚的,那么剩下的 k-1 个副官里有 1 个叛徒。接下来,k-1 个副官之间同步关于发令将军所发出的命令。这种情况下每个副官都成为了一个发令将军,发的命令是关于自己从最开始的发令将军那里所得到的命令。由于BGP(k-1, 1) 的存在,忠诚副官之间可以通过 BGP 算法对每个副官所发出的命令达成一致,因此每个忠诚副官就会受到 k-2 个忠诚副官的命令、1 个叛徒副官的命令。由于忠诚副官之间的命令都是从忠诚发令将军那里来的命令,他们之间命令也是一致的,因此每个忠诚副官只要对所收到的命令取一个大多数人的意见,彼此之间就可以达成一致。

再来看下发令将军是叛徒的情况,那么剩下 k 个副官都是忠诚的,且他们彼此之间不存在欺骗,我们还是用上一步中用BGP(k-1, 1) 同步消息取大多数的方法,所有忠诚副官之间最终达到的命令,依然是一致的。如此一来,我们用同一套同步消息,且取大多数的方法就完成了从 n=k-1 到 n=k 的推导,也就证明了在 n>=4 的情况下 BGP(n, 1)的存在。而且,你会发现在证明推导的过程中我们也找到了解决这个问题的策略。

好了,现在让我们进入正餐,证明 n>3m 时,BGP(n, m) 存在的命题。由于我们上一步证明了 BGP(n, 1),因此 BGP(n, 1) 也就变成了一个已知条件。我在这里对 m 进行一下归纳:假设 m=k-1 命题成立,也就是BGP(n, k-1) 存在,证明 m=k 时命题也成立。这一命题和上一个命题的证明过程,非常类似。

首先,假设在 m=k 时发令将军是叛徒, 剩下的 n-1 个副官之间进行信息同步,由于剩下的副官里有 k-1 个叛徒,在 n>3k 的情况下 n-1>3k-1>3k-3,因此剩下的忠诚副官之间可以通过 BGP(n, k-1) 算法来对每个副官发出的命令达成一致。这样一来,我们依然可以用取大多数的方法来让忠诚副官之间达到一致。

这里我们可以总结出数学归纳法的一个套路,就是想方设法在 n=k 的情况下削减掉一个将军,这样就可以复用 n=k-1 的假设,然后再削减掉一个到 n=k-2 的假设,一直递归下去到 n=1 的已知情况。之后在使用 n=1 的结论一路向上来解决 n=2,n=3 一直到 n=k。

再来看发令将军是忠臣的情况。你会发现少了一个忠臣,副官里叛徒数量占比变大了,固而没办法再用之前的假设了。如果我们还是用上一步的方法不断地削减一个将军进行递归的话,叛徒的比例可能会越来越大,当削减到 BGP(n-m+1, 1) 时,剩余的副官里最多可能有 m 个叛徒和 m+1个忠臣。表面看上去问题似乎是无法解决了,但是你回过头来仔细再想一下,该假设的前提是发令将军是忠臣,因此 m+1 个忠臣收到的命令是一致的。由于同步信息后所有的 2m+1 个命令中与发令将军一致的占据了多数,因此用同样取大多数的方法我们依然得到了正确且一致的结果。

综合上面两个推导,不难看出:

无论发令将军忠诚与否,BGP 算法都可以达成一致;
我们既证明了在 n>3m 时,BGP(n, m) 存在的命题,同时又在推导的过程中得出了 BGP 算法的解决策略,可谓是一举两得。

拜占庭容错算法

拜占庭容错算法是面向拜占庭问题的容错算法,主要用于解决在网络通信可靠但节点可能故障的情况下如何达成共识。

实用拜占庭容错算法其实就是给全网消息的顺序进行共识,得到一个全局的序。在恶意节点不高于总数的1/3并在一个比较弱的同步假设的情况下,该算法能够同时保证安全性和活性。

区块链网络的记账共识和拜占庭将军问题相似。参与共识记账的每一个记账节点相当于将军,节点之间的消息传递相当于信使,某些节点可能由于各种原因产生错误信息并传递给其他节点。通常,这些发生故障节点被称为拜占庭节点,而正常的节点称为非拜占庭节点。
拜占庭容错系统是一个拥有n台节点的系统,整个系统对于每一个请求,满足以下条件:
(1)所有非拜占庭节点使用相同的输入信息,产生同样的结果;
(2)如果输入的信息正确,那么所有的非拜占庭节点必须接收这个信息,并计算相应的结果。
与此同时,在拜占庭系统实际运行中,还需假设整个系统的拜占庭节点不超过m台,并且满足安全性和活性。
拜占庭系统普遍采用的假设有:
(1)拜占庭节点的行为可以是任意的,拜占庭节点间可以共谋;
(2)节点之间错误不相关;
(3)服务器间传递的信息,第三方可以嗅探到,但不能篡改、伪造和破坏完整性;
(4)大部分协议假设消息在有限时间内可以传递到目的地。

原始的拜占庭容错系统缺乏实用性,采用一定的手段改进而来的PBFT算法降低了拜占庭协议运行复杂度,使拜占庭协议在分布式系统中的应用成为可能。PBFT在很多场景中都有应用,区块链中适合于对强一致性有要求的私有链和联盟链场景,如IBM主导的区块链超级账本项目。
整个协议的基本过程如下:
(1)客户端发送请求,激活主节点的服务操作。
(2)当主节点接收请求后,启动三阶段的协议以向各从节点广播请求
A.序号分配阶段,主节点给请求赋值一个序列号n,广播序列分配消息和客户端请求消息m,并将构造PRE-PREPARE消息给各从节点;
B.交互阶段,从节点接收PRE-PREPARE消息,向其他服务节点广播PREPARE消息;
C.序号确认阶段,各节点对视图内请求和次序进行验证后,广播COMMIT消息,执行收到的客户端的请求并给客户端响应。
(3)客户端等待来自不同节点的响应,若有m+1个响应相同,则该响应即为运算的结果。

比特币的工作量证明共识机制

RE消息,向其他服务节点广播PREPARE消息;
C.序号确认阶段,各节点对视图内请求和次序进行验证后,广播COMMIT消息,执行收到的客户端的请求并给客户端响应。
(3)客户端等待来自不同节点的响应,若有m+1个响应相同,则该响应即为运算的结果。

比特币的工作量证明共识机制

比特币的工作量证明共识机制给予了解决拜占庭问题的新思路。工作量证明能够在恶意节点的算力不超过系统总算力1/2的情况下解决拜占庭问题。工作量证明1/2的容错阈值比BFT类共识机制1/3的容错阈值要高,其主要原因是BFT类共识机制解决拜占庭将军问题的框架是通过投票的方法实现的,而工作量证明是通过争夺记账权的方式而非以合作投票的方式解决拜占庭将军问题。

有关拜占庭问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  4. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  5. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  9. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  10. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

随机推荐