分布式一致性问题本质上可以从两个维度来认识:一是如何就某一个值达成一致的决策;二是如何就一系列连续的值达成一致的顺序决策。很显然,如果我们能够找到问题一的解决方案,那么问题二也就迎刃而解了。下面我们就从一个生活中的小问题来入手,看看如何去设计一个合理的算法来解决问题一。
有这样一个家庭,由6个成员组成,分别是爸爸妈妈、爷爷奶奶、姐姐和一个3岁的弟弟。这一天,大家要线上决定一下明天出游时,弟弟戴什么颜色的帽子。由于此时5位家长分处在不同的地方,因此只能通过微信来交流。我们尝试通过这样一个案例来剖析一个最简单的共识问题。
单点故障
既然目的是要做出一个一致的决策,最简单的方式就是找出一个公信度最高的人,由他负责给出一个决策,大家都同意即可。比如,我们始终选择妈妈的决策,因为平时都是妈妈负责弟弟的着装。可是如果每次决策都需要等待妈妈的提案的话,难免有时候妈妈的手机会不在线,比如在坐飞机的时候手机开了飞行模式。因此,始终选择一个人来做决定是不行的。这种因为一个参与方就导致整个集群出现阻塞的情况就是典型的单点故障问题。
少数服从多数
既然由一个人来做决策不可靠,最容易想到的一个解决方案就是:少数服从多数。即每次决策都至少得到半数以上人的同意才可以通过。当然,这里我们不考虑有人乱投票,即向不同人发送不一样的投票。以当前的场景为例,5个人当中需要至少3个人接受同一个提案才能表明该提案值被选定。并且我们需要保证一旦某个提案值被选定了,就不可能在后续出现另外一个提案值也被选定。
国务院:推进科普与区块链技术深度融合:为贯彻落实党中央、国务院关于科普和科学素质建设的重要部署,依据《中华人民共和国科学技术进步法》、《中华人民共和国科学技术普及法》制定《全民科学素质行动规划纲要(2021-2035年)》,其中要求实施智慧科普建设工程。推进科普与区块链等技术深度融合,强化需求感知、用户分层、情景应用理念,推动传播方式、组织动员、运营服务等创新升级,加强“科普中国”建设,强化科普信息落地应用,与智慧教育、智慧城市、智慧社区等深度融合。(新华社)[2021/7/10 0:40:52]
注:这里的选定是全局视角的,而接受是单个人的视角的,即同一个人可能会接受多次提案,但是整个群体最终只能选定一个提案值。
▲场景1
首先依旧给出一个最简单的方案,为了能够完成最终的决策,我们规定每个人必须接受他收到的第一个提案,这样也可以调动起大家的积极心,如果想要自己的提案通过就必须快速想出一种颜色并发出提案。
但是,这种方案可能导致一种无法完成决策的困境。如上图所示,爸爸提出了红色帽子,觉得比较正能量!并及时将提案私戳给了妈妈,妈妈也欣然接受。几乎同一时间,爷爷提出了蓝色帽子,觉得比较复古!并及时将提案私戳给了奶奶,奶奶也欣然接受。而姐姐认为绿色比较时髦,然而等她将消息发送出去后,发现大家都已经有了自己的选择。最终形成了2-2-1的局面,没有哪个提案能够达到半数以上。因此,我们发现,如果想要最终完成决策,有些人可能要接受多个不同的提案。
现场 | 火币中国推出数字经济及区块链产业科普新书:金色财经现场报道,12月6日,由海南省工业和信息化厅主办,南南合作金融中心协办,海南生态软件园、火币中国承办的“海南自贸港数字经济和区块链国际合作论坛”在海口举行,这是全球首次区块链部长级论坛。
在本次论坛上,火币中国举行了“数字经济及区块链产业科普系列新书发布”仪式,希望通过教材、专业教育、培训等多种方式,帮助从业者、高校、研究机构深入了解区块链,从而建立起区块链全局性知识模型,真正推动区块链应用落地。火币中国CEO袁煜明介绍,将联合机械工业出版社面向普通高等教育推出《区块链导论》、《区块链系统设计与应用》和《区块链新商业模式分析》系列教材,这是国内最早推动的区块链教材之一;火币中国还积极参与数字经济的研究,由中信出版社出版的新书《读懂Libra》已经上市;由火币中国负责编写的区块链技术科普读物《区块链技术进阶指南》将于12月面世;首本行业内最全的区块链应用案例集《区块链产业应用100例》在本次论坛进行了首次刊印。[2019/12/6]
▲场景2
既然如此,我们再考虑如下方案,即每个人都接受他收到的所有提案。
这次,我们只考虑有两个人发起了提案,分别是爸爸的红色提案和姐姐的绿色提案。如果爸爸的提案已经获得了3票的同意达到了选定状态,随后姐姐才发起提案,根据每个人都接受所有提案的原则,绿色提案最终也能够达到选定状态。显然,这种方案违背了唯一性的原则,如果一直这样运转下去可能最终也没法选定一个提案值。
动态 | 新浪财经:官媒针对区块链的报道从科普宣传转向打假监管:据新浪财经今日消息,“1025新政”满月,一个月间,官媒对区块链的态度风向已转。据11月初的一项统计,七家党媒在新政一周内发布了65篇直接相关报道,当时文章中的关键词是数据、产业、安全、创新等,大量文章偏向于科普区块链的概念以及应用介绍,提醒警惕虚拟货币炒作的仅有3篇。近期,官媒的批评焦点则纷纷指向借区块链之名进行的虚拟货币发行和炒作行为。据统计,新华网、人民网收录转载的,以打击虚拟货币或揭露假借区块链行为主题的文章,自10月25日到11月25日午间,共28篇;其中,11月19日至11月25日的一周内就高达15篇。这些文章主要围绕三个观点展开:厘清区块链和虚拟货币的关系,说明二者概念不等;打击伪“区块链”局,或是虚拟货币局揭露;提醒民众,区块链不能成为炒作的噱头,更不是行的招牌,需警惕此类活动,理性投资。[2019/11/26]
此时,我们发现一个问题,即爸爸的红色提案既然事先已经达到了选定状态,那么我们可以让姐姐在提案之前确认下所有人的状态,如果已经有半数节点对某个提案值达成了共识,那么姐姐就可以停止发出提案,或者再发出一个包含相同提案值的提案来保证唯一性。这样是否就能够解决问题了呢?
▲场景3
动态 | 区块链技术入选科普杂志《科学美国人》2019十大突破性技术榜单:据新浪网今日新闻报道,美国科普杂志《科学美国人》公布 2019 十大突破性技术榜单。区块链技术因在保障食品安全中的作用而上榜。 入选榜单具体原因:区块链技术的发展应用将显著改善食品污染源数据追踪的困境。利用区块链云端系统,食品制造商可以依次在计算机储存各类过程的信息。[2019/9/29]
场景2中的问题依然存在,如上图所示,如果爸爸和姐姐分别事先确认了下所有人的状态都处在未投票的状态,并依次发出了各自的提案,由于爸爸是分别私戳的,因此消息有一定的延迟,而姐姐直接拉了一个群聊一次性通知给了爷爷和奶奶,因此姐姐的提案先于爸爸的提案达到选定状态,稍后等爸爸的提案通知到了妈妈和爷爷的时候,他们又该如何决策呢?
通过上面的问题,我们发现,为了防止整个决策进入到一种无法终止的状态,我们还需要通过某种方式对提案进行排序,从而拒绝一些旧的、无效的提案,并及时地向提案者反馈自己接受的提案值,避免提案者一直发起相同的提案。也就是说,如果爷爷在收到爸爸的延迟提案时,能够知道先前已经存在一个更新的提案并拒绝旧提案,同时告知爸爸已经接受了姐姐的绿色提案的话,就可以避免出现多种提案达到选定状态的困境。
例如,我们可以分别为5个人分配一系列提案号,提案号按如下规则递增:
科普时报:区块链与云计算长期发展目标不谋而合:据《科普时报》今日报道,区块链与云计算两项技术的结合,从宏观上来说,一方面,利用云计算已有的基础服务设施或根据实际需求做相应改变,实现开发应用流程加速,满足未来区块链生态系统中初创企业、学术机构、开源机构、联盟和金融等机构对区块链应用的需求。另一方面,对于云计算来说,“可信、可靠、可控制”被认为是云计算发展必须要翻越的“三座山”,而区块链技术以去中心化、匿名性,以及数据不可篡改为主要特征,与云计算长期发展目标不谋而合。[2018/5/4]
同时做如下规定:
一条提案由提案值color和提案号seqNo组成,可表示为(color,seqNo)每个人记录下自己收到的最大提案号,并拒绝提案号比它更小的提案当提案者收到一个已经被接受的提案时,必须无条件接受该提案,否则有可能陷入无限提案的循环每个提案都需要分为两阶段来完成,分别为事先询问阶段与最终确认阶段,其中询问阶段用来确定一个序号值seqNo并及时检测出是否已经存在被接受的提案值,确认阶段用来确定一个提案值color。
场景1的解决方案比较简单,即在一定时间内无法收到大多数人的同意消息之后,尝试用新的提案号再发起一次提案,直到某次提案消息能够成功传达到大多数人后,即可完成决策。
下面我们来看一下如何解决场景2与场景3。
注:下图中,以Pn表示事先询问消息,询问其他节点是否接受提案号n;以R(v,n)表示响应消息,告知提案者当前已经接受的最大提案号和提案值;以A(v,n)表示最终确认消息,告诉其他节点尝试最终确认一个提案值v,其提案号为n。
场景2解决方案
对于已经达成选定状态的提案,我们可以保证后续的提案不会覆盖原先的提案值。
此时提案决策流程如下:
爸爸使用提案号1发起询问爸爸、妈妈、爷爷都同意提案号1,并且反馈当前未接收任何提案值,提案号默认为0由于收到了大多数人的同意,爸爸发出最终确认消息给到了大多数人,提案号为1,提案值为红色,此时红色其实已经达到选定状态姐姐使用提案号5发起询问由于提案必须经过至少3人同意,而任选3人必然与此前同意爸爸提案的人群有交集,因此处在交集中的人能够及时反馈之前已经同意的提案,即1号红色提案,其余人还是反馈空投票姐姐在等到大多数人的反馈结果之后,发现此前已经有提案被其他人同意了,选择提案号最高的那个提案值,覆盖自己的提案值姐姐发出最终确认消息,提案号为5,提案值为红色最终所有人都接受了红色提案,虽然提案号可能不尽相同场景3解决方案
对于未达成选定状态的提案,如果有新的提案提出,最终选定的提案值可能有两种情况。
第一种情况是新提案者能够发现旧的提案值,最终会选定旧的提案值。
第二种情况是新提案者不能够发现旧的提案值,最终会选定新的提案值。
场景3-1解决方案
新提案者能够发现旧的提案值,最终会选定旧的提案值。
此时提案决策流程如下:
爸爸使用提案号1发起询问爸爸、妈妈、爷爷都同意提案号1,并且反馈当前未接收任何提案值,提案号默认为0由于收到了大多数人的同意,爸爸发出最终确认消息,但是因为消息延迟的原因,最终确认消息只发送到了爸爸、爷爷。妈妈延迟接受了该消息,因此红色其实并未达到选定状态姐姐使用提案号5发起询问由于提案必须经过至少3人同意,而如果此时选中的3人中恰巧有一人接受过爸爸的最终确认消息,他会立即反馈之前已经同意的提案,即1号红色提案,其余人还是反馈空投票姐姐在等到大多数人的反馈结果之后,发现此前已经有提案被其他人同意了,选择提案号最高的那个提案,覆盖自己的提案值姐姐发出最终确认消息,提案号为5,提案值为红色妈妈延迟接收到了爸爸的最终确认消息,由于没有收到提案号更大的提案,因此也接受了红色提案最终所有人都接受了红色提案,虽然提案号可能不尽相同场景3-2解决方案
新提案者不能够发现旧的提案值,最终会选定新的提案值。
此时提案决策流程如下:
爸爸使用提案号1发起询问爸爸、妈妈、爷爷都同意提案号1,并且反馈当前未接收任何提案值,提案号默认为0由于收到了大多数人的同意,爸爸发出最终确认消息,但是因为消息延迟的原因,最终确认消息只发送到了爸爸、妈妈。爷爷延迟接受了该消息,因此红色其实并未达到选定状态姐姐使用提案号5发起询问由于提案必须经过至少3人同意,而如果此时选中的3人中恰巧都没有人接受过爸爸的最终确认消息,那么姐姐会收到3个人反馈的空投票由于收到了大多数人的同意,姐姐发出最终确认消息给到了大多数人,提案号为5,提案值为绿色,此时绿色其实已经达到选定状态妈妈延迟接收到了爸爸的最终确认消息,由于之前已经接受了提案号更大的提案,因此拒接爸爸的旧提案值,并将新提案值及时反馈给爸爸爸爸在收到拒接响应消息后,会尝试从头开始重新发起提案,最终选择绿色提案最终所有人都接受了绿色提案,虽然提案号可能不尽相同总结
总结一下,为了能够让决策最终能够收敛,其实我们已经显式或者隐式地做了一些约束:
1.每个人的手机需要实时在线并且任意一条微信消息都可以在一定时延内收到,当出现网络断开的场景时,可能会导致共识无法达成
2.每个人都需要严格按照上述规则进行提案/投票,不能有胡乱提案/投票的动作
上面其实就是运用了经典分布式一致性算法Paxos的原理。然而Paxos解决的仅仅是一个最基本的共识的问题,即在非拜占庭的同步网络环境下,如何就一个决策值达成一致。如果系统进入了异步网络环境呢?如果出现了拜占庭节点呢?当我们将这一系列的问题考虑进去之后,整个问题就变得复杂的多了。
好在前人已经给我们提供了非常多的理论基础,为了应对不同的问题,已经出现了非常多优秀的共识算法。大家感兴趣的话,后面会有详细的共识算法分类介绍,为大家全面地展示不同场景下共识算法的选择与权衡。添加小助手加入技术交流群,欢迎您和我们共享观点,共论区块链的无限未来~
作者简介
端豪
趣链科技基础平台部共识算法研究小组
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。