从Paxos到区块链

本文希望探讨从Paxos到PBFT(Practical Byzantine Fault Tolerance),再到区块链中共识算法Pow的关系和区别,并期望摸索其中一脉相承的思维脉络。

问题

首先需要明白,我们常说的一致性协议或共识算法所针对的问题,简单的说就是要保证:

即使发生网络或节点异常,整个集群依然能够像单机一样提供一致的服务,即在每次成功操作时都可以看到其之前的所有成功操作按顺序完成。

故障模型

正式开始之前,还需要了解分布式系统中几个常见的故障模型,这也是这几个不同算法存在的本质原因。按照最理想到最现实的顺序大体有以下几种:

如下图(图来源)所示,三种错误模型的限制逐渐放宽,逐步复杂:

Fault Model

本文涉及的三种算法便是基于不同故障模型的产物:

Paxos

从上面的讨论已经知道,Paxos面临的是一个可能失败但绝不会出错的相对安全的网络环境,因此可以无条件的信任所有节点的交互结果。针对单个提案有如下阶段:

这里保证算法正确无误,为一致性保驾护航的根本是其中一个不起眼的点:大多数(Majority),这也是包括Paxos在内的所有一致性算法证明正确性的关键所在:

这里的大多数为超过半数节点

PBFT

如果将Paxos面对的故障模型放宽到Byzantine Failures,即可能存在一定量的恶意节点:

就是PBFT(Practical Byzantine Fault Tolerance)算法所面临的环境了,先通过一个图(图来源)直观的了解PBFT实现的思路:既然恶意节点可能撒谎,就通过加密签名以及节点之间的相互转发来发现,如下右图。

PBFT1

PBFT的算法过程如下图,假设最多有f个恶意节点:

PBFT2

同样PBFT也依赖大多数来保证算法正确,假设有f个节点在超时时间内没有返回,我们并不能确定他们全都是恶意节点,也有可能是被拒绝服务攻击而无法响应的正常节点;也就是说剩下的响应节点中仍然有可能包括全部f个恶意节点,为了摒除他们的影响,正确的答复就至少达到f+1个。

这里的大多数为至少有2/3节点正常响应,并在其中达到过半数

区块链共识算法

PBFT虽然已经解决了拜占庭问题,但有两个明显的缺陷:

这两个问题导致其不能更广泛的应用在常规的互联网环境中。这就需要一种新的对大多数的定义和判断。区块链中提出了一种即聪明又昂贵的思路:工作量证明(Proof-of-Work)。

先来看区块链的基本思路:

Bitcoin Timestamp Server

现在问题变成了:如何让集群中的大多数对同一个Block链达成一致。在这样一个节点可以随时加入或退出的开放的网络环境中,基于节点数量的大多数判断不再适用。工作量证明(Proof-of-Work)用计算能力来确定大多数

Pow

这里的大多数是指维持一定数量Block的主链领先的计算能力

总结

无论Paxos,PBFT还是Pow,都是要解决不同网络环境下的一致性问题,而一致性问题的重点在大多数,无论正常的处理流程还是故障恢复流程,都依赖两个不同的大多数一定有交集的特性。

虽然区块链有着明显的局限和场景缺失,前途扑朔迷离,但这里还是要感慨下。凯文凯利在《失控》中曾写到:

This is a universal law of vivisystems: higher-level complexities cannot be inferred by lower-level existences.

是说群体会表现出其组成个体无法理解的复杂性,而人类作为一个群体, 一直以来最伟大的两个群体表现,互联网和金融体系,在群体最本质的特征分布式上深度融合,无论未来如何,未来已来。

That out of three sounds he frame, not a fourth sound, but a star.

​ —-Browning

参考

Paxos made simple

Practical Byzantine Fault Tolerance

Bitcoin: A Peer-to-Peer Electronic Cash System

Raft和它的三个子问题

Why Raft never commits log entries from previous terms directly

分布式系统一致性的发展历史

Table of Contents