比较各种共识算法的Finality和Liveness

不要浪费时间为纯异步网络设计共识算法。

由于 FLP Imposibility 原理, 

No completely asynchronous consensus protocol can tolerate even a single unannounced process death

因此不要浪费时间为纯异步网络设计共识算法。解决办法就是,要么加强对网络的要求,要求网络是Synchronous或者Partially Synchronous的(从异步到同步或者半同步,网络状态变好了),或者放松对finality的要求,不要求Deterministic finality,只要求Probabilistic finality 即可。两者同时进行也可以。 

表1 各种共识算法比较比较各种共识算法的Finality和Liveness

下面详细讲解一下上面表格中的内容。

Finality

Finality看起来和Safety, Consistency 很相似,又似乎有所不同,非常容易让人困惑。

简单的理解,你可以认为 Finality, Safety, Consistency是同义词,即Finality=Safety=Consistency。 

更深入理解,我认为Finality是一个综合体,Finality>Safety>Consistency 。Consistency适用于所有分布式系统的,包括可信环境例如Hadoop和不可信环境例如Bitcoin; Safety适用于拜占庭环境下;Finality 是在区块链这个场景下的术语,区块链是拜占庭场景下的一个子集(拜占庭问题除了区块链还有非区块链的解决方案)。Consistency 是CAP理论中的C,更加general, 要求没有Finality那么多。Finality包含的含义比 Consistency更多更强。Finality包含了下面所有含义:

  • 所有节点的数据应是一致的。客户端发出一个读操作到任意一个节点,得到的结果应该是一样的。这个就是CAP里所说的Consistency. 这个术语是适用于所有的分布式系统的,包括可信环境例如Hadoop和不可信环境例如Bitcoin。

  • 所有节点要确保不进入互相冲突,分裂的状态,即safety。这个术语是适用于 Byzantine fault tolerance这个领域的,在拜占庭这种开放环境里,有恶意节点会广播两个互相冲突的消息(例如双花交易),导致全网所有节点陷入分裂状态,达不成一直,这就破坏了Safety这个性质。所有拜占庭下的共识算法,都需要处理好恶意节点的问题,保证全网的safety。

  • 交易一旦进入区块,应该不可撤销,即 Immutability。在区块链场景下,要保证Safety,不仅需要处理好恶意节点发出双花交易这种问题,而且还要防止恶意节点撤销已经打包进区块的交易。因为区块链是一个单链表,是一个线性结构,恶意节点理论上可以从旧的一个区块出发,分叉处一个更长的新链,把自己已经发出去的交易全部撤销掉,把自己的钱再花一遍(是另一种形式的双花)


综上,Finality=Consistency + Safety + Immutability。 

Liveness

Liveness可以认为与CAP中的Availability等价。当网络出现partition时,比如海底光缆断裂,将全球互联网分割成两个部分,整个区块链系统是否能正常写入新的交易?喜欢Finality的共识算法,这时候会选择无限等待,新的transaction无法写入,直到海底光缆修复,两边的互联网互通;喜欢Availabilty的共识算法,这时候两边网络会独立运作,数据分家了,两边的全节点中的数据变得不一致。 

比如Tendermint就是这类,牺牲Liveness追求Deterministic Finality。假设海底光缆断裂将网络分为两边,那么每一边都有一半的validator, 于是在vote和commit阶段,每一边的所有validator, 100%全部投票赞成某个proposal block,最多只能收到50%的投票,达不到2/3,于是整个区块链网络会无限等待,直到收集到2/3投票为止。在这个等待期间,无法出下一个块,新的交易也无法写入,整个网络陷入瘫痪。

比较各种共识算法的Finality和Liveness

比特币在碰到这种网络分割的时候,两部分的比特币系统会继续向前走,依旧可以写入新的transaction, 产生新的区块,当海底光缆修复后,两边互联网连通后,再选择合并。 

在海底光缆没断之前,全球所有全节点的状态是一致的,如下图:

比较各种共识算法的Finality和Liveness

当海底光缆断裂后,全球网络被分割为两部分,两个部分都会独立出块,这时候两边已经不一致了,但是两边各自是感知不到的,以为自己依旧是一条线性的区块链,如下图:

比较各种共识算法的Finality和Liveness

左边和右边,虽然依旧每10分钟挖出一个新块,但是左边的 block07和右边的block07,block hash 是不相等的。这时候比特币网络还是available的,只是Finality破坏了。 

当海底光缆修复后,这时候,两边互相同步block,会意识到出现了分叉,如下图:

比较各种共识算法的Finality和Liveness

现在全球所有全节点的状态,变成上图,有分叉了,由于两边的高度都是8,无法决定哪个分叉是正确的,这时候,就看矿工支持哪边了,哪边的算力高,哪边先出了新块,那么哪边就胜出了,短的那条链会被抛弃,比如假设右边抢先新出了一个块,那么右边胜出,左边分叉被抛弃,所有全节点中的数据又变成一条线性区块链,达成一致了,如下图:

比较各种共识算法的Finality和Liveness

其实即使海底光缆不断,网络没有partition, 也会经常发生两个miner各自同时挖出一个新块的情况,这时候就比拼谁运气好,下一个新块继承哪一个分叉哪一个就胜出。也就说比特币理论上永远没有一个确定性的一致性状态,分叉随时会在任意高度上出现,因此比特币牺牲了一点Finality, 换取更强的Liveness。 

Network Assumption

所有分布式共识算法都对网络有一个隐含的假设前提。 
先说一下网络的分类: 

同步:消息一定会在某个的时间T内被送达,这个上限(upper bound)的值T,是已知的常量,所有节点都是知道的。如果消息在T时间内没有送达,就不对这个消息作指望了,节点认为该消息已经丢失,不会继续等它。所有节点都有条不紊的,每经过一个时间T,就往前进一步,非常整齐。 

半同步:消息一定会在某个的时间T内被送达,但这个T的值,不是固定的值,而是动态变化的,例如是根据网络状况动态计算出来的。所有节点 

异步:消息会在任意时间到达,可能很快,也可能很慢,总之没有一个明确的上限(upper bound)甚至无限期延迟,无论多晚到达,节点都要接受并处理这个消息,不能简单的因为超时就丢弃消息

比特币对网络的假设就是网络是同步的,时间上限是10分钟左右,一个Miner 挖出一个block后,向全网广播,这时候整个比特币系统,期望就是这个block 在10分钟内会被所有在线的全节点full node收到,意思就是说每隔10分钟,所有全节点都会整整齐齐地往前走一步,即往自己的区块链尾部追加一个block。即使网速很快,例如3分钟不到,这个新block已经被所有全节点收到了,比特币还是会每隔10分钟往前走一步(出一个新块)。以太坊类似,不过时间上限是15秒。

Tendermint 在propose阶段假设网络是半同步的,因为在这一步会有一个超时时间,如果超过时间还没收到一个proposal新块,那么其他validator就会认为proposer节点已经挂了,于是出一个空块,直到round-robin到下一个proposer。Tendermint在prevote和precommit都需要收集超过2/3的投票,是无限等待的,也就是在这两个阶段是假设网络是异步的。最终,Tendermint对网络的要求是半同步的。

pBFT在pre-prepare, prepare, commit三个阶段全部是异步的,既然是异步的,没有超时机制,那怎么往前进展呢?收集到了超过2/3就能继续往前进。不过所有节点在收到一个客户端的请求,都会启动一个定时器,如果在某个时间内该请求还没有执行完毕,就会触发 View Change。View Change 这个部分是半同步的。 

在这里可以体会到Tendermint相比pBFT的简化之处了。Tendermint 把超时机制挪动到了propose阶段(相当于pBFT的pre-prepare阶段),如果proposer在规定时间内,广播出了一个proposal block,那么就前进到下一步,如果超时了,也前进到下一步,不过这个是proposal block是一个空块(空块时也会完整走一遍pre-vote和pre-commit流程,不过block height不会自增1,相当于网络在空转,一直到round-robin到下一个新的proposer节点,重新广播新的proposal block)。也就是无论如何,propose阶段都会往前进入到下一步。但是 Tendermint的pre-prepare是异步的,有可能永远卡主。pBFT把超时机制挪动到了View Change 这一部分,因此pBFT就多出来一个View Change 步骤,比 Tendermint复杂了一些。Tendermint通过提交空块和round-robin更换proposer 节点, 而 pBFT则是通过 View Change 来更换primary节点。Tendermint消除了复杂的View Change这一步骤。 

除了消除View Change这一点,Tendermint还在另一个地方有所简化,Tendermint的所有信息都存储在blockchain里。而pBFT是1999年提出来的,那时候还没有blockchain这个东西,因此 pBFT的所有节点虽有有一致的数据,但数据是分散存放的。pBFT的每个节点的数据包括: 

The state of each replica includes the state of the service, a message log containing messages the replica has accepted, and an integer denoting the replica’s current view.

Blockchain就是一个分布式数据库,好比在MySQL这类DBMS数据库没出现之前,人们都是把数据写入文件然后存在硬盘上,发明出各种奇怪的文件格式和组织方式。有了MySQL后,管理数据就方便多了。同理,Tendermint 把数据全部存入blockchain, pBFT没有blockchain这样一个分布式数据库,所有节点需要自己在硬盘上管理数据,比如为了压缩消息日志,丢弃老的消息,节省硬盘空间,引入了checkpoint的概念。 

Tendermint和pBFT关系类似于Raft和Paxos的关系,Tendermint是pBFT的简化版,是针对blockchain这个场景下的简化版pBFT

下图是Tendermint的算法流程图:

比较各种共识算法的Finality和Liveness

下图是pBFT的算法流程图:

比较各种共识算法的Finality和Liveness

未完待续。。。 

参考资料

  1. 1999.Castro.  Practical Byzantine Fault Tolerance

  2. Tendermint: Byzantine Fault Tolerance in the Age of Blockchains

  3. Consensus Compare: Casper vs. Tendermint

  4. A Proof of Stake overview

  5. Compared with traditional PBFT, what advantage does Tendermint algorithm has?

  6. Synchronous, partially synchronous and asynchronous consensus algorithms

  7. GRANDPA Block Finality in Polkadot: An Introduction (Part 1)

  8. Finality in Blockchain Consensus

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p>什么是共识算法</p> <p>背景</p> <p>分布式系统集群设计中面临着一个不可回避问题,一致性问题</p> <p>对于系统中多个服务节点,给定一系列操作,如何试图使全局对局部处理结果达成某种程度一致?</p> <p>这个一致性问题大致有如下场景:</p> <p>节点之间通讯不可靠,延迟阻塞</p> <p>节点处理可能是错误,甚至节点自身随时可能宕机</p> <p>节点作恶</p> <p>举例说明,就比如有两家电影院同时售卖总量一定电影票,在这样场景下,要如何设计方式来保证两家电影院协调同步不出现超卖或者错卖问题呢?</p> <p>共识算法,就是解决对某一提案(目标,投票等各种协作工作),大家达成一致意见过程</p> <p>比如上述买票问题,就可以有如下设计:</p> <p>1.每次卖票打电话给其他电影院,确认当前票数</p> <p>2.协商售卖时间,比如一三五A卖,二四六B卖</p> <p>3.成立个第三方存票机构,它统一发票</p> <p>通过以上设计,可以看出一个很重要解决一致性算法解决思路,即:</p> <p>将可能引发不一致并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题基础思路唯一秘诀</p> <p>著名共识设计理论</p> <p>FLP 不可能性原理  共识算法理论下限</p> <p>提出该定理论文是由 Fischer, Lynch Patterson 三位作者于 1985 年发表,该论文后来获得了 Dijkstra(就是发明最短路径算法那位)奖。</p> <p>FLP 原理认为对于允许节点失效情况下,纯粹异步系统无法确保一致性在有限时间内完成。</p> <p>三人三房间投票例子</p> <p>三个人在不同房间,进行投票(投票结果是 0 或者 1)。三个人彼此可以通过电话进行沟通,但经常会有人时不时地睡着。比如某个时候,A 投票 0,B 投票 1,C 收到了两人投票,然后 C 睡着了。A B 则永远无法在有限时间内获知最终结果。如果可以重新投票,则类似情形每次在取得结果前发生</p> <p>带入到计算机领域就是说,即便在网络通信可靠情况下,一个可扩展分布式系统共识问题下限是无解。即可靠性下限是0%</p> <p>CAP  分布式系统领域重要原理</p> <p>CAP 原理最早由 Eric Brewer 在 2000 年,ACM 组织一个研讨会上提出猜想,后来 Lynch 等人进行了证明</p> <p>• C(一致性):所有节点上数据时刻保持同步,即数据一致</p> <p>• A(可用性):每个请求都能在一定时间内接受到一个响应,即低延迟</p> <p>• P(分区容错):当系统发生分区时仍然可以运行</p> <p>定理:任何分布式系统只可同时满足二点,没法三者兼顾。即数据一致,响应及时,可分区执行不可能同时满足。</p> <p>举个例子:</p> <p>一个分布式网路上,某一个节点有一组依赖数据A,当网络无延迟,无阻塞时,依赖于X操作可正常进行。但网络无延迟阻塞在现实世界中是没法100%保证,那么当网络异常时,必然会产生分布式系统分区孤岛,那当一个执行操作在A分区之外时,如果要保证P,即当系统发生分区时仍可运行,就需要在分布式系统中多个节点有X备份数据,以应对分区情况。则这时候就需要在C,A之间做出选择。</p> <p>假如选择C,即要保证数据在分布式网络中一致性,那么就需要在X每次改动时,需要将全网节点X数据同步刷新成最新状态,那么在等待数据刷新完成之前,分布式系统是不可响应X依赖操作,即A功能缺失</p> <p>假如选择A,即要突出低延迟实时响应。那么在响应时候,可能全节点X数据并没有同步到最新状态,则会导致C缺失。</p> <p>上面看上去有些绕,那么你只要记住这句话,</p> <p>CAP原理在分布式网络系统应用讨论,其实就是讨论在允许网络发生故障系统中,该选择一致性还是可靠性?</p> <p>如果系统重视一致性,那么可以基于ACID原则做系统设计</p> <p>即 Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)。</p> <p>ACID 原则描述了对分布式数据库一致性需求,同时付出了可用性代价。</p> <p>• Atomicity:每次操作是原子,要么成功,要么不执行;</p> <p>• Consistency:数据库状态是一致,无中间状态;</p> <p>• Isolation:各种操作彼此互相不影响;</p> <p>• Durability:状态改变是持久,不会失效</p> <p>相应有一个BASE原则,(Basic Availiability,Soft state,Eventually Consistency)则强调了可用性。</p> <p>经典共识算法设计</p> <p>业内,针对节点异常情况,会有两种分类</p> <p>1.故障,不响应节点,成为非拜占庭错误</p> <p>2.恶意响应节点,称为非拜占庭错误</p> <p>Paxos 最早共识算法  非拜占庭算法代表</p> <p>Paxos有三种角色:</p> <p>• proposer:提出一个提案,等待大家批准为结案。客户端担任该角色;</p> <p>• acceptor:负责对提案进行投票。往往是服务端担任该角色;</p> <p>• learner:被告知结案结果,并与之统一,不参与投票过程。即普通节点</p> <p>系统运行由proposer驱动,当合法提案在一定时间内收到1/2以上投票后达成共识。</p> <p> </p>
<h1 style="box-sizing: border-box; outline: 0px; margin: 8px 0px 16px; padding: 0px;">​什么是共识算法</h1> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">背景</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">分布式系统集群设计中面临着一个不可回避问题,一致性问题</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">对于系统中多个服务节点,给定一系列操作,如何试图使全局对局部处理结果达成某种程度一致?</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">这个一致性问题大致有如下场景:</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">节点之间通讯不可靠,延迟阻塞</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">节点处理可能是错误,甚至节点自身随时可能宕机</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">节点作恶</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">举例说明,就比如有两家电影院同时售卖总量一定电影票,在这样场景下,要如何设计方式来保证两家电影院协调同步不出现超卖或者错卖问题呢?</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><img class="has" style="max-width: 100%;" src="https://img-blog.csdnimg.cn/img_convert/e520b310b4464f0198058cb84f811d51.webp" alt="" /></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">共识算法,就是解决对某一提案(目标,投票等各种协作工作),大家达成一致意见过程</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">比如上述买票问题,就可以有如下设计:</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">1.每次卖票打电话给其他电影院,确认当前票数</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">2.协商售卖时间,比如一三五A卖,二四六B卖</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">3.成立个第三方存票机构,它统一发票</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">通过以上设计,可以看出一个很重要解决一致性算法解决思路,即:</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">将可能引发不一致并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题基础思路唯一秘诀</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"> </p> <hr /> <h1 style="box-sizing: border-box; outline: 0px; margin: 8px 0px 16px; padding: 0px;">著名共识设计理论</h1> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">FLP 不可能性原理  共识算法理论下限</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">提出该定理论文是由 Fischer, Lynch Patterson 三位作者于 1985 年发表,该论文后来获得了 Dijkstra(就是发明最短路径算法那位)奖。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">FLP</span> 原理认为对于允许节点失效情况下,纯粹异步系统无法确保一致性在有限时间内完成。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">三人三房间投票例子</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">三个人在不同房间,进行投票(投票结果是 0 或者 1)。三个人彼此可以通过电话进行沟通,但经常会有人时不时地睡着。比如某个时候,A 投票 0,B 投票 1,C 收到了两人投票,然后 C 睡着了。A B 则永远无法在有限时间内获知最终结果。如果可以重新投票,则类似情形每次在取得结果前发生</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">带入到计算机领域就是说,<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">即便在网络通信可靠情况下,一个可扩展分布式系统共识问题下限是无解。</span>即可靠性下限是0%</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">CAP  分布式系统领域重要原理</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><img class="has" style="max-width: 100%;" src="https://img-blog.csdnimg.cn/img_convert/6265e1e3bb591502afceb92f439fd394.webp" alt="" /></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">CAP 原理最早由 Eric Brewer 在 2000 年,ACM 组织一个研讨会上提出猜想,后来 Lynch 等人进行了证明</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">• C(一致性):所有节点上数据时刻保持同步,即数据一致</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">• A(可用性):每个请求都能在一定时间内接受到一个响应,即低延迟</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">• P(分区容错):当系统发生分区时仍然可以运行</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">定理:任何分布式系统只可同时满足二点,没法三者兼顾。即数据一致,响应及时,可分区执行不可能同时满足。</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">举个例子:</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">一个分布式网路上,某一个节点有一组依赖数据A,当网络无延迟,无阻塞时,依赖于X操作可正常进行。但网络无延迟阻塞在现实世界中是没法100%保证,那么当网络异常时,必然会产生分布式系统分区孤岛,那当一个执行操作在A分区之外时,如果要保证P,即当系统发生分区时仍可运行,就需要在分布式系统中多个节点有X备份数据,以应对分区情况。则这时候就需要在C,A之间做出选择。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">假如选择C,即要保证数据在分布式网络中一致性,那么就需要在X每次改动时,需要将全网节点X数据同步刷新成最新状态,那么在等待数据刷新完成之前,分布式系统是不可响应X依赖操作,即A功能缺失</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">假如选择A,即要突出低延迟实时响应。那么在响应时候,可能全节点X数据并没有同步到最新状态,则会导致C缺失。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">上面看上去有些绕,那么你只要记住这句话,</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">CAP原理在分布式网络系统应用讨论,其实就是讨论在允许网络发生故障系统中,该选择一致性还是可靠性?</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">如果系统重视一致性,那么可以基于ACID原则做系统设计</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">即 Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">ACID 原则描述了对分布式数据库一致性需求,同时付出了可用性代价。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">• Atomicity:每次操作是原子,要么成功,要么不执行;</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">• Consistency:数据库状态是一致,无中间状态;</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">• Isolation:各种操作彼此互相不影响;</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">• Durability:状态改变是持久,不会失效</span></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">相应有一个BASE原则,(Basic Availiability,Soft state,Eventually Consistency)则强调了可用性。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"> </p> <hr /> <h1 style="box-sizing: border-box; outline: 0px; margin: 8px 0px 16px; padding: 0px;">经典共识算法设计</h1> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">业内,针对节点异常情况,会有两种分类</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">1.故障,不响应节点,成为非拜占庭错误</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">2.恶意响应节点,称为非拜占庭错误</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">Paxos 最早共识算法  非拜占庭算法代表</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">Paxos有三种角色:</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">• proposer:提出一个提案,等待大家批准为结案。客户端担任该角色;</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">• acceptor:负责对提案进行投票。往往是服务端担任该角色;</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">• learner:被告知结案结果,并与之统一,不参与投票过程。即普通节点</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">系统运行由proposer驱动,当合法提案在一定时间内收到1/2以上投票后达成共识。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">因此,可得出无法达成共识条件:</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">1.proposer故障</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">2.二分之一以上acceptor故障</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">拜占庭问题与BFT(Byzantine Fault Tolerant) 算法</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><img class="has" style="max-width: 100%;" src="https://img-blog.csdnimg.cn/img_convert/71b604a588c7532cb7370f40fb52d4e5.webp" alt="" /></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">Leslie Lamport 1982 年提出用来解释一致性问题一个虚构模型。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">拜占庭是古代东罗马帝国首都,由于地域宽广,守卫边境多个将军(系统中多个节点)需要通过信使来传递消息,达成某些一致决定。但由于将军中可能存在叛徒(系统中节点出错),这些叛徒将努力向不同将军发送不同消息,试图会干扰一致性达成。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">拜占庭问题即为在此情况下,如何让忠诚将军们能达成行动一致。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">对于拜占庭问题来说,假如将军总数为 N,叛变将军数为 F,则当<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">N>=3F+1</span> 时,问题才有解,即叛变将军不超过1/3时,存在有效算法,如BFT,不论叛变者如何折腾,忠诚将军们总能达成一致结果。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">这是一个数学论证结论,有兴趣同学可以自行推导。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">PBFT  一种高效拜占庭容错共识算法</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">PBFT是Practical Byzantine Fault Tolerance缩写,意为实用拜占庭容错算法。该算法是Miguel Castro Barbara Liskov(2008年图灵奖得主)在1999年提出来,解决了原始拜占庭容错算法效率不高问题。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">他核心思想是:对于每一个收到命令将军,都要去询问其他人,他们收到命令是什么。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><img class="has" style="max-width: 100%;" src="https://img-blog.csdnimg.cn/img_convert/201b68f0f5d8eb42f8f590042e69058d.webp" alt="" /></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">如上图,假设命令由A将军分发,假如A是作恶异常,分发给B,C,D操作分别是1,2,3.意图扰乱共识。拜占庭容错算法上设计实现是,当B,C,D收到命令后,相互之间也会沟通从A收到命令是否一致,从而达到识破干扰。其容错极限值就是<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">N>=3F+1</span>。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">PBFT 在区块链上实现</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">区块链节点分为<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">记账节点</span>普通节点两个角色</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">记账节点负责向全网提供记账服务,并维护全局账本,每过一段时间从记账节点中选一个议长,进行命令分发,其他记账节点则作为议员进行验证</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">将军就是记账节点,拥有全局账本,并验证交易有效性,过互相传达验证结果,在f<=(n-1)/3前提下,可以保证能达到全局一致性</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">共识一般流程如下:</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">1.任一节点接收到发送者签名交易数据请求后,向全网广播</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">2.所有记账节点均独立监听全网交易数据,并记录在内存</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">3.议长在经过t后发送共识请求提案request</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">4.议员在收到提案后,进行相关验证,发送响应response</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">5.任意节点在限定时间内收到至少F+1个response后,共识达成,把交易记录入区块并发布给全网,如果超时,则更换视图议长</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">6.任意节点在收到完整区块后,把包含交易从内存中删除</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">开始下一个共识循环</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"><img class="has" style="max-width: 100%;" src="https://img-blog.csdnimg.cn/img_convert/fc7f4df90cc24fb6cc18301902a178ce.webp" alt="" /></p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">区块产生间隔<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">t</span>,    记账节点<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">n</span>,  可容错节点数<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">f</span>, 视图编号<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">v</span>,  区块高度<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">h</span>, 议长编号<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">p</span>,  议员编号<span style="box-sizing: border-box; outline: 0px; font-weight: bold; overflow-wrap: break-word;">i</span> </p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">p=(h-v)%n </p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;"> </p> <hr /> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">未来发展</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">POW算法建立了比特币帝国,具有划时代意义。但其能耗速度问题却是制约区块链普及两大难以解决问题。</p> <p style="margin: 0px 0px 16px; box-sizing: border-box; outline: 0px; padding: 0px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word;">目前POS算法是一大趋势,以太坊Casper,EOSDPos等都是借鉴了上述前人设计理念做基于应用场景优化改造,但万变不离其宗,我大家一样,需要不断学习思考,没准,能有发明出自己共识算法一天呢。</p> <p style="margin: 5px 0px;"> </p>
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值