13 | PBFT算法:有人作恶,如何达成共识?
13 | PBFT算法:有人作恶,如何达成共识?
讲述:于航
时长10:20大小9.46M
口信消息型拜占庭问题之解的局限
PBFT 是如何达成共识的?
内容小结
课堂思考
赞 12
提建议
精选留言(36)
- 笑若海2020-03-11如果接收到小于f+1个消息就认可服务返回结果,可能都是来自f个恶意节点的消息,导致客户端接受恶意结果。f+1保证至少一个正确结果,如果其中存在恶意消息,客户端会发现不一致性,认为请求处理失败。 这又引发一个新问题,客户端怎么确定f值?
作者回复: 加一颗星:),f = (n - 1)/3
共 3 条评论17 - DFW2020-05-09对于 pbft 算法,核心过程有三个阶段,分别是 pre-prepare (预准备)阶段,prepare (准备)阶段和 commit (提交)阶段。对于 pre-prepare 阶段,主节点广播 pre-prepare 消息给其它节点即可,因此通信次数为 n-1 ;对于 prepare 阶段,每个节点如果同意请求后,都需要向其它节点再 广播 parepare 消息,所以总的通信次数为 n*(n-1),即 n^2-n ;对于 commit 阶段,每个节点如果达到 prepared 状态后,都需要向其它节点广播 commit 消息,所以总的通信次数也为 n*(n-1) ,即 n^2-n 。所以总通信次数为 (n-1)+(n^2-n)+(n^2-n) ,即 2n^2-n-1 ,因此pbft算法复杂度为 O(n^2) 。展开
作者回复: 加一颗星:)
共 3 条评论14 - 沉淀的梦想2020-03-11客户端要收到 f+1 个结果,我理解这个是为了防止 f 个叛徒直接给客户端返回 ok。不太理解的是为什么准备阶段要收到 2f 个一致的包含作战指令的准备消息,提交阶段需要 2f+1 个验证通过呢?这两个也设置成 f+1,不可以吗?
作者回复: 加一颗星:),问题1:2f个准备消息和预准备消息是相同的,所以,加上主节点,就是2f + 1了,也就是说准备阶段的2f个,等同于提交阶段的2f + 1。问题2:如果设置为f + 1,那么就会被恶意节点干扰,比如,在准备和提交阶段,f个恶意节点,都很配合,但在最后,它们却不返回响应消息给客户端,这时客户端可能始终无法收到f + 1个一致的响应消息,也就是达成共识失败,然后客户端不断重试,肯定不行了。
共 2 条评论12 - 竹马彦四郎的好朋友影...2020-05-05我按照老师第一讲的OM算法写了个简单的递归(https://yfscfs.gitee.io/post/极客时间之分布式协议与算法实战-01-拜占庭将军问题有叛徒的情况下如何才能达成共识/) 几乎不可用,22个节点的拜占庭将军问题,至少要吃掉2个G的内存才能跑出结果~
作者回复: 加一颗星:),你的演示程序和内存问题的分析,我看了,很棒,我后面补充个演示程序吧。
9 - Fs2020-03-12这就是为什么区块链的效率提升不上去?达成共识的时间效率太低
作者回复: 加一颗星:),是的,这也是为什么Hyperleger Fabric最终没有采用PBFT,而是通过法律来约束“节点作恶”的行为。
4 - 6 7 8 9 102020-03-11最后消息数的算法,看不懂呢
作者回复: 对哪一步的计算,不理解呢?
4 - superfq2020-06-17请问老师,f值是怎么确定的?在一个动态集群中怎么确定f值
作者回复: 加一颗星:),f = (n - 1)/3。
3 - myrfy2020-03-11老师,可以详细解释一下视图变更是什么意思吗
作者回复: 好,我后面补充下,具体说说和演示下。
3 - 右耳听海2020-03-15麻烦老师补充下pbft实现一系列共识值pbft做了些什么优化,消息数是随一系列值倍数增加吗
作者回复: 加一颗星:),是倍数增加的,相当于一轮新的共识协商。更多细节,我后面补充说说吧。
2 - Purson2020-03-13如果将军数为 n、叛将数为 f,那么算法需要递归协商 f+1 轮,消息复杂度为 O(n ^ (f + 1)),是怎样算出来的,第一讲说了两轮的能看明白,但是没有说3轮的,找不到递推关系,希望老师详细说一下BFT和PBFT两者区别
作者回复: 加一颗星:),问题1:和另外一个问题重复了,详细推导过程和原理,我后面做个补充。问题2:BFT一般是拜占庭容错,在这里,你指的是指口信消息型拜占庭问题之解(om)吧?om与PBFT主要区别,除了消息复杂度外,还有就是om不关心达成共识的值是什么,pbft是就指定值达成共识;om非常理论,很难在实际场景中落地,pbft实用,在实际场景中,能落地。
2 - 单林敏2022-02-09老师您好,消息数最后的 3f - 1 我实在不理解,麻烦您解答: 总共加主节点是 3f + 1 个回复 假设叛徒不回复,也是 2f + 1 个回复 但是这里怎么是 3f - 1 个回复呢?共 1 条评论1
- kylexy_08172020-05-04韩老师你好,有个细节文中好像没有提及,就是如何在真实的环境中,确定叛军的数量呢?如果一个节点被hack了,签名也能被破解吧?通过回复的消息内容感觉也不太靠谱,例如当叛军比较多时。求解答~
作者回复: 加一颗星:),问题1:在应用中,不是确定最大叛军的精准数量,而是提升场景的可信,比如有许可控制、相对可信的联盟链。问题2:这个涉及到了攻防对抗(比如有硬件机制能防止签名被破解和篡改),在这里,咱们只考虑正常情况,也就是叛将不知道忠将的签名,叛将之间可以串通。
1 - 右耳听海2020-03-15老师能具体说下pbft实现的是一系列值的共识而不是单值的共识具体指什么吗,一系列值的共识不也可以包装成一个值吗,不如:进攻,准备粮草,这是两个值,但是也可以是在一个消息中
作者回复: 加一颗星:),两个值,就是两个消息,放到一个消息中,就是一个值了。单值的共识,比如Basic Paxos,它只能就提议的一个值达成共识,你再提议新值,它是无法达成共识的。一系列值的共识,比如Multi-Paxos能就多值(也就是指令)达成共识,也就是你提议了一个值,可以再提议一个值,分别会达成共识,比如PBFT,客户端可以发送一个请求,再发送一个请求,请求的内容会分别达成共识,被忠诚的节点们执行。
1 - Purson2020-03-13口信型的O(n ^ (f + 1))是怎样推导出来的,我看第一章说2轮,第一轮A向 B C D 分别发一个消息,记3,第二轮剩下的3个分别向对方发2消息,记6,加起来总共9,用 4^2好像不太对。除非第一轮的苏秦不是将军,或者n就是忠诚将军数,n=3,就对。但是如果是f=2,一共有7名将军,第二轮协商到底是怎样的顺序?
作者回复: 加一颗星:),详细的推导过程和推导原理,我后面做个补充吧。
共 2 条评论1 - 翠羽香凝2020-03-12“口信消息型拜占庭问题之解的局限我想说的是,这个算法有个非常致命的缺陷。如果将军数为 n、叛将数为 f,那么算法需要递归协商 f+1 轮,” 这里看不懂,01讲不是说算法一共是两轮吗?
作者回复: 3忠1叛,需要进行2(也就1 + 1,其中f为1)轮协商,是具体的实例。
共 2 条评论1 - 小晏子2020-03-11课后思考:因为有f个坏的节点,如果客户端收到的结果小于f,最坏的情况是这f个结果都是坏节点发回来的,所以这就导致了客户端判断错误。所以客户端收到的结果必须大于f个,最少就是f+1个,也就是说最少要有一个好的节点发出来的结果来做判断。
作者回复: 加一颗星:)
1 - 忆水寒2020-03-11PBFT 算法通过视图变更(View Change)的方式,来处理主节点作恶,当发现主节点在作恶时,会以“轮流上岗”方式,推举新的主节点。 老师能详细补充一下吗?
作者回复: 好,我后面做个加餐吧,具体说说和演示下。
1 - 阿白2022-10-19 来自上海确认放弃笔记?放弃后所记笔记将不保留。新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?批量公开的笔记不会为你同步至部落在每一轮协调中收到 Q 个相同的响应就达成共识在任意一轮中,如果 f 个作恶节点都不响应,剩下的 (n-f) 个正常节点要保证能够提供 Q 个响应,即 Q <= n - f在任意一轮中,如果 f 个作恶节点都响应,剩下的 (Q-f) 个正常节点的响应需要保证是 (n-f) 个正常节点中的大多数,即 Q - f > (n - f) / 2,等价于 2Q > n + f这样的话,如果收到 Q 个相同的响应,那一定是 f 个作恶节点的响应和大多数正常节点的响应相同,作恶节点改变不了正常节点的意志如果 Q - f <= (n - f) / 2, f 个作恶节点会配合 (n-f) 个正常节点中的少数,率先形成异于大多数正常节点的,并且相同的 Q 个响应,率先达成错误共识(n + f) / 2 < Q <= n - f,等价于 n > 3f展开
- 星宿海2022-10-14 来自安徽有三个困惑,麻烦知道的大佬解答下,感激不尽: ①“提交消息:(3f - f + 1) * (3f + 1) = 117” 这里不应该是 “(3f - f + 1) * 3f ”吗? 因为自己不会给自己发,那就是3f。 ② “恢复消息: 3f - 1 = 11” 这里为什么是 3f - 1 ③ “客户端在指定时间内未收到请求对应的f + 1相同响应” 和 课堂思考的 “当客户端在收到了f+1个结果,就认为共识达成了”,这两句话造成歧义,前者“相同响应”,后者单单一个“结果”,若要满足前者则要收到 2f + 1个才完全保证,展开
- Geek_2a0deb2021-09-27我想说的是,这个算法有个非常致命的缺陷。如果将军数为 n、叛将数为 f,那么算法需要递归协商 f+1 轮,消息复杂度为 O(n ^ (f + 1)),消息数量指数级暴增。你可以想象一下,如果叛将数为 64,消息数已经远远超过 这里不太理解为什么是f+1 和消息复杂度