3.从分布式一致性到共识算法(一)

这期我构思了很久,怎么说呢,我可能要出一个系列来讲讲这个问题。

我先谈谈思路:现在很多人看比特币都是从数字货币角度,一路看着密码学者发表着digital currencies文章,诚然,中本聪大叔也是数字货币的追求者,它发明比特币也是为了创造一种完美的数字货币。但是,它可能自己也没想到,这对分布式一致性也有着深刻的影响。

今天我们就从分布式一致性算法开始,一直说到区块链中的共识算法,第四小节是精华!!!


一. 集中式系统[1]  (为了完整而加入此节)

很久很久以前,单机系统中单用户使用时当然没有一致性的问题,但是随着人类科技大爆炸,多个用户可以在一台计算机上共享数据,这就导致了一个问题,当一个用户修改了数据而另外一个还在使用旧数据进行计算过程中,这里就需要一些机制来保证这种情况不会发生。这时候就需要提出相应的解决办法:ACID[2]。 

ACID规则原来是在1970被Jim Gray定义,ACID事务解决了很多问题,但是仍然需要和性能做平衡协调,事务越强,性能可能越低,安全可靠性和高性能是一对矛盾。

ACID,是指数据库管理系统DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。

可以说ACID的提出:解决了多用户(进程)对同一数据库的访问时遇到冲突的问题。我们很容易设计出满足ACID的事物处理系统。


3.从分布式一致性到共识算法(一)_第1张图片


二. 分布式系统

从最初美国军方发明了ENIAC(中文名:埃尼阿克),由于科技的限制,20世纪60年代[3],大家都认为计算机应该走大型计算机,超算的路子,但是IBM不懈地制作着个人电脑,比如其革命性的system/360,到了80年代,已经有了计算机系统网络化和微型化的趋势。可以看到这其实也是历史的发展过程,现在孙正义收购ARM,也正是个人电脑会向着移动终端这种更轻便设备发展的趋势,扯远了。。


什么是分布式系统?

在《分布式系统概念与设计》[4]书中写的定义:

分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

这个定义我觉得有些许问题,就是也可以通过共享内存的方式来解决,共享内存便于分布式系统上层的应用,但是更加难以理解和实现(我认为),现在大多数的算法都是基于消息传递的形式

那么,随着PC性能的发展,小型主机成了市场的主流,那么如何使用小型机和普通PC来搭建分布式系统就成了一个计算机领域很重要的问题?


3.从分布式一致性到共识算法(一)_第2张图片


所以 很多大牛提出了很多思路:


1.拜占庭将军问题 [5]   

1982年拜占庭将军问题是一个共识问题: 首先由Leslie Lamport与另外两人在1982年提出,被称为The Byzantine Generals Problem或者Byzantine Failure。核心描述是军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。主要解决了分布式系统中,如果有“内奸”,我们该怎么达到一致性? 其证明如果内奸数是f,那么总数必须大于等于3f+1,才可能达成一致。


2.Paxos算法   

这个算法是莱斯利·兰伯特(LeslieLamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法。由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后1998年重新发表到ACM Transactions on Computer Systems上(The Part-TimeParliament)[6]。即便如此paxos算法还是没有得到重视,2001年Lamport 觉得同行无法接受他的幽默感,于是用容易接受的方法重新表述了一遍(Paxos MadeSimple)[7]。

问题假设的是:在分布式系统中没有内奸,也就是不能容错,但是,可能会存在参与者处理速度非常慢,宕机或者重启的问题,即消息可能会延迟、丢失或者重复。注意!!!paxos不能容错啊!!


3.从分布式一致性到共识算法(一)_第3张图片



3.Raft算法[8]   

论文中写道:

一致性算法允许一组机器像一个整体一样工作,即使其中一些机器出现故障也能够继续工作下去。正因为如此,一致性算法在构建可信赖的大规模软件系统中扮演着重要的角色。在过去的 10 年里,Paxos 算法统治着一致性算法这一领域:绝大多数的实现都是基于 Paxos 或者受其影响。同时 Paxos 也成为了教学领域里讲解一致性问题时的示例。

但是不幸的是,尽管有很多工作都在尝试降低它的复杂性,但是 Paxos 算法依然十分难以理解。并且,Paxos 自身的算法结构需要进行大幅的修改才能够应用到实际的系统中。这些都导致了工业界和学术界都对 Paxos 算法感到十分头疼。

和 Paxos 算法进行过努力之后,我们开始寻找一种新的一致性算法,可以为构建实际的系统和教学提供更好的基础。我们的做法是不寻常的,我们的首要目标是可理解性:我们是否可以在实际系统中定义一个一致性算法,并且能够比 Paxos 算法以一种更加容易的方式来学习。

Raft可理解性比paxos好,其余都是半径八两。


4.PBFT算法[9]  

Castro和Liskov[6]早先提出了Practical Byzantine Fault Tolerance(PBFT),首次将拜占庭协议的复杂度从指数级降低到多项式级别,使拜占庭协议在分布式系统中应用成为可能。这个算法可以在异步网络中不保证liveness的情况下解决拜占庭容错问题。 虽然不保证Liveness,但是这个算法进入无限循环的概率非常低,在工程中是完全可用的。它可以容忍1/3节点出错。顺便说一句,作者Loskov就是提出著名的里氏替换原则(LSP)的人,2008年图灵奖得主。



5.Ripple算法[10]

它使用unique node lists去处理拜占庭容错系统的高延时问题。它可以容忍1/5节点出错。现在有个瑞波币,没错,就是它。


6.FLP理论[11]    

分布式系统的一致性算法是一个从上世纪70年代就开始研究的经典问题。在这个问题上,有两篇经典论文。一篇是《Impossibility of Distributed Consensuswith One Faulty Process》,由Fischer, Lynch 和 Patterson在1985年发表,论文中提出了可以说是最重要的分布式系统定理:FLP不可能性。这个理论的提出,给大家解决分布式一致性问题提供了上界,在异步通信场景中,没有任何算法能保证到达一致性。raft、paxos也是会产生活锁的哦(极少情况下)。


7.CAP理论[12]    

2000年,Eric Brewer教授在PODC的研讨会上提出了一个猜想:一致性、可用性和分区容错性三者无法在分布式系统中被同时满足,并且最多只能满足其中两个!

  • C(一致性):所有的节点上的数据时刻保持同步

  • A(可用性):每个请求都能接受到一个响应,无论响应成功或失败

  • P(分区容错):系统应该能持续提供服务,即使系统内部有消息丢失(分区)

大家都需要可用性质的前提下,就是一致性和分区容错的相互转化,高一致性,必然容错率就要低。高容错,那么就不能是严格一致性。


我觉得介绍这么5篇关键的论文,在咱们这个小目标里面应该是够用了,整个体系很大,如果大家有兴趣可以看看这个:分布式系统经典100篇论文[12]。


3.从分布式一致性到共识算法(一)_第4张图片


三. 比特币中的共识机制

我们来讲讲比特币共识机制,大家一定听过POW,POS,甚至一些DPOS,POA这种。为什么文章题目是从分布式一致性到共识算法呢?因为他们其实是可以统一的关系,你可以说,比特币是改变了分布式系统这个题目,加入了经济刺激(有的机制以太坊还加入了惩罚),从而达到了高度容错的一致性解。POW现在是可证明安全的,但是其余的机制目前都无法证明,只有看在现实中能否良好运行了。

1.Pow工作量证明

就是大家熟悉的挖矿,通过与或运算,计算出一个满足规则的随机数,即获得本次记账权,发出本轮需要记录的数据,全网其它节点验证后一起存储;

优点是:确实安全,51%基本不可能(除非国家级别的攻击)。

缺点:太浪费资源了,耗电,比特币本来就是一个虚拟经济,不产生任何价值(没有劳动),共识达成的周期较长,不适合商业应用。

2.Pos权益证明

Pow的一种升级共识机制;根据每个节点所占代币的比例和时间;等比例的降低挖矿难度,从而加快找随机数的速度。

优点:在一定程度上缩短了共识达成的时间。

缺点:还是需要挖矿,本质上没有解决商业应用的痛点。

3.DPos股份授权证明机制

类似于董事会投票,持币者投出一定数量的节点,代理他们进行验证和记账。

优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。

缺点:整个共识机制还是依赖于代币,很多商业应用是不需要代币存在的。

读者们,如果还对POW,POW,DPOS这类芸芸陌生,没关系,因为这期就是一个总纲性质的,后面我会出几期来讲解每一个小机制。


四. 统一

到了我最喜欢的环节了,这节我们要介绍如何分布式一致性和共识算法统一? 业界都在说的共有链,私有链,联盟链怎么划分?

其实分布式我们可以从容错这个性能上给他划分(当然容错高,意味着一致性,可用性可能有牺牲)。


3.从分布式一致性到共识算法(一)_第5张图片


目前,区块链应用分为三类[13]:

  1. 私有链:这是指在企业内部部署的区块链应用,所有节点都是可以信任的;

  2. 联盟链:半封闭生态的交易网络,存在不对等信任的节点;

  3. 公有链:开放生态的交易网络,为联盟链和私有链等提供全球交易网络。

由于私有链是封闭生态的存储系统,因此采用Paxos类系统可以达到最优的性能;联盟链有半公开半开放特性,因此拜占庭容错是适合选择之一,例如IBM超级账本项目,使用的就是PBFT;对于公有链来说,这种共识算法的要求已经超出了普通分布式系统构建的范畴,再加上交易的特性,因此需要引入更多的安全考虑,比如POW,POS,DPOS。

这样我们根据容错性的高低,把分布式一致性算法共识算法划归到了一个轴中。

3.从分布式一致性到共识算法(一)_第6张图片


五. 后面的预告

后面我会深入每个算法,争取把这个系列做好。后面还有出隐私方面(zcash,zcoin,dashcoin等),scalability,以太坊等系列。自己心有余而力不足,欢迎喜欢写区块链小文章的同学加入我。



[1] http://www.jdon.com/artichect/acid-cap.html

[2] Haerder, T.; Reuter, A. (1983). "Principles of transaction-oriented database recovery". ACM Computing Surveys. 15 (4): 287. doi:10.1145/289.291.

[3] 从PAXOS到ZOOKEEPER分布式一致性原理与实践.倪超

[4] GeorgeCoulouris, 库鲁里斯, 多利莫雷,等. 分布式系统:概念与设计[M]. 机械工业出版社, 2013.

[5] Lamport L, Shostak R, Pease M. The Byzantine generals problem[J]. ACM Transactions on Programming Languages and Systems (TOPLAS), 1982, 4(3): 382-401.

[6] Lamport L. The part-time parliament[J]. ACM Transactions on Computer Systems (TOCS), 1998, 16(2): 133-169.

[7] Lamport L. Paxos made simple[J]. ACM Sigact News, 2001, 32(4): 18-25.

[8] Ongaro D, Ousterhout J K. In Search of an Understandable Consensus Algorithm[C]//USENIX Annual Technical Conference. 2014: 305-319.

[9] Practical Byzantine fault tolerance and proactive recovery, Castro, Miguel and Liskov, Barbara, ACM Transactions on Computer Systems (TOCS), 2002

[10] Schwartz D, Youngs N, Britto A. The Ripple protocol consensus algorithm[J]. Ripple Labs Inc White Paper, 2014, 5.

[11] Fischer M J, Lynch N A, Paterson M S. Impossibility of distributed consensus with one faulty process[J]. Journal of the ACM (JACM), 1985, 32(2): 374-382.

[12] http://www.cnblogs.com/superf0sh/p/5754283.html

[13] http://chuansong.me/n/348459051259

你可能感兴趣的:(自己公众号文章)