You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
16 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 05 | 分布式共识:存异求同
你好,我是聂鹏程。今天,我来继续带你打卡分布式核心技术。
首先,我们来回忆下上篇文章的分布式选举。分布式选举问题,是从多个节点中选出一个主节点,相关的选举方法几乎都有一个共同特点:每个节点都有选举权和被选举权。大部分选举方法采用多数策略,也就是说一个节点只有得到了大部分节点的同意或认可才能成为主节点,然后主节点向其他节点宣告主权。
其实,这个选主过程就是一个分布式共识问题,因为每个节点在选出主节点之前都可以认为自己会成为主节点,也就是说集群节点“存异”;而通过选举的过程选出主节点,让所有的节点都认可该主节点,这叫“求同”。由此可见,**分布式共识的本质就是“存异求同”。**
所以,**从本质上看,分布式选举问题,其实就是传统的分布式共识方法,主要是基于多数投票策略实现的。**基于多数投票策略的分布式选举方法,如果用于分布式在线记账一致性问题中,那么记账权通常会完全掌握到主节点的手里,这使得主节点非常容易造假,且存在性能瓶颈。因此,分布式选举不适用于分布式在线记账的一致性问题。在今天这篇文章中,我就带你了解另外一种用于解决分布式在线记账一致性问题的分布式共识技术。
这里所说的分布式在线记账,是指在没有集中的发行方,也就是没有银行参与的情况下,任意一台接入互联网的电脑都能参与买卖,所有看到该交易的服务器都可以记录这笔交易,并且记录信息最终都是一致的,以保证交易的准确性。而如何保证交易的一致性,就是该场景下的分布式共识问题。
接下来,我们就一起学习下分布式共识技术吧。
## 什么是分布式共识?
假设现在有5台服务器分散在美国华盛顿、英国伦敦、法国巴黎、中国北京、中国上海分别对应着用户{A,B,C,D,E}。现在用户A给用户B转了100元。
在传统方法中我们通过银行进行转账并记录该笔交易。但分布式在线记账方法中没有银行这样的一个集中方而是由上述5台服务器来记录该笔交易。但是这5台服务器均是有各自想法的个体都可以自主操作或记录那么如何保证记录的交易是一致的呢就是分布式共识技术要解决的问题。
可以看出,**分布式共识就是在多个节点均可独自操作或记录的情况下,使得所有节点针对某个状态达成一致的过程。**通过共识机制,我们可以使得分布式系统中的多个节点的数据达成一致。
看到这里,相信你已经看出来了,我在这里说的分布式在线记账,就是近几年比较火的区块链技术解决的问题。而分布式共识技术,就是区块链技术共识机制的核心。
接下来,请和我一起看看分布式共识是如何实现的,有哪些方法吧。
## 分布式共识方法
为了不影响你理解分布式共识的核心技术,我会先和你分享区块链中的一个核心概念:挖矿。
在传统的交易方式中用户A给用户B转账需要银行来实行具体的转账操作并记录交易银行会从中收取相应的手续费。而采用分布式在线记账的话参与记录这笔交易的服务器也可以从中获得一些奖励这些奖励在区块链技术中可以换成钱。所有服务器帮助记录交易并达成一致的过程就是区块链中的“挖矿”。
区块链是一种链式数据结构,由包含交易信息的区块通过哈希指针、根据时间顺序连接而成,也是一种分布式数据库。区块是区块链的主要组成部分,每个区块由区块头和区块内容数据构成。区块头记录了时间戳,并用于保证区块链的连接性;区块内容数据中包含了多条交易信息。如果你对区块链技术的其他概念感兴趣的话,可以自行查阅更多资料。
接下来我将与你介绍3种主流的解决分布式在线记账一致性问题的共识技术PoWProof-of-Work工作量证明、PoSProof-of-Stake权益证明和DPoSDelegated Proof of Stake委托权益证明
### PoW
从分布式选举问题可以看出,同一轮选举中有且仅有一个节点成为主节点。同理,在分布式在线记账问题中,针对同一笔交易,有且仅有一个节点或服务器可以获得记账权,然后其他节点或服务器同意该节点或服务器的记账结果,达成一致。
也就是说,**分布式共识包括两个关键点,获得记账权和所有节点或服务器达成一致**。
**PoW算法**,是以每个节点或服务器的计算能力(即“算力”)来竞争记账权的机制,因此是一种**使用工作量证明机制的共识算法**。也就是说,谁的计算力强、工作能力强,谁获得记账权的可能性就越大。
那么,如何体现节点的“算力”呢?答案就是,每个节点都去解一道题,谁能先解决谁的能力就强。
假设每个节点会划分多个区块用于记录用户交易PoW算法获取记账权的原理是利用区块的index、前一个区块的哈希值、交易的时间戳、区块数据和nonce值通过SHA256哈希算法计算出一个哈希值并判断前k个值是否都为0。如果不是则递增nonce值重新按照上述方法计算如果是则本次计算的哈希值为要解决的题目的正确答案。谁最先计算出正确答案谁就获得这个区块的记账权。
**请注意**nonce值是用来找到一个满足哈希值的数字k为哈希值前导零的个数标记了计算的难度0越多计算难度越大。
达成共识的过程,就是获得记账权的节点将该区块信息广播给其他节点,其他节点判断该节点找到的区块中的所有交易都是有效且之前未存在过的,则认为该区块有效,并接受该区块,达成一致。
接下来,**我以上文提到的分散在世界各地的5台服务器为例和你说明基于PoW的共识记账过程。**
假设客户端A产生一个新的交易基于PoW的共识记账过程为
* 客户端A产生新的交易向全网进行广播要求对交易进行记账。
* 每个记账节点接收到这个请求后,将收到的交易信息放入一个区块中。
* 每个节点通过PoW算法计算本节点的区块的哈希值尝试找到一个具有足够工作量难度的工作量证明。
![](https://static001.geekbang.org/resource/image/77/05/77a1cbcd3830acf730f3a0a820710205.png)
* 若节点D找到了一个工作量证明向全网广播。当然当且仅当包含在该区块中的交易都是有效且之前未存在过的其他节点才会认同该区块的有效性。
* 其他节点接收到广播信息后,若该区块有效,接受该区块,并跟随在该区块的末尾,制造新区块延长该链条,将被接受的区块的随机哈希值视为新区块的随机哈希值。
可以看出PoW算法中谁的计算能力强获得记账权的可能性就越大。但必须保证其记账的区块是有效的并在之前未存在过才能获得其他节点的认可。
目前比特币平台采用了PoW算法属于区块链1.0阶段其重心在于货币比特币大约10min 才会产生一个区块,区块的大小也只有 1MB仅能够包含 30004000 笔交易,平均每秒只能够处理 5~7个位数笔交易。
PoW通过“挖矿”的方式发行新币把比特币分散给个人实现了相对的公平。PoW的容错机制允许全网50%的节点出错因此如果要破坏系统则需要投入极大成本若你有全球51%的算力,则可尝试攻击比特币)。
PoW机制每次达成共识需要全网共同参与运算增加了每个节点的计算量并且如果题目过难会导致计算时间长、资源消耗多而如果题目过于简单会导致大量节点同时获得记账权冲突多。这些问题都会增加达成共识的时间。
所以PoW机制的缺点也很明显共识达成的周期长、效率低资源消耗大。
### PoS
为了解决PoW算法的问题引入了PoS算法。它的核心原理是由系统权益代替算力来决定区块记账权拥有的权益越大获得记账权的概率就越大。
这里所谓的权益就是每个节点占有货币的数量和时间而货币就是节点所获得的奖励。PoS算法充分利用了分布式在线记账中的奖励鼓励“利滚利”。
在股权证明PoS模式下根据你持有货币的数量和时间给你发利息。每个币每天产生1币龄比如你持有100个币总共持有了50天那么你的币龄就为5000。这个时候如果你发现了一个PoS区块你的币龄就会被减少365。每被减少365币龄你就可以从区块中获得0.05个币的利息(可理解为年利率5%)。
在这个案例中,利息 = 5000\*5% /365 = 0.68个币。这下就有意思了,持币有利息。
**基于PoS算法获得区块记账权的方法与基于PoW的方法类似不同之处在于**节点计算获取记账权的方法不一样PoW是利用区块的index、前一个区块的哈希值、交易的时间戳、区块数据和nonce值通过SHA256哈希算法计算出一个哈希值并判断前k个值是否都为0而PoS是根据节点拥有的股权或权益进行计算的。
接下来我们看一个具体的案例。假设一个公链网络中共有3个节点A 、B和C。其中 A 节点拥有10000 个币总共持有30天而 B 和 C 节点分别有 1000 和 2000 个币分别持有15和20天。
通过PoS算法决定区块记账权的流程和PoW算法类似唯一不同的就是每个节点在计算自己记账权的时候通过计算自己的股权或权益来评估如果发现自己权益最大则将自己的区块广播给其他节点当然必须保证该区块的有效性。
![](https://static001.geekbang.org/resource/image/be/db/be44bacadba9a47b8491156e646d59db.png)
以太坊平台属于区块链2.0阶段在区块链1.0的基础上进一步强调了合约采用了PoS算法。12年发布的点点币PPC综合了PoW工作量证明及PoS权益证明方式从而在安全和节能方面实现了创新。
可以看出PoS将算力竞争转变成权益竞争。与PoW相比PoS不需要消耗大量的电力就能够保证区块链网络的安全性同时也不需要在每个区块中创建新的货币来激励记账者参与当前网络的运行这也就在一定程度上缩短了达成共识所需要的时间。所以基于PoS算法的以太坊每秒大概能处理 30 笔左右的交易。
PoS算法中持币越多或持币越久币龄就会越高持币人就越容易挖到区块并得到激励而持币少的人基本没有机会这样整个系统的安全性实际上会被持币数量较大的一部分人掌握容易出现垄断现象。
### DPoS
为了解决PoS算法的垄断问题2014年比特股BitShares的首席开发者丹尼尔 · 拉里默Dan Larimer提出了委托权益证明法也就是DPoS算法。
DPoS算法的原理类似股份制公司的董事会制度普通股民虽然拥有股权但进不了董事会他们可以投票选举代表受托人代他们做决策。DPoS是由被社区选举的可信帐户受托人比如得票数排行前101位来拥有记账权。
为了成为正式受托人用户要去社区拉票获得足够多的信任。用户根据自己持有的货币数量占总量的百分比来投票好比公司股票机制假设总的发行股票为1000现在股东A持股10那么股东A投票权为10/1000=1/100。如下图所示根据自己拥有的权益投票选出可代表自己的受托节点受托节点之间竞争记账权。
![](https://static001.geekbang.org/resource/image/dc/6d/dc2fde94ff17bc317fc755c2c7184c6d.png)
在DPos算法中通常会选出k(比如101)个受托节点,它们的权利是完全相等的。受托节点之间争取记账权也是根据算力进行竞争的。只要受托节点提供的算力不稳定,计算机宕机或者利用手中的权力作恶,随时可以被握着货币的普通节点投票踢出整个系统,而后备的受托节点可以随时顶上去。
DPoS在比特股和Steem上已运行多年整个网络中选举出的多个节点能够在 1s 之内对 99.9% 的交易进行确认。此外DPoS在EOSEnterprise Operation System为商用分布式应用设计的一款区块链操作系统中也有广泛应用被称为区块链3.0阶段。
DPoS是在PoW和PoS的基础上进行改进的相比于PoS算法DPoS引入了受托人优点主要表现在
* 由投票选举出的若干信誉度更高的受托人记账解决了所有节点均参与竞争导致消息量大、达成一致的周期长的问题。也就是说DPoS能耗更低具有更快的交易速度。
* 每隔一定周期会调整受托人,避免受托人造假和独权。
但是在DPoS中由于大多数持币人通过受托人参与投票投票的积极性并不高且一旦出现故障节点DPoS无法及时做出应对导致安全隐患。
### 三种分布式共识算法对比分析
好了现在我们已经理解了PoW、PoS和DPoS这3种分布式共识算法。接下来为了方便你理解与记忆我把这三种算法放在一起做下对比如下图所示。
![](https://static001.geekbang.org/resource/image/b2/29/b2a43f0e0239f083a2c89db7bce2f729.jpg)
## 知识扩展:一致性与共识的区别是什么?
在平常使用中,我们通常会混淆一致性和共识这两个概念,接下来我就为你分析下这两个概念吧。
**一致性**是指在分布式系统中,针对同一数据或状态以多个副本形式保存在不同节点上;当对某个数据或状态副本做出修改后,能保证多副本达到对外表现的数据一致性。
**共识**是指一个或多个进程提议某些修改后,采用一种大家认可的方法,使得系统中所有进程对该修改达成一致意见,该方法称为共识机制。
也就是说,共识重点在于达成一致的过程或方法,一致性问题在于最终对外表现的结果。
## 总结
今天我和你介绍了分布式在线记账问题中的3种常见共识算法PoW、PoS和DPoS。
PoW算法 以每个节点或服务器的计算能力即“算力”来竞争记账权的机制。类似于按劳分配谁工作量大谁拿的多。其实竞争的就是挖矿设备看谁的挖矿设备的CPU、GPU等更厉害缺点就是费电、污染环境。
PoS算法由系统权益代替算力来决定区块记账权拥有的权益越大获得记账权的概率就越大。这种方法的优点是节能不需要挖矿了但缺点是容易形成垄断。
DPoS算法是一种委托权益证明算法。持有币的人可以通过投票选举出一些节点来作为代表去记账类似于全国人民代表大会制度。
讲到这里我还希望你明确区块链中的共识技术并没那么难和神秘常用的算法就是PoW、PoS和DPoS。希望通过这篇文章你能对共识技术有一定的了解能勇敢、自信地去探索分布式共识技术和区块链技术。
最后,我再用思维导图概括一下今天的内容。
![](https://static001.geekbang.org/resource/image/be/8d/be023c879a365df13578c6979b5d498d.png)
## 思考题
你能描述出拜占庭将军问题是什么吗?你认为可以如何解决拜占庭将军的容错问题呢?
我是聂鹏程,感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再会!