首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

区块链中的共识算法-拜占庭将军问题

利用区块链打造基于互联网的去中心化账本,本质上是一个打造一个异步通信的网络集群,在网络集群中每个主机可能出现故障、网络拥堵、甚至恶意攻击等等,因此需要研究如何利用分布式系统的共识算法实现不同账本节点上账本数据的一致性和正确性。

拜占庭将军问题

拜占庭容错技术(Byzantine Fault Tolerance)是一种分布式计算领域的容错技术,该技术源自于20世纪80年代Leslie Lamport提出的假想问题:

由于拜占庭罗马帝国国土辽阔,每一支担任守卫任务的军队彼此都相隔很远,不同军队的将军们之间只能靠信使传递消息。 在发生战争的时候,拜占庭军队内所有将军都有权利根据敌情决定进攻或者撤退,因此他们通过信使交换信息,从而实现对行动计划达成一致的共识。但是在将军们中可能存在叛徒,拜占庭问题就是讨论如何让将军们在有叛徒的环境中仍然能够达成正确一致的行动计划的问题。

问题复杂度分析

假设11位拜占庭将军去打仗,他们各自根据敌情做出行动计划,然后把行动计划广播给其他将军,然后投票取多数的原则决定最终行动决策。这11位将军中有9位忠诚的将军, 5位判断进攻, 4位判断撤退, 还有2个叛徒恶意破坏状态一致性,他们跟5位判断进攻的将军说, 我们支持进攻, 那么这5位将军统计发现7位支持进攻, 4位支持撤退, 将发动进攻. 又跟4位撤退的将军说, 我们支持撤退, 撤退的将军一统计, 5票进攻, 6票撤退, 立马撤退。叛徒发送前后不一致的进攻提议,导致拜占庭问题非常复杂。

拜占庭问题解决方案

解决方案一:口头传达信息

口头传达消息的实际含义指的是:

信息接受者知道消息是谁发的

信息接受者知道消息是谁发的

沉默(不发消息)可以被检测

我们定义口头消息算法OM(m) ,对于所有的非负整数m ,每个将军通过OM(M) 算法发送命令给其它n-1个将军,可以证明OM(m) 算法在最多有m 个叛徒且总将军数为3m+1 或者更多的情况下可以解决拜占庭将军问题。

解决方案二:签名消息

签名消息相比口头消息,实际说的是在这个拜占庭将军模型中加了个隐含条件:

将军们能够使用签名技术,签名不可伪造,一旦篡改即可发现。

同时任何人都可以验证签名的可靠性。

通过签名机制,解决了消息追根溯源的问题,在任意多叛徒的情况下都可以找到解决方案。

中本聪的解决方案

区块链中通过引入『工作量证明机制』来提升做叛徒的成本,在工作量证明下,只有第一个完成证明的节点才能广播区块,大家都别忙着发起消息,都来做个题,看谁最聪明,谁就有资格第一个发起消息。通过工作量证明就增加了发送信息的成本,降低节点发送消息的速率,这样就以保证在一个时间只有一个节点或是很少的节点进行广播,同时在广播时会附上自己的签名,由于签名是不可伪造的,所以就保证了消息来源的可追溯性。

这个过程就像一位将军A在向其他的将军(B、C、D…)发起一个进攻提议一样,将军B、C、D…看到将军A签过名的进攻提议书,如果是诚实的将军就会立刻同意进攻提议,而不会发起自己新的进攻提议。这就是比特币网络中是单个区块达成共识的方法。

假设攻下一个城堡需要多次的进攻,每次进攻的提议必须基于之前最多次数的胜利进攻下提出的,这样约定之后,将军A在收到进攻提议时,就会检查一下这个提议是不是基于最多的胜利提出的,如果不是(基于最多的胜利)将军A就不会同意这样的提议,如果是的,将军A就会把这次提议记下来。这就是比特币网络最长链选择机制。

如果不同的将军先后解出了题,各自先后向这个网络发布消息,于是各个节点都会收到来自不同节点发起的进攻或者不进攻的消息,那怎么办的?只有时间最早的发起者才是有效的。中本聪巧妙的设计了一个时间戳的东西,为每个将军在解好题的时间(出块时间)盖上时间印章。

将军们那又凭什么要一起做工作量证明呢?中本聪也完全可以设置一个奖励机制,比特币的奖励机制是每打包一个块,奖励一定数量的比特币,这样将军们就会尽最大努力维护系统的稳定性。

伟大的创新往往是站在前人的肩膀上,中本聪就是各种前沿技术的整合者,古老的疑难杂症在这种整合创新下,就变得不再是问题了。工作量证明机制也造成了大量的电力浪费,只是这种浪费在巨大的革新面前还是值得的。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180415A16D8W00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券