【区块链中的共识问题】引子:共识问题的发展进程

共识算法是区块链的核心技术之一,全网所有的区块链节点需要通过共识算法达成一致性。所以,共识算法很大程度上决定了区块链的性能,比如吞吐量、延迟、节点可扩展性和安全性等。

一些基本概念

什么是共识问题?

在共识的帮助下,分布式系统就可以像单一节点一样工作,所以共识问题是分布式系统最基本的问题。假设一个分布式系统包含n个进程{0, 1, 2,…, n-1},每个进程都有一个初值,进程之间互相通信。共识算法就是要设计一种算法使得尽管出现故障,进程们仍协商出某个不可撤销的最终决定值,且每次执行都满足以下三个性质:

  • 终止性:所有正确的进程最终都会认同某一个值。
  • 协定性:所有正确的进程认同的值都是同一个值。
  • 完整性:如果正确的进程都提议同一个值,则所有处于认同状态的正确进程都选择该值。

通俗而言,共识算法解决的是对某个提案,大家达成一致意见的过程。在共识问题的假设中,进程可能会出现故障,这种故障主要分为进崩溃错误和拜占庭错误两种。前者指的是进程在通信中崩溃,并停止响应其它进程的请求。后者原则上指的是进程可以发生任何错误,可以向其他进程发送任何数据,这一般是恶意用户攻击操控之后的结果。

什么是拜占庭将军问题?

拜占庭问题在1982年Lamport在文献The Byzantine Generals Problem中的定义如下,一个可靠的计算机系统必须能够应对一个或多个组件的故障,故障组件可能向系统的不同部分发送冲突的消息,应对这种故障的问题就被抽象成拜占庭将军问题。拜占庭将军问题最简化的版本为两忠一叛问题,即是三个将军(包括一个指挥官),其中一个为叛徒,他们之间通过派信使传令的方式,让两个诚实的将军达成一致。此时,就要求我们设计出一种共识算法满足:1.如果指挥官是诚实的,那么所有诚实的将军必须听从指挥官的指令;2.在任何情况下,所有的诚实将军都会做出一致的决定。拜占庭将军问题的本质其实是1980年Pease等人在Reaching Agreement in the Presence of Faults提出的交互一致性问题,每个进程提议一个值,使得决定向量一致,设计算法满足:1.如果进程pi是正确的,那么所有的进程都把vi作为他们决定向量的第i个分量;2.所有正确的进程的决定向量相同(决定向量:向量中的每一个分量与一个进程的值对应)。

什么是部分异步模型?

根据对于网络模型的不同假设,拜占庭问题可以分为同步拜占庭问题、异步拜占庭问题和部分异步拜占庭问题。同步模型要求消息一定在一个确定的时间内到达,实际上1982年Lamport提出拜占庭问题的论文,就是考虑了同步模型下的拜占庭将军问题。他提出了一种基于数字签名的解决方案解决拜占庭将军问题。而在实际系统中,同步模型的假设过于理想异步模型的假设与同步模型相对,它假设消息的响应时间不确定,可能是无穷大。而由FLP不可能原理Impossibility of Distributed Consensus with One Faulty Process可知,在网络可靠,存在节点失效的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性算法。其本质是安全性和活性的矛盾。因此,现有的拜占庭容错共识大多是基于部分异步模型的假设下进行设计,即假设网络没有那么完善,允许消息延时一定时间到达。

共识问题发展的一些重要时间点

1978年,Lamport在文献Time, Clocks, and the Ordering of Events in a Distributed System中讨论了分布式系统中的时序问题,同时第一次提出了状态复制机的概念,这是共识问题的开端。
1980年,Pease等人在文献Reaching Agreement in the Presence of Faults中正式定义了交互一致性,共识问题在这篇文献中被正式提出。
1982年,Lamport等人文献The Byzantine Generals Problem用了拜占庭将军们协商共同作战计划的故事介绍了分布式系统在有恶意节点的情况下达成一致性的解决方案,并将这种共识问题定义为拜占庭将军问题。
直到1999年,Castro等人在文献Practical byzantine fault tolerance提出了实用拜占庭容错协议PBFT,这个协议的提出使得实际系统设计中满足拜占庭将军容错成为可能。
共识问题发展进程

BFT类共识算法的两条分支

BFT类共识算法一般认为可以分类成传统BFT类共识和中本聪类共识两种。前者是从分布式系统发展来的,继承了Lamport大神的衣钵,基本就是互相投票的思想,大多以1999年提出的PBFT算法为基础进行改进。后者是随着区块链的诞生崛起的,可以说是基于证明的共识或者说是概率性共识,大多也是在中本聪PoW共识上进行改进。这边写介绍两边的开山鼻祖。

传统BFT算法(以PBFT为例)

1999年提出的PBFT共识算法是基于部分异步模型假设,该算法可以在n个节点系统中,最多容忍个节点作恶的情况下,保证活性和安全性。其主要思想是通过三阶段通信过程达成使节点之间达成共识。
PBFT共识的一般过程

前两个阶段是用于同一个视图内保证请求的顺序一致,提交阶段是用于保证跨视图(主节点切换)的请求顺序一致。
PBFT的视图切换阶段流程

为了保证系统的可用性,PBFT设计了视图切换机制。后续会写一篇有关PBFT的文章进一步对这部分内容进行扩展。

中本聪类共识(以PoW为例)

有关抗拜占庭系统的研究随着PBFT协议的提出达到了一个巅峰,但是在之后的十年中并没有什么重大的进展。因为,PBFT协议中共识过程中的通信复杂度为多项式级,也就意味着随着系统参与节点的增长,通信代价会迅速达到网络不可承载的程度。而对于分布式系统的设计而言,往往只要考虑节点网络崩溃的情况,即系统满足崩溃容错。
2006年,中本聪提出了比特币,随着比特币的诞生,区块链技术中的共识问题被重点关注。比特币中设计了工作量证明PoW来达成共识,它是一种概率性共识。
比特币交易流程

当一笔交易产生后,每个要记账的节点需要在一定的时间内通过各自的算力寻找一个随机数Nonce,先找到并获得全网认可的节点会获得记账权,其处理的数据会放到区块链中,并使其他节点的账本更新。

总结

区块链技术具有去中心化的特点,从传统分布式系统到去中心化的区块链系统,本质上是减弱了对于分布式系统的安全性假设。过去的系统大多假设节点中不存在拜占庭行为,而一个区块链系统则要求在拜占庭行为存在的情况下,系统仍然安全。随着2017年区块链元年的到来,拜占庭将军容错共识问题的研究井喷。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值