深入区块链技术(三):共识算法与分布式一致性算法
# 探长三生的区块链奇遇记 🕵️♂️🚀
嗨,亲爱的区块链探险家们,我是你们的老朋友——探长三生!今天,我们将一起探讨一个看似晦涩却又扣人心弦的话题——共识机制!🚀🧠
# 🎉相亲大会与分布式系统的奇妙之旅
在我们之前的篇章“浅说区块链共识机制”中,我们已经探讨了共识机制的一些基础概念。但这个话题实在是个大宝藏,一篇文章怎么可能挖掘得完呢?
今天,我们将把焦点放在技术的脉络上,详细分析的部分会稍微少一些。如果你对共识算法的奥秘感兴趣,欢迎自行探索更多内容,或者与其他的资料进行相互补充的阅读。
# 💌从相亲大会说起:分布式系统的模型
区块链,这个我们熟悉的分布式系统,我们将从这个概念开始探讨。为了让你更轻松地理解分布式系统,我们先来构建一个模型。
记得我们在“浅说区块链共识机制”中提到的那个村庄举办相亲大会的例子吗?让我们再回顾一下。
- 大村子分成了11个小村落,散布在地图的各个角落;
- 一只信鸽可能无法完全覆盖所有村落,需要中继村落来传输消息;
- 相亲大会的举办权会为村子带来巨大收益,为了产生合理的举办者,人们约定了几条规则:
- 大会举办权从A和B两个村子中产生,他们每一届都是候选村;
- 所有村子会为了举办权都会使出浑身解数,比如延迟发送投票结果、篡改别人的投票结果、假装没有接收到通知等等。
这其实是一个典型的分布式系统,可以看作是我们简化版的区块链网络环境。那么,在这个分布式系统中,我们会遇到哪些问题呢?
# 🤔分布式系统面临的问题
分布式系统面临了几个核心问题:一致性问题、可终止性问题、合法性问题。
- 可终止性:系统必须在有限的时间内给出一致性结果;
- 合法性:提案必须是系统内的节点提出;
- 一致性:在分布式系统中,任意节点的提案能够在约定的协议下被其他所有节点所认可。
这里的“认可”表示所有节点对外呈现的信息一致,而不是对信息的内容认可。一致性也分为严格一致性和最终一致性,这些我们稍后会谈到。
我们回到上面的例子,我们提到了所有的村子只能投A或B,这个投票的动作可以理解为提案。在“投票过程被大家所认可”这个语境下,“被大家所认可”表示某个村落投票的结果已经被记录,用于最后统计结果,而不是认可投给A或者投给B。
那我们这里所说的一致性到底体现在哪里呢?
主要体现在下面两种类型的问题上:
非人为恶意的意外投票过程:例如信鸽半路挂掉、信鸽迷路、信鸽送错目的地、信鸽送信途中下雨导致信件内容模糊、接收信件的人不在家、天气变化信鸽延迟送达等等。这些对应到分布式系统面临的问题就是:消息丢包、网络拥堵、消息延迟、消息内容校验失败、节点宕机等。
人为恶意篡改投票过程:例如“精神分裂式投票”、中继篡改上一个村落的投票信息。对应到分布式系统面临的问题就是:消息被伪造、系统安全攻击等等。发生的人为恶意篡改的过程就可以称之为系统发生了拜占庭错误(Byzantine Fault)。如果系统可以容忍拜占庭错误而不至于崩溃,也就是在发生系统被恶意篡改的情况下仍然可以达成一致,我们将这样系统称作为做拜占庭容错系统。
问题1我们已经有较成熟的方案了。分布式系统本质上是一种并行异步操作,如果通过中心化的手段将系统中的“并行不确定”操作变更为“同步串行”操作就能解决上述的问题。
比如让第三方机构介入托管所有人的投票;或者构造一个不可伪造令牌,大家轮流投票,每个人投票的时候都要带上这个令牌。这样就能保证投票的过程是同步串行的,也就是说,每个人投票的时候都是在上一个人投票完成之后。
问题2我们可以通过引入拜占庭容错算法来解决。这个算法的核心思想是:在系统中引入一种“投票的投票”机制,也就是说,每个节点在投票的时候,要先看看其他节点的投票情况,然后再决定自己的投票。这样就能保证即便有人恶意篡改投票,也不会影响到最终的投票结果。
# 🚀共识机制的实现
在区块链中,我们采用了多种共识机制来解决上述问题,包括PoW、PoS、DPoS、PBFT等。这些算法在实现上各有千秋,但它们的核心目标都是一样的:在分布式系统中达成一致。
- PoW(Proof of Work):通过解决数学难题来获取记账权;
- PoS(Proof of Stake):通过持有货币的多少或者时间来获取记账权;
- DPoS(Delegated Proof of Stake):通过社区投票来选择记账节点;
- PBFT(Practical Byzantine Fault Tolerance):通过节点间的投票和验证来达成一致。
这些算法在实现上各有千秋,但它们的核心目标都是一样的:在分布式系统中达成一致。
# 🎉结语
探险家们,我们今天的探险就到这里吧!希望你们在这次的奇遇中找到了乐趣和收获。我们下次再见!🚀🕵️♂️