01 | 拜占庭将军问题:有叛徒的情况下,如何才能达成共识?
01 | 拜占庭将军问题:有叛徒的情况下,如何才能达成共识?
讲述:于航
时长13:36大小12.46M
苏秦的困境
二忠一叛的难题
苏秦该怎么办?
解决办法一:口信消息型拜占庭问题之解
解决办法二:签名消息型拜占庭问题之解
内容小结
课堂思考
赞 37
提建议
精选留言(82)
- 汤小高置顶2020-02-12签名那个不是很懂,老师后面答疑课能不能再详细说明下
作者回复: 感谢反馈,签名消息型拜占庭问题之解,在 《加餐 | 拜占庭将军问题:如何基于签名消息实现作战计划的一致性》做了补充。
共 5 条评论21 - 洛奇置顶2020-02-13看了这个专栏还有必要去看兰伯特的论文吗?
作者回复: 实战,学习的最终目的,所以,我推荐,学习完后,多实战下,在实战中,加深自己对技术的理解,另外,遇到问题时,欢迎留言,咱们一起讨论。 有时间,可以读读自己感兴趣的论文,不过,在这里,我想补充的是,有时读论文是需要方法的,我来举个例子(如果没有学习本课程的话),兰伯特的Multi-Paxos,是出了名的难理解,那么,怎么学习呢?可以先研究Raft的论文,然后再去读Paxos的论文。
共 9 条评论20 - 蓝魔丶2020-02-11首先觉得叛变对于个人来说肯定是有利可图的,没有利益的事情也就不愿意叛变,现在热门的区块链技术的先驱比特币就是采用了拜占庭容错算法POW,对于这种开放式的网络环境必须使用拜占庭容错算法,因为彼此无法建立信任关系。如果是企业内部的分布式中间件,因为只需考虑故障容错,不存在恶意节点,因为企业也不想没事找事是吧
作者回复: 加一颗星:)
共 4 条评论31 - 沉淀的梦想2020-02-11口信消息型的算法,按照递归一直做下去,需要 m + 1 轮,那么就要有 m! 量级消息要发送,如果 m 比较大的话,这网络通信量岂不是爆炸?
作者回复: 赞!思考深入,这也是为什么会有种种的拜占庭容错算法,针对不同场景的。
共 8 条评论28 - cc2020-02-12正常的网络传输环境中,除了消息丢失和消息重复,消息出错(非恶意攻击的情况)应该也是有可能的吧?如果可能出现传输过程中的消息差错,非拜占庭式的容错是不是就不适合了?
作者回复: 底层的协议和硬件,能保证消息不出错,比如IP checksum、TCP checksum等。在不存在恶意攻击的环境,非拜占庭容错,就可以了。
共 3 条评论22 - 施耀南2020-02-12签名型可能的话可以具体点,不是很明白
作者回复: 签名消息型拜占庭问题之解,本质上而言,表达的是,通过签名机制发现恶意行为,来避免“好人”被干扰和伤害。我讲个真实的故事,很多同学都知道,我们可以通过CA证书和SSL协议,实现文中提到的签名消息的2个特性,保证通讯消息不被恶意行为干扰,但是呢,在12年时,一些网络黑客,利用IE浏览器不检测证书签名,通过SSL中间人攻击,来截获SSL消息,获取通过HTTPS传输的金融账号的用户名和密码,但,这些人却无法对使用firefox的用户,发起攻击,为什么呢,就是因为,firefox会检查证书签名,判断消息是否是伪造的,也就是说,firefox通过签名消息,找出了“恶意消息”,避免了被攻击。
共 3 条评论11 - 小晏子2020-02-14CFT:只容忍节点故障,不容热节点作恶。 BFT:容忍节点故障与作恶。 像bitcoin系统使用的必须是BFT算法,像现在在各企业微服务中使用的zookeeper等就是使用的CFT算法。
作者回复: 加一颗星:)
共 2 条评论8 - 洛奇2020-02-13解法二: 当齐和楚都是叛将时,只有燕是忠将,有以下两种情形: 1、齐先发送作战信息(和楚先发送的情形是一样的)。 2、燕先发送作战信息。 情形 1 中, 如果齐->燕 为进攻, 则必有 齐->楚 为撤退,然后因为楚也是叛将,所以有 楚->燕 为 楚齐:进攻, 然后燕接收到楚的作战信息后发现齐的签名的信息被伪造了,并从接收到的伪造信息退出齐的作战信息原本应是撤退,与从齐直接接收到的作战信息相反,所以燕判断齐和楚都是叛将,然后燕就执行了默认的作战指令撤退。燕从齐直接收到撤退的作战信息后的结果也是一样。 情形 2 下,燕为发起作战信息者,所以不受两个叛将的任何影响,所以对于燕自己来说是共识是一致的。 经过以上分析,得出解法二“任何叛变行为都会被发现,也就会实现无论有多少忠诚的将军和多少叛将,忠诚的将军们总能达成一致的作战计划”,不知道我理解的对不对?展开
作者回复: 加一颗星:)
共 6 条评论8 - 陈2020-02-11在组织内部可信网络,或者组织与组织之间已经通过其他方式建立信任关系,使用非拜占庭容错算法。在未建立信任的组织间使用拜占庭容错算法。
作者回复: 加一颗星:)
共 2 条评论6 - 约书亚2020-02-11消息签名的第两个例子有点看不懂: 例2,齐和燕国通过对比楚的消息不一致就能发现问题,签名在其中的作用呢? 同样,例1中燕能对比自身和楚发来的关于齐的计划,签名的作用呢? 感觉这两个例子中楚都扮演着恶意i节点的作用,但似乎签名主要是解决中间人的问题(间谍)?展开
作者回复: 签名保证的是消息和身份的不可伪造,并且可以通过验证签名真伪,发现恶意行为和恶意节点,也就是找出叛徒。 比如,例1中,燕对比消息,发现不一致,如果没有签名,它无法确定是齐叛变了,还是楚叛变了。 同理,在例2中,齐、燕发现消息不一致时,无法确认谁是叛徒。
共 7 条评论6 - 每天晒白牙2020-02-11值得多读几遍
作者回复: 加油!认识问题才能解决问题,实践需要理论来指导。
5 - 竹马彦四郎的好朋友影...2020-04-30韩老师,我写了一个递归模拟了 OM 算法,感觉真的好吃内存啊~ m=7区区22个节点的OM(7)算法要吃的内存已经超过1GB了~ https://yfscfs.gitee.io/post/%E6%9E%81%E5%AE%A2%E6%97%B6%E9%97%B4%E4%B9%8B%E5%88%86%E5%B8%83%E5%BC%8F%E5%8D%8F%E8%AE%AE%E4%B8%8E%E7%AE%97%E6%B3%95%E5%AE%9E%E6%88%98-01-%E6%8B%9C%E5%8D%A0%E5%BA%AD%E5%B0%86%E5%86%9B%E9%97%AE%E9%A2%98%E6%9C%89%E5%8F%9B%E5%BE%92%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%A6%82%E4%BD%95%E6%89%8D%E8%83%BD%E8%BE%BE%E6%88%90%E5%85%B1%E8%AF%86/展开
作者回复: 加一颗星:),看了下,内存用的蛮多的,优化思路很棒,节省内存的整体思路,是少分配多复用和及时释放。演示程序,我后面补充个。
共 2 条评论4 - 洛奇2020-02-13解法一中协商轮数大于2时,是具体什么情形? 轮数的公式也是记住就行?
作者回复: 算法的约定,记住就可以了,n为将军,最多能容忍 (n - 1) / 3 位叛将,需要进行 (n - 1) / 3 + 1轮协商。
4 - 忆水寒2020-02-10有一个疑问,为什么4个节点的时候第一轮是先选择一个节点(苏秦)向其他三个发送信息。然后第二轮是剩下的3个节点互相发送消息呢?为什么不能每一轮都是每个节点广播自己的选择呢?
作者回复: 这是兰伯特提出的算法:)。如果每一轮都是每个节点广播自己的选择,后面怎么实现这个算法呢?咱们一起多想想,看看怎么设计,解决拜占庭将军问题。
共 10 条评论4 - 羽翼19822020-02-18老师是否能将例子从"2忠1叛"3人的例子扩展到更大规模的例子来讲解下多轮协商的过程,这样对于理解一般性的算法会更有帮助
作者回复: 不好意思,这句话,看的不是很明白,我先按照我的理解,来回复下哈,更大规模,一般是个乘积效应,理解了最核心、最精简的这个模型,更大规模的,也就更好理解了,在这里,之所以提“2忠1叛”,而不是“1忠1叛”,或者“4忠2叛”,是为了引出,在增加一名忠将,也就是“3忠1叛”是有解的。 不知道这个回答能否解决你的疑问,或者,可否将问题,再具体点。
3 - 陈2020-02-11老师后面能否对每个提到的算法讲一下算法复杂度分析?
作者回复: 后面以加餐篇的形式,做个算法的对比:)
3 - 一步2020-02-11签名解决拜占庭问题是不是利用了非对称加密,私钥加密,公钥解密进行验证?
作者回复: 再加个数字证书,标识将军身份,实现签名无法伪造和可查看。
共 2 条评论3 - ple2020-02-10签名的那个不是很懂,只是签名不能伪造。为什么伪造作战信息也会被发现?
作者回复: 正文中提到了“实现这样几个特性”,这是实现的特性。你可以这么理解,这是为了故事讲解方便,回到现实计算机世界中,比如,我们可以通过CA证书和SSL协议实现上述特性。在这里,我分享一个小故事,一些网络黑客,通过SSL中间人攻击,来截获SSL消息,比如,在12年时,很多人利用IE浏览器不检测证书签名,来获取通过HTTPS传输的金融账号的用户名和密码,但,这些人却无法对使用firefox的用户,发起攻击,为什么呢,就是因为,firefox会检查证书签名,判断消息是否是伪造的,也就是说,firefox通过签名型消息,找出了“恶意消息”,避免了被攻击。
共 6 条评论3 - Wxpwindy2020-08-23我的一点理解哈:解法一相当于用时间换空间,通过放大(增加)所有的人的输入来稀释叛将的输入的不利影响,达到一定多数派的共识,来保证共识,所以时间复杂度指数增加,但是不保证最终目标和意图的一致性-所以例子里第二轮之后的结果是共同撤退而不是进攻。 解法二是用空间换时间,不增加(放大)输入,而是用增加验证和签名的方式剔除不受信的输入。 感觉是时间复杂度会稳定,增加空间开销,但是会结果前后一致—-是这样吗?展开
作者回复: 加一颗星:),可以这么理解。
2 - 一张钞票2020-04-22想提个问题,第一种拜占庭算法的第二轮,第三轮递归,老师能讲讲不?第三轮怎么轮?脑子一片空白
作者回复: 加一颗星:),三忠一叛,只需要递归2轮。第三轮,是二忠二叛这种情况吗?在二忠二叛下,递归3轮,没意义,因为本身就误解的。也就是3m+1位将军,递归m+1。可以试着推导下5忠2叛的情况,如果有问题,留言,咱们一起讨论。
2