区块链技术的火热推动了传统分布式技术的进一步发展。从区块链技术的本质来看,基本脱离不开传统分布式系统跟密码学的核心技术。那么区块链技术真的值得去研究吗?是区块链选择了我们,还是我们选择了区块链?本文从一个分布式系统研究者的角度来理解区块链。
人们常常把区块链当作分布式数据库,或者是分布式账本,这种说法不准确,而且具有迷惑性。区块链与我们常见到的分布式数据库相比,我认为区别主要有两个:共识算法和链式结构。这两者相辅相成,共同构成了区块链的独特性。
共识算法
分布式数据库所采用的共识算法一般都是基于 Paxos 所衍生出来的一系列算法。这些算法的安全性仰赖于中心化的假设,即所有的节点由一个可信赖的中心管理。在这个假设下,所有节点都被认为是“诚实”的,也就是说,所有节点都竭尽全力去传递消息,并且消息不会被篡改。如果有少部分节点宕机,或者失联也不会影响协议的安全性。
然而区块链中的共识算法没有中心化的假设,每个节点都可以被认为是有独立行为的,这也是区块链“去中心化”的由来。协议允许一部分节点(一般少于 1/3)是拜占庭节点,它们可以按照自己的意愿选择遵从或者违背协议,发送任意消息或者假装宕机。拜占庭节点可以是被攻击者完全控制的节点,也可以是自身软件出现严重 bug 的节点。这类算法被称作拜占庭容错(Byzantine fault-tolerant)算法,简称 BFT。很明显可以看出,区块链的共识算法的容错性要远远高于传统的分布式数据库,因此往往也更低效。
针对 BFT 共识算法的研究从很早就开始了,其中影响力最大的就是图灵奖得主 Barbara 在 1999 OSDI 年提出的 PBFT (Practical BFT) [1]。然而由于算法的复杂性过高,很难进行大规模部署。除此之外,这类算法还要求每个节点的身份已知,也就是说,在协议初始或者新节点加入时,都需要有准入控制(Access Control)机制,保证节点之间可以互相验证身份。基于以上原因,针对传统的 BFT 协议的研究到了 2010 年也没有很大的进展。
比特币的出现打破了人们对这一领域的认知,它使得人人都可以轻易加入到网络中来,不需要任何准入控制机制。只要拥有至少 51% 算力的计算机是诚实的,整个网络就是安全的,并且通过比特币的奖励机制鼓励参与者规范自己的行为。比特币通过极其简单的设计就在某种程度上实现了“海纳百川,一视同仁”,不得不说是一个奇迹。然而奇迹的诞生是要付出代价的。比特币付出的代价在我看来主要有三个:
1. 极大的资源消耗。参与到网络中的矿工需要付出庞大的硬件费用和电费。
2. 极低的性能。比特币的网络每秒钟大概能处理 7 个交易,每个区块的平均生成时间是 10 分钟左右。
3. 交易的不确定性。即使一个区块在比特币网络中被确认了,由于区块链可能存在分叉fork,这个区块仍然有被重写的风险。只有等待一个区块被确认若干次(比如 6 次)之后,才能使得这个区块被重写的风险降到足够低。这也进一步提高了交易被确认的延迟。
为了减少上述代价,有不少研究者都做出了卓越努力。例如,为了提高共识算法的性能,来自 Cornell 大学的研究者在 2016 年的 NDSI 提出了 Bitcoin-NG [2]。来自 MIT 和 Stanford 的研究者在 2019 年的 CCS 提出了 Prism [3],进一步对比特币进行扩容。此外,为了减少资源消耗,来自 MIT 的研究者在 2017 年 SOSP 上提出了基于 Proof-of-Stake 的 Algorand,移除了挖矿的消耗。
链式结构
区块链带来的另一项革新就是链式的结构。每个区块都通过哈希跟前面的区块链接在一起,一直追溯到初始区块,形成一条绵延不绝的链。这个结构带来的一个好处就是当一个节点确认一个区块的时候,意味着同时确认了这个区块所在链上之前的所有区块。基于这种链式的结构,区块链中很容易采用一种“最长链”原则发布新的区块。比如在比特币中,由于网络问题和恶意攻击的存在,一个矿工可能会看到多条链,但矿工总是倾向于在最长的一条链上挖矿。即使挖矿挖到一半发现了一条比所在的链更长的链出现,也要切换到更长的链。“最长链”原则并不一定是非遵守不可,它并不会对协议安全造成严重影响,但当所有矿工都遵守这一原则的时候,每个矿工所能期望获得的收益最大。当然,也有例外,当一个矿工占有比较多的资源的时候(少于50%),可以采取一种“自私挖矿”(selfish mining)[4] 的策略,违背“最长链”原则,谋求更高的收益。
区块链的链式结构也给研究传统 BFT 的研究者带来很大启发,很多为区块链量身定做的 BFT 协议开始涌现。这其中最著名的要数 Facebook 所采用的 LibraBFT [5] 共识协议。LibraBFT 基于 HotStuff [6],由来自 VMware 的研究者提出。HotSutff 通过采用区块链的链式结构改进了传统 BFT 的性能,使得协议能够部署在具有上百个节点的网络中。下面我简单说明一下这种链式结构的神奇之处。
首先,我们想象用传统的 BFT 协议实现区块链。由于在传统的 BFT 协议中共识是一次性(one-shot)的,我们需要对每个区块单独进行共识。例如在 PBFT 中,每个区块链都要经历 Propose,Prepare,Precommit,Commit 若干阶段。每个阶段都要经历一轮投票,似乎都在做相同的事情,存在很多消息冗余。如下图所示(来源[1])。
为了解决这一问题,HotStuff 在 PBFT 的基础上引入了链式结构。由于之前所说的链式结构的特性,一个节点对一个区块的投票实际上是对这个区块所在链上之前的所有区块的投票。因此链式 HotStuff 缩减了不同的投票阶段,只保留了统一的 Propose-Vote 的形式。如下图所示(来源[6])。
HotStuff 进一步利用了链式结构的特点规定了投票规则(voting rule)以及区块被确认的规则(commit rule),从而保证协议的安全性。链式的结构使得 BFT 协议变得简洁而优美,能够很好地进行流程化(Pipelined)作业,提高了协议的性能,极大降低了状态空间。
除了上述的好处之外,链式的结构也给协议留足了设计空间,比如激励机制,信用管理,公平机制等,这些机制对一个多方参与的网络来说都会起到积极作用。
总结
在10多年前,中本聪发明比特币,区块链应运而生。现在,我们对区块链的研究逐渐拨云见日,我们也应用一种客观专业的眼光去看待这项技术。毫无疑问,区块链的诞生给分布式系统的研究带来了新的生命力。但在研究区块链的时候,不能粗暴的将共识算法和链式结构分开去研究,因为这两者相辅相成,共同构成区块链的基本要素。
注:本文由作者首发在知乎:https://zhuanlan.zhihu.com/p/197749432。
扩展阅读
[1] Practical Byzantine Fault Tolerance
[2] Bitcoin-NG: A Scalable Blockchain Protocol
[3] Prism: Deconstructing the Blockchain to Approach Physical Limits
[4] State Machine Replication in the Libra Blockchain
[5] Majority is not Enough: Bitcoin Mining is Vulnerable
[6] HotStuff: BFT Consensus in the Lens of Blockchain