比特币和区块链(11):拜占庭容错和CAP理论
Posted 区块链极客社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比特币和区块链(11):拜占庭容错和CAP理论相关的知识,希望对你有一定的参考价值。
今天我们讲述一下和比特币共识问题相关的两个分布式系统的基础理论:拜占庭容错和CAP理论。
拜占庭容错要从拜占庭将军的故事讲起。这个故事也是Lamport提出来的。我们可以看到在分布式系统一致性问题方面,不仅仅问题是Lamport提的,很多解法还是Lamport提的。这个故事是这样的。
拜占庭帝国的若干支军队攻打到了敌人的城市外面,分开驻扎。每支军队由一个拜占庭将军率领。为了制定一个统一的作战计划,将军们需要通过鸽子和其他将军传递消息。但是这些将军里面可能出现了叛徒。这些叛徒的目的是为了阻扰其他好人达成一致的作战计划。为了达到这个目的,这些叛徒什么事情都可以做,比如串通起来故意散播假消息啊,比如对将军1说进攻对将军2说撤退啊。或者干脆就失联不传递任何消息。
Lamport提出的问题,是希望找到一个协议(或者算法)来达到两个目的:
好人将军都达成了一致的决定。比如都进攻或者都撤退,而不是一部分将军决定进攻一部分将军决定撤退
忠诚的将军要保证达成的计划是合理的。换句话说,本来是更有利于进攻的情形,结果由于叛徒们的努力,最后变成了一起撤退,这是不合理的。
我们考虑一个简单的例子,假设5个将军,两个决定撤退两个决定进攻,第五个是个判读,他告诉觉得进攻的人他也进攻,但是却告诉撤退的人他也撤退。结果前两位相信进攻是3票,于是选择进攻,后两位相信撤退是3票于是撤退,这就让叛徒达成目的了。
所以拜占庭问题反映的情况是网络里面可能有不信任的节点的情况。很多网络比如谷歌数据中心里面的某个分布式系统,并不会存在这个问题,但是比特币网络是一个P2P网络,任何人都可以加入进来,显然叛徒加入进来也不稀奇。所以比特币的共识问题是一个拜占庭容错的一致性问题。
在分布式系统里面有一个著名的FLP不可能性定理。有关证明我就省略了。具体内容如下:不存在一个通用的共识算法,可以解决所有的拜占庭问题。
有关拜占庭容错问题我们讲到这里,接下来我们讲一下分布式系统里面另外一个非常著名的定理CAP定理。为了解释CAP定理,我们需要先解释三个概念:Consistency,Availability, Partition Tolerance,也就是一致性,可用性,和分区容忍性。
一致性在这里的定义是指在约定的某个有限的时间t内,系统能够达成一致。
可用性的定义是说外界如果调用了这个服务,在有限的时间t内,系统能够返回一个结果。
分区容忍性是说一个系统能够容忍网络分区的存在。所谓网络分区是指一个系统因为某种故障被分割成了两个或者多个互相之间无法联系的独立网络分区。
CAP理论说:一致性,可用性和分区容忍性三个只能选其中的两个,必须牺牲掉第三个。严格的证明我不展开了。在这里给一个浅显的解释。在分布式系统里,比如比特币系统,整个系统被分割成两个或者若干个失联的网络分区显然不可避免。那么在这种情况下,我们只需要证明一致性和可用性两者只能满足一个就可以了。
这个问题并不难回答,我们试想一下如下场景:网络被分为两个区A和B。某客户在A区写入某个值,另外一个客户在B区读另外一个值。系统要么必须等待网络连通以后再返回最新的值给客户B,要么系统返回一个不一定是最新值的值给B,前者需要的时间不能轻易被某个上限绑定,意味着只有一致性没有可用性。后者可能返回不一致的解,意味着只有可用性没有一致性。
我们通常把CAP理论里面需要满足的一致性成为强一致性,而没有满足CAP理论里面一致性的成为最终一致性。当然这个定义并不严格。重点是,在比特币这个系统里,我们怎么看待CAP理论呢?我们有两个结论:
比特币牺牲了强一致性来满足可用性,是个AP系统
比特币的共识问题是个最终一致性问题
以上是关于比特币和区块链(11):拜占庭容错和CAP理论的主要内容,如果未能解决你的问题,请参考以下文章