首页 > 其他分享 >分布式理论-拜占庭将军问题(The Byzantine Generals Problem)

分布式理论-拜占庭将军问题(The Byzantine Generals Problem)

时间:2024-10-08 13:48:29浏览次数:9  
标签:Generals Byzantine 苏秦 将军 作战 发送 拜占庭 信息 Problem

文章目录

本文借助战国苏秦合纵六国灭秦国的故事探讨拜占庭将军问题,充分展示拜占庭将军问题和分布式共识的关系。以此引出分布式共识问题在分布式中的重要地位。

模拟拜占庭问题

苏秦的困境

战国时期,齐、楚、燕、韩、赵、魏、秦七雄并立,后来秦国的势力不断强大起来,成了东方六国的共同威胁。于是,这六个国家决定联合,全力抗秦,免得被秦国各个击破。一天,苏秦作为合纵长,挂六国相印,带着六国的军队叩关函谷,驻军在了秦国边境,为围攻秦国作准备。但是,因为各国军队分别驻扎在秦国边境的不同地方,所以军队之间只能通过信使互相联系,这时,苏秦面临了一个很严峻的问题:如何统一大家的作战计划?万一一些诸侯国在暗通秦国,发送误导性的作战信息,怎么办?如果信使被敌人截杀,甚至被敌人间谍替换,又该怎么办?这些都会导致自己的作战计划被扰乱,然后出现有的诸侯国在进攻,有的诸侯国在撤退的情况,而这时,秦国一定会趁机出兵,把他们逐一击破的。
苏秦的困境在于:如果达成共识,制作统一的作战计划。

两忠一判难题

假设只有 3 个国家要攻打秦国,这三个国家的三位将
军,咱们简单点儿,分别叫齐、楚、燕。同时,又因为秦国很强大,所以只有半数以上的将
军参与进攻,才能击败敌人(注意,这里是假设哈,你别较真),在这个期间,将军们彼此
之间需要通过信使传递消息,然后协商一致之后,才能在同一时间点发动进攻。举个例子,有一天,这三位将军各自一脸严肃地讨论明天是进攻还是撤退,并让信使传递信
息,按照“少数服从多数”的原则投票表决,两个人意见一致就可以了,比如:

  1. 齐根据侦查情况决定撤退;
  2. 楚和燕根据侦查信息,决定进攻。

那么按照原则,齐也会进攻。最终,3 支军队同时进攻,大败秦军。
在这里插入图片描述
可是,问题来了: 一旦有人在暗通秦国,就会出现作战计划不一致的情况。比如齐向楚、燕分别发送了“撤退”的消息,燕向齐和楚发送了“进攻”的消息。撤退:进攻 =1:1,无论楚投进攻还是撤退,都会成为 2:1,这个时候还是会形成一个一致性的作战方案。但是,楚这个叛徒在暗中配合秦国,让信使向齐发送了“撤退”,向燕发送了“进攻”,那么:

燕看到的是,撤退:进攻 =1:2;
齐看到的是,撤退:进攻 =2:1。
按照“少数服从多数”的原则,就会出现燕单独进攻秦军,当然,最后肯定是因为寡不敌众,被秦军给灭了。

在这里插入图片描述叛将楚通过发送误导信息,非常轻松地干扰了齐和燕的作战计划,导致这两位忠诚将军被秦军逐一击败。这就是所说的二忠一叛难题。

口信消息型拜占庭问题之解

首先,三位将军都分拨一部分军队,由苏秦率领,苏秦参与作战计划讨论并执行作战指令。这样,3 位将军的作战讨论,就变为了 4 位将军的作战讨论,这能够增加讨论中忠诚将军的数量。
然后呢,4 位将军还约定了,如果没有收到命令,就执行预设的默认命令,比如“撤退”。除此之外,还约定一些流程来发送作战信息、执行作战指令,比如,进行两轮作战信息协商。为什么要执行两轮呢?

两轮方案原则

  • 第一轮

先发送作战信息的将军作为指挥官,其他的将军作为副官;
指挥官将他的作战信息发送给每位副官;
每位副官,将从指挥官处收到的作战信息,作为他的作战指令;如果没有收到作战信
息,将把默认的“撤退”作为作战指令。

  • 第二轮

除了第一轮的指挥官外,剩余的 3 位将军将分别作为指挥官,向另外 2 位将军发送作战
信息;
然后,这 3 位将军按照“少数服从多数”,执行收到的作战指令。

两轮方案实现

三位忠诚的将军先发送作战信息:

假设苏秦先发起作战信息,作战指令是“进攻”。那么在第一轮作战信息协商中,苏秦向齐、楚、燕发送作战指令“进攻”。
在这里插入图片描述
在第二轮作战信息协商中,齐、楚、燕分别作为指挥官,向另外 2 位发送作战信息“进攻”,因为楚已经叛变了,所以,为了干扰作战计划,他就对着干,发送“撤退”作战指令。

在这里插入图片描述
最终,齐和燕收到的作战信息都是“进攻、进攻、撤退”,按照原则,齐和楚与苏秦一起执行作战指令“进攻”,实现了作战计划的一致性,保证了作战的胜利。

叛军先发送作战信息:
在第一轮作战信息协商中,楚向苏秦发送作战指令“进攻”, 向齐、燕发送作战指令“撤退”。

在这里插入图片描述
然后,在第二轮作战信息协商中,苏秦、齐、燕分别作为指挥官,向另外两位发送作战信息。
在这里插入图片描述
最终,苏秦、齐和燕收到的作战信息都是“撤退、撤退、进攻”,按照原则,苏秦、齐和楚一起执行作战指令“撤退”,实现了作战计划的一致性。也就是说,无论叛将楚如何捣乱,苏秦、齐和燕,都执行一致的作战计划,保证作战的胜利。这个解决办法,其实是兰伯特在论文《  The Byzantine Generals Problem》中提到的口信消息型拜占庭问题之解:如果叛将人数为 m,将军人数不能少于 3m + 1 ,那么拜占庭将军问题就能解决了。

这个算法有个前提,也就是叛将人数 m,或者说能容忍的叛将数 m,是已知的。在这个算法中,叛将数 m 决定递归循环的次数(也就是说,叛将数 m 决定将军们要进行多少轮作战信息协商),即 m+1 轮(所以,你看,只有楚是叛变的,那么就进行了两轮)。你也可以从另外一个角度理解:n 位将军,最多能容忍 (n - 1) / 3 位叛将。
不过,这个算法虽然能解决拜占庭将军问题,但它有一个限制:如果叛将人数为 m,那么将军总人数必须不小于 3m + 1。在二忠一叛的问题中,在存在 1 位叛将的情况下,必须增加 1 位将军,将 3 位将军协商共识,转换为 4 位将军协商共识,这样才能实现忠诚将军的一致性作战计划。那么有没有办法,在不增加将军人数的时候,直接解决二忠一叛的难题呢?

签名消息型拜占庭问题之解

苏秦还可以通过签名的方式,在不增加将军人数的情况下,解决二忠一叛的难题。首先,苏秦要通过印章、虎符等信物,实现这样几个特性:

  • 忠诚将军的签名无法伪造,而且对他签名消息的内容进行任何更改都会被发现;
  • 任何人都能验证将军签名的真伪。

这时,如果忠诚的将军,比如齐先发起作战信息协商,一旦叛将小楚修改或伪造收到的作战信息,那么燕在接收到楚的作战信息的时候,会发现齐的作战信息被修改,楚已叛变,这时他执行齐发送的作战信息。

在这里插入图片描述
如果叛变将军楚先发送误导的作战信息,那么齐和燕将发现楚发送的作战信息是不一致的,知道楚已经叛变。这个时候,他们可以先处理叛将,然后再重新协商作战计划。

在这里插入图片描述

这个解决办法,是兰伯特在论文中提到的签名消息型拜占庭问题之解。而通过签名机制约束叛将的叛变行为,任何叛变行为都会被发现,也就会实现无论有多少忠诚的将军和多少叛将,忠诚的将军们总能达成一致的作战计划。

苏秦问题和分布式的关系

  • 故事里的各位将军,你可以理解为计算机节点;
  • 忠诚的将军,你可以理解为正常运行的计算机节点;
  • 叛变的将军,你可以理解为出现故障并会发送误导信息的计算机节点;
  • 信使被杀,可以理解为通讯故障、信息丢失;
  • 信使被间谍替换,可以理解为通讯被中间人攻击,攻击者在恶意伪造信息和劫持通讯。

分布式环境下常见容错算法有哪些

  • 拜占庭容错算法:PBFT算法、PoW算法等。
  • 非拜占庭容错算法:故障容错算法(Crash Fault Tolerance,CFT)CFT 解决的是分布式的系统中存在故障,但不存在恶意节点的场景下的共识问题。

使用:

  • 在存在恶意节点行为的场景中(比如在数字货币的区块链技术中),必须使用拜占庭容错算法(BFF)。
  • 存在可能会丢失消息,或者有消息重复,但不存在错误消息,或者伪造消息的情况。常见的算法有 Paxos 算法、Raft 算法、ZAB 协议

标签:Generals,Byzantine,苏秦,将军,作战,发送,拜占庭,信息,Problem
From: https://blog.csdn.net/weixin_45863010/article/details/142757174

相关文章

  • abc371E I Hate Sigma Problems
    给定长度为N的数组A[i],记f(l,r)表示区间[l,r]内不同A[i]的个数,求所有子区间f(i,j)之和。1<=N<=2E5,1<=A[i]<=N分析:贡献法,为了方便统计,区间中重复的数字以最左边出现的数为准,保证不重不漏。对于A[i],假设其上一次出现的位置为p,那么包含该数字的左端点可以是p+1,p+2,...,i,右端点可......
  • Skills - 2022 International Collegiate Programming Contest, Jinan Site, Problem
    有3种技能,\(n(\le10^3)\)天内每天可以对一个技能进行学习,第i天学习第j个技能可以为第j个技能增加\(a_{i,j}(\le10^4)\)的熟练度。在第i天结束时,每个技能的熟练度会减去距离上次学习该技能的天数,但最多减到0。求n天后能得到的熟练度的和的最大值。首先容易有一个显然的dp状态:\(f......
  • The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem H. Points Selectio
    注意到如果$\text{query}(a,b,c)$为真,那么$\text{query}(\geqa,\geqb,c)$一定为真。从小到大枚举询问中$a$的值,按横坐标从小到大依次加入每个点,维护$f_c$表示最小的$b$满足$\text{query}(a,b,c)$为真。假设当前正在加入点$(x,y,w)$,有$f_{(c+w)\bmodn}=\min(f_{......
  • The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem B. Mountain Bookin
    从$1$到$m$依次考虑每个日期。假设当前正在考虑第$i$天,那么只有第$i$天来访的游客以及指定第$i$天的查询是有用的。将这些游客和查询都提取出来,通过Kruskal重构树可以很方便地在$O(n\logn)$的时间内计算出这些查询的答案。不幸的是,本题还有加边删边操作,无法轻易地......
  • ICPC2021 沈阳站 M String Problem 题解 | 十种做法一网打尽 , 一道题带你回顾字符串科
    题目传送门题意给定一个字符串,求每个前缀的字典最大序子串。注意到:对于每个前缀$s_{[1,i]}$,字典序最大子串的右边界一定是\(i\)。随着着\(i\)的增大,字典序最大子串的左边界一定是单调不减的。解法不分先后。后缀数组SASA&SAM后缀数组&后缀自动机SA对所有......
  • bfs与dfs ,全球变暖——蓝桥problems178
    问题描述:........##.....##........##...####....###........有一张还以N*N的像素照片,“.”表示海洋,“#”表示陆地,其中上下左右能连在一起的陆地称作岛屿,例如上图有两座岛屿,由于全球气候变暖,靠经海洋的陆地会被淹没,问图中有多少座岛屿会被完全淹没..........................
  • 题解:CF913D Too Easy Problems
    题意给定一场考试,考试会持续\(T\)毫秒,由\(n\)道题目组成,你可以用\(t_i\)毫秒解决第\(i\)个问题,每个问题给定一个整数\(a_i\)。要求你选出一个试题集合\(S\),若该集合大小为\(k\),它应满足\(T\geq\sum_{i\inS}\limitst_i\),你需要最大化\(\sum_{i\inS}\limits[a_i......
  • AtCoder Beginner Contest 318 G - Typical Path Problem 题解
    G-TypicalPathProblem题目大意给定一张\(N\)个点、\(M\)条边的简单无向图\(G\)和三个整数\(A,B,C\)。是否存在一条从顶点\(A\)到\(C\),且经过\(B\)的简单路径?数据范围:\(3\leN\le2\times10^5\)\(N-1\leM\le\min(\frac{N(N-1)}2,2\times10^5)\)\(1\leA......
  • CF1993E Xor-Grid Problem
    结论,异或,状压DP2300Link:https://codeforces.com/problemset/problem/1993/E。先考虑一维的情况。若只有一维,每次操作的结果和[AGC016D]XORReplace是一样的。对\(a_i\)进行一次操作相当于令\(a_i:=\oplus_{1\lei\len}a_i\),再对\(j\)进行一次操作相当于令\(a_j:=......
  • MATLAB警告: 桌面配置文件已损坏或格式不正确。 Problem parsing Desktop restore xml
    电脑蓝屏后,重新打开MATLAB,出现此问题解决方案如下:如果您正在启动MATLAB并收到以下错误,则可能使用的是与MATLAB附带的Java版本不同的Java版本。ERROR:Warning:Anerroroccurredwhilereadingthedesktopconfigurationfile为了检查MATLAB使用的Java版本,启动MATLAB并运......