从分布式共识算法到区块链共识机制

发布时间 2023-05-02 19:30:58作者: YangYi215

英文原文链接:https://medium.com/datadriveninvestor/from-distributed-consensus-algorithms-to-the-blockchain-consensus-mechanism-75ee036abb65


From Distributed Consensus Algorithms to the Blockchain Consensus Mechanism

分布式共识确保分布式系统中节点之间的数据共识或就提案达成一致。任何使用分布式系统(如 HDFS、MQ、ZooKeeper、Kafka、Redis 和 Elasticsearch)的技术人员都可能非常熟悉这个主题。随着分布式网络的快速发展和日益复杂的复杂性,开发人员一直在探索可能的解决方案来解决这个在理论和实践上都存在的问题。

接下来,随着区块链技术的兴起,特别是开放网络中的公有链和许可网络中的私有链,这个共识问题再次受到关注,需要从新的角度来考虑。

在本文中,我们将研究分布式共识和相应共识算法的问题和挑战。我们还将简要分析这些共识算法的适用性和局限性,并讨论这些传统共识算法与区块链新技术的结合。之后,本文从人类的可靠性角度,重点关注公有区块链领域的共识算法和机制。本文还考虑了传统计算机科学中的分布式共识算法与区块链中的共识机制之间的关联,并展示了如何在公共区块链领域看到新的共识思想。

分布式共识的问题和挑战

要充分理解分布式共识,我们首先需要了解分布式网络的特性。分布式网络的主要特点和特点是什么?或者分布式网络可能涉及哪些问题?让我们在本文的这一部分研究其中的一些问题。

Crash Fault

首先,让我们考虑死机故障。分布式网络中的崩溃故障通常可能与以下问题之一有关:

  • 节点或副本可能随时停机,短暂停止运行,稍后恢复。
  • 网络随时可能中断。
  • 发送的消息可能会在传递过程中丢失并且无法接收。
  • 发送的消息可能会延迟并在很长一段时间后接收。
  • 消息在传递过程中可能会遇到乱序问题。
  • 网络可能会被分割。例如,由于中国集群和美国集群之间的通信不畅,整个网络可能被划分为中国集群和美国集群两个子网。

以上这些问题在分布式系统中很常见。它们本质上是分布式系统中不可靠和不稳定的物理硬件所带来的不可避免的风险。例如,网络或通信渠道并不总是稳定可靠。物理机或 CPU 上的磁盘并不总是状况良好。因此,可以肯定地说,崩溃故障是分布式系统中最基本、最常见的故障类型。

The Byzantine Fault

崩溃故障基于一个简单的假设:要么节点不工作或响应正常,要么虽然工作和响应正常,但它们不能实现不一致,也就是说,空闲对它们来说是可以的,但它们不能犯一些错误。而网络中的恶意节点可能随时更改和伪造数据,使得解决共识问题变得更加困难。这些可能会改变和伪造数据或响应信息的麻烦制造问题通常是指拜占庭故障。崩溃故障称为非拜占庭故障。

拜占庭起源于兰波特的论文。毫不夸张地说,拜占庭容错(BFT)是最复杂、最严格的容错模型。以此类推,几位将军共同策划进攻一座城堡,每位将军都可以选择进攻或撤退。但是,要成功占领城堡,所有将领必须同步行动。其次,鉴于将军们之间距离太远,无法使用直接通信,因此使用信使来传递消息。但是,消息不可靠。他们可能在很长一段时间后成功传递消息,传递消息失败甚至随消息变化。将领可能也不可靠,例如,其中一个可能是不按计划行事的叛徒。这个故事中的使者代表分布式网络中的通信通道,将军代表节点。

Fault Tolerance

分布式共识算法需要解决的最关键问题是如何实现确定性和共识,从而在整个分布式网络中返回可靠的共识结果,这可能充满风险和不确定性。自然,解决崩溃故障相对容易。用于解决此类故障的算法称为崩溃容错 (CFT) 算法或非拜占庭容错算法。拜占庭故障可能导致未经授权的更改,具有更高的复杂性并且更难以解决。解决这些问题的算法称为拜占庭容错算法

两种容错算法的界限是什么?这两种故障在什么场景下会出现?是否真的有必要考虑未经授权的更改?这些问题的答案可能取决于实际的网络环境和业务场景。

Crash Fault Tolerance

一般来说,如果一个系统在一个可靠的内部网络中,我们只需要考虑崩溃容错(CFT)的问题。例如对于分布式存储、消息队列、分布式服务等很多公司的分布式组件,我们只需要考虑CFT。其原因如下: 整个企业网络被多个防火墙封闭和保护,外部访问和攻击的可能性不大。各个节点以统一的方式部署,未经适当授权,机器和运行的软件不太可能被更改。分布式网络在这一点上是比较“纯粹”的,我们只需要特别注意通信网络和机器硬件。我们需要考虑网络延迟和不稳定性以及机器随时可能遇到的停机时间和故障。

Byzantine Fault Tolerance

然后是拜占庭容错(BFT),它与整个分布式网络在更大的环境中进行评估有关。除了物理硬件,还需要采取一些“人为”的因素。毕竟,实施不当行为的是特定的人而不是机器。假设一个分布式网络是相对开放的,例如一个特定行业的数十家公司的私有网络。或者假设一个完全开放的网络,例如,任何人都可以访问的网络。这些机器上的节点机器和软件由个别公司或个人自己部署。如果好处足够诱人,一个人可能会在其中一个节点上发起 DDoS 攻击,对软件代码和代码执行逻辑,甚至是保存在网络磁盘上的数据进行授权的、通常是恶意的更改。在这种情况下,我们面临更大的挑战。除了不可靠的通信网络和机器硬件之外,我们还需要考虑和处理系统中的“麻烦制造者”。

Impossibility Triangle

为了解决实际场景中遇到的这些问题,许多计算科学家进行了大量的理论研究。这些理论研究对于工程技术人员来说可能显得过于抽象和繁琐,其中一些研究是关于无聊的数学问题。然而,这些理论可以为如何解决这些问题提供重要的指导。此外,这些理论表明了可能的解决方案的理论局限性是什么,哪些方向可以探索,哪些方向不能奏效。站在巨人的肩膀上,我们不必把所有的精力都花在制造“永动机”上。由于你们中的大多数人对这些理论都有一定的了解,所以让我们做一个简短的回顾。

Fisher, Lynch, and Paterson (FLP) Impossibility

早在 1985 年,Fisher、Lynch 和 Paterson 就发表了分布式共识的不可能性定理。早些时候,我们还表明,容错协作计算的一个自然而重要的问题不能在完全异步的计算模型中解决。也就是说,在异步网络中,不可能实现甚至可以容忍单个节点故障的共识算法。在此基础上,该定理未考虑拜占庭式故障。还假设网络非常稳定,并且所有消息都正确且准确地传递一次。在本文中,我们展示了一个令人惊讶的结果,即没有完全异步的共识协议可以容忍甚至一个未通知的进程死亡。我们不考虑拜占庭式故障,我们假设消息系统是可靠的——它正确且准确地传递所有消息。

当然,这只是理论上的。它显示了解决这些问题的理论局限性,但并不意味着这些问题在实践中无法解决。如果我们愿意放宽限制,做出一些牺牲,我们可以在工程上找到切实可行的解决方案。

FLP 不可能定理最基本的前提是异步网络模型。异步模型和同步模型分别有什么特点?

  • 在异步模型中,从一个节点到另一个节点的消息延迟可以是有限的,但也可以是无限的。这意味着如果一个节点没有收到消息,它就无法准确判断消息是丢失了还是只是延迟了。换句话说,我们无法根据超时确定节点是否发生故障。
  • 在同步模型中,消息传递的延迟是有限且有界的。这意味着我们可以根据我们的经验或抽样来准确估计可能的最大消息延迟,以确定消息是否丢失或节点是否根据超时发生故障。

幸运的是,我们真实的网络环境更类似于同步模型。因此,我们可以根据经验或抽样来确定最大超时时间。例如,您将一本书邮寄给您的一个朋友。然而,三天后,这本书仍然没有送到你的朋友那里。此时,您的朋友可能很难确定是否延迟交付或书籍是否在交付过程中丢失。但是,如果一个月后书还没有送到你的朋友手中,你和你的朋友基本上可以得出书在送达过程中丢失的结论。这个结论是根据我们的经验和统计得出的:一件物品通常可以在一到两周内成功交付。异步模型反映了代码间通信的最坏情况和极端情况。异步模型与同步节点有一些共同点:工作在异步模型中的共识协议也工作在同步模型中。同步模型对异步模型有修改和限制,使同步模型更接近真实场景,可以解决实践中的共识问题。

此外,即使在异步网络模型中,FLP 并不表示共识不可达,只是它并不总是在有限时间内可达。在实践中,如果放宽有界时间的限制,仍然可以找到解决方案。

根据对 DLS 的研究,共识算法按网络模型可分为三大类。

  • 部分同步模型中的共识协议最多可以容忍任何故障的 1/3。在部分同步模型中,网络延迟是有界的,但我们无法提前知道边界。这种类型的容错也包含拜占庭错误。
  • 异步模型中的确定性协议不能容忍错误。如前所述,在异步模型中,网络延迟是无限的。这个结论实际上就是 FLP 不可能定理所暗示的:完全异步网络中的确定性协议甚至不能容忍单个节点中的错误。
  • 同步模型中的协议可以惊人地支持 100% 的容错,尽管当故障节点的数量超过总节点的 1/2 时它们会限制节点的行为。在同步模型中,网络延迟是有界的(小于已知常数)。

从另一个角度来看,FLP 实际上涵盖了分布式系统的三个属性:safety, liveness, 和 fault tolerance.

  • 安全性意味着系统中跨节点达到的值是一致且有效的。安全是保证系统一致性的最基本要求。安全的核心是确保它不会做坏事。
  • 活跃性是指系统中的各个节点必须(在有界时间内)达成一致,即系统必须向前发展,不能一直处于不一致状态。活力其实是更高的要求。这意味着你不能做坏事,但也不能总是什么都不做。你必须做点好事,就是让整个系统运行顺畅、正常。
  • 容错要求协议在节点故障的情况下也必须有效。

FLP 不可能性意味着,在异步网络中,任何分布式共识协议都不能同时满足这三个属性。在分布式系统中,节点故障几乎是不可避免的。因此,必须考虑容错性。 FLP 不可能性意味着任何共识协议除了容错之外只能具有活性或安全性。在实践中,我们往往可以做出一些牺牲。例如,我们可以牺牲一定的安全性,这意味着系统总是可以快速达成协议,但协议不是很可靠。我们也可以牺牲一定程度的活力,这意味着系统可以达成一个非常可靠的协议,但是这个过程需要的时间太长,或者由于无休止的争论而永远无法达成一致。幸运的是,许多实际场景显示出很强的鲁棒性,使得事件不太可能使共识协议无效。

此外,FLP 不排除像 Las Vegas 这样的随机算法。许多共识算法采用 Las Vegas 算法来避免 FLP 不可能对确定性和异步网络施加的限制。这些非确定性共识算法涉及到 Las Vegas 规则:网络中的共识总是可以达成的,但达成共识所需的时间可能是无限的。当使用这些类型的算法时,很可能在每一轮中达成共识决策。 T 秒内达成共识的概率(P)会随着 T 的增加呈指数增长,并且会越来越接近于 1。事实上,这种方法已经被许多成功的共识算法所采用,是 FLP 不可能范围内的一个逃生口。本文后面介绍的比特币共识机制也采用了这种方式。

Consistency Availability Partition tolerance (CAP) Theorem

著名的一致性可用性分区容错 (CAP) 定理从不同的角度明确指出:“在共享数据系统的三个属性(数据一致性、系统可用性和对网络分区的容错性)中,在任何给定时间只能实现两个”。 CAP 与 FLP 非常相似,但它们并不完全相同。他们关注不同的观点。即使是非常相似的概念也不具有完全相同的含义。例如:

  • FLP 专注于分布式共识问题,而 CAP 专注于分布式网络中的数据同步和复制。
  • FLP 表示 FLP 的三个属性不能在异步网络模型中实现,而 CAP 表示 CAP 的三个部分不能在所有场景下都实现。
  • FLP 中的活跃性强调共识协议的内部属性。 CAP 的可用性部分强调共识协议的外部属性。

理论上,只有两个 CAP 部分可以实现。然而,边界选择不是二元的。两者之间的整个范围都很有用,因为它混合了不同级别的可用性和一致性通常会产生更好的结果。

在实践中,我们往往需要根据实际业务场景进行一些取舍。例如:

  • 许多传统的关系型数据库(例如 MySQL)经常使用 ACID(原子性、一致性、隔离性和持久性),并通过同步事务操作来确保强一致性。可用性一般不是很好,因为节点数量很少(大多数情况下只有主节点和辅助节点)。相对简单的网络拓扑结构也降低了分区容错。
  • NoSQL存储系统(例如HBase)通常采用BASE(基本可用,软状态,最终一致),通过多节点多副本保证高可用。节点数越大,网络环境也越复杂,还要考虑分区容限。但是,BASE 只能实现弱一致性,保证最终的一致性。

当然,这些陈述并不是最终结论。由于各个系统在不断发展,今天的正确结论可能明天就不再正确。为了变得更好,系统必须不断探索合适的场景并找到最佳平衡点。

The Distributed Consensus Algorithm

为了处理分布式系统中的各种现实和复杂的问题和挑战,基于理论指导已经开发了许多解决方案。本文不描述这些算法的实现细节和具体区别。而是只做一个笼统的介绍,从更广阔的角度对整体进行比较。

The Paxos Algorithm

最著名的分布式共识算法之一是 Lamport 提出的 Paxos,尽管它的复杂性也“臭名昭著”。 Lamport 提出了这种创造性的机制,该机制具有实用性,可以通过工程实现,可以最大程度地保证分布式系统的一致性。 Paxos 广泛用于许多分布式系统,包括 Chubby 和 ZooKeeper。 Basic Paxos(单一法令,即每次只商定一个值)有两个作用:Proposer 可以处理客户端请求并主动提出提案值。 Acceptor 被动响应 Proposer 发送的信息,对提出的提案进行投票,并在决策过程中保持价值和状态。为了简化模型,可以忽略 Learner 角色。这不会影响模型中的决策。

如图所示,共识决策过程采用两阶段提交协议:

  • 在第一阶段,广播 Prepare RPC 命令,找出协议决定的最终值,并阻止未完成的旧提案。
  • 在第二阶段,广播 Accept RPC 命令,要求 Acceptor 接受一个约定好的特定值。 Multi-Paxos 由多个 Basic Paxos 实例组成,可以决定一系列值。

Paxos 在实践中的可实施性也是基于很多假设和限制。 Paxos 只能用于处理 CFT,不能用于处理拜占庭故障。因此,它是一种非拜占庭容错算法。从 FLP 的角度来看,Paxos 实现了容错性和安全性,抛弃了 liveness(安全但不是 live)。也就是说,这个算法可能永远不会结束或达成共识,尽管这种情况不太可能发生。从 CAP 的角度来看,Paxos 只保证了 C(一致性)和 P(分区容错性),但是削弱了可用性的水平。为了提高 Paxos 系统的可用性,我们可以增加 Learner 的数量。

尽管有这些缺点,Paxos 在实践中仍然是可靠、有效和经过良好测试的。本质上,Paxos 是异步系统中的(主导)分布式共识协议。 Chubby 的发明者甚至说“只有一个共识协议,那就是 Paxos”——所有其他方法都只是 Paxos 的损坏版本。 Paxos 在实践中有效的原因在于,可能影响 Paxos 系统的活跃性和可用性的条件通常不容易触发。如果这些情况确实发生,其影响也不是非常不可接受的。

The Raft Algorithm

由于 Paxos 的复杂性,Ongaro 在 2014 年提出了一种更简单的算法——Raft。 Raft 在工程中更容易理解和实现。这也是 Raft 最初的目标。在不影响功能的前提下,做了很多通俗易懂的设计细节。

Raft 算法是一种基于领导者的非对称模型。系统中的节点在任何时间点只能处于三种状态之一:领导者、追随者和候选者。在初始阶段,所有节点都是追随者。要成为领导者,节点(跟随者)必须成为候选人并发起一轮选举人票。如果节点没有收到足够的选票,该节点将再次成为追随者。但是,如果它获得多数票,则该节点将成为领导者。如果Leader遇到故障,在故障恢复后发现选举了新的Leader,则原Leader自动回到Follower状态。

Raft 还引入了 Term 概念来及时识别过期信息。术语类似于 ZooKeeper 中的 epoch 文件。任期号随着时间的推移单调增加,并且在给定的任期内最多可以选举一个领导者。如果日志的最后一个条目具有不同的 terms,则具有较晚 term 的日志是最新的。

Raft还引入了心跳包和超时。为了维护其权威,当选的领导者必须持续向集群中的其他节点发送心跳数据包。如果追随者在给定的选举超时期间没有收到心跳数据包,则认为领导者已崩溃,追随者将其状态更改为候选人,并开始领导者选举。

Raft中的leader选举是通过心跳和随机超时来实现的。日志复制是通过强大的领导力实现的:领导者接收客户端命令,将其附加到其日志中,并将日志复制给其他追随者。 Raft 通过只允许领导者决定是否提交日志来确保安全。

选举和复制在此不再详述。有关 Raft 中的选举和复制的更多信息。需要注意的是,leader选举和leader编排的正常操作都比较简单。在 Raft 中,leader 的变更过程实际上要复杂一些。

然而,虽然 Raft 的原理/机制与 Paxos 并不完全相同,但它们解决的问题和采取的权衡策略可以认为是相似的。也就是说,Raft 只能解决崩溃故障,强调容错性、安全性和一致性,削弱了活性和可用性的水平。

Practical Byzantine Fault Tolerance (PBFT)

尽管自 1982 年 Lamport 提出拜占庭将军问题以来,已经对 BFT 解决方案进行了许多讨论,但这些问题的许多解决方案都是低效、缓慢和复杂的。这种情况在 1999 年得到改善,当时 Castro 和 Liskov 提出了实用拜占庭容错 (PBFT) 算法。 PBFT 是同类算法中第一个复杂度从指数级降低到多项式级的算法。 PBFT 在实践中为节点恶意行为提供了数千 TPS 和可行的解决方案。事实证明,如果系统中恶意节点的数量不超过总节点的 1/3,PBFT 算法将正常工作。

PBFT 系统中的所有节点都是按顺序排列的,其中一个节点是领导节点,其他节点被视为备份节点。系统中的所有节点相互通信,并根据多数原则达成共识。每个 PBFT 共识轮次称为一个视图。领导节点在每个视图期间都会更改,并且如果经过一定时间而领导节点没有广播请求,则可以用称为视图更改的协议替换。这种副本超时机制确保可以检测到崩溃或恶意的领导者,并通过重新选举新领导者来启动新视图。

如图所示,从客户端发起请求到接收响应,经历了五个阶段。共识过程采用三阶段协议。以下内容简要介绍了五个阶段:

  1. Launch: 客户端(client c)向集群发起服务请求m。
  2. Pre-prepare: 领导节点(副本 0)验证请求消息 m 的有效性,为视图中的请求 m 分配序列号 n,并将分配的预准备消息广播给所有备份节点(副本 1-3)。
  3. Prepare: 备份节点验证请求消息 m 的有效性并接受序列号 n。如果一个备份节点接受分配方案,它将相应的准备消息广播给其他节点。在这个阶段,所有副本都需要达到全局一致的顺序。
  4. Commit: 一旦从集群接收到分配协议消息,所有节点(主节点和辅助节点)将提交消息广播给所有其他节点。在这个阶段,所有副本都同意订单并确认收到的请求。
  5. Execute and reply: 节点收到集群的提交消息后,执行请求 m 并向客户端发送回复。客户端等待来自 f+1 个不同节点的相同回复,并认为请求已成功执行。 f 表示集群中潜在故障节点的最大数量。所有节点都直接向客户端返回消息,也是为了防止主节点在请求过程中出现问题。

PBFT 基于异步网络模型实现安全,但它依赖于消息超时来执行周期性同步。由于采用了leader-plan方案,消息同步过程非常快,也实现了顺序写入。然而,领导人连任困难重重。当时间非常接近超时窗口时,恶意领导者可能会开始发送消息,从而导致系统严重缓慢。这个缺点可以用来对网络发起攻击,使正确运行的节点看起来不正确,从而导致无休止的领导人选举。

与 Paxos 和 Raft 相比,PBFT 可以处理更多的问题:除了崩溃故障,它还可以处理可能导致麻烦和未经授权的更改的拜占庭问题。但是,从 PBFT 所采用的权衡策略来看,PBFT 还是和 Paxos 和 Raft 类似。从 FLP 的角度来看,PBFT 也强调了容错性和安全性,弱化了活性水平。从CAP的角度看,PBFT强调对网络分区故障和一致性的容忍度,弱化了可用性水平。

尽管存在这些缺点,但如果故障或恶意节点的数量不超过总节点的 1/3,PBFT 在实践中仍然有效且可行。 PBFT 并不是唯一的 BFT 算法。其他类似 BFT 的算法也在不断发展,例如 Lamport 曾提出 BFT Paxos(Paxos 的增强版)来处理拜占庭故障。最近,基于PBFT和Raft的结合提出了BFT Raft算法。但是,从问题范围和机制来看,这些算法仍然与之前的思想和框架相似。本文将不介绍这些算法。

Applicable Scenarios

从 Paxos、Raft 和 PBFT 到 Paxos 和 Raft 的各种变体以及新的类似 BFT 的算法,分布式共识算法一直在发展、改进和发展。许多大公司也开发了符合其业务场景的分布式共识算法。这些算法虽然不是很完善,但在具体的商业实践中发挥着重要作用。那么这些算法的应用场景有哪些呢?这些算法的局限性是什么?

Paxos 和 Raft 等非 BFT 算法只能处理机器硬件故障,无法处理存在恶意节点的情况。这些非 BFT 算法只能在非常可靠的网络环境中运行,例如公司的内部网络。在这种相对封闭的网络中,访问需要严格的授权,确保各个节点的身份是已知且可靠的。这有助于消除恶意节点,并允许算法有效运行。

BFT算法确实对网络环境有非常严格的要求。即使存在恶意节点,只有当恶意节点不超过总节点的 1/3 时,整个系统仍然是安全的。然而,这带来了新的问题。您如何确切知道网络中的恶意节点数量?恶意节点占总节点的比例是多少?如果访问网络需要权限,这个问题相对容易解决。例如,在一个由 10 个分支机构组成的专用网络中,只有 10 个授权公司可以访问该网络。即使有一些公司(少于3家)作恶,企图擅自更改数据,整个系统仍然是可靠和安全的。在这样一个许可的网络中,已经估计了可能进行恶意行为的节点数量。当某些节点确实有恶意时,可以快速定位其真实身份。这间接地提高了网络的安全性。

Limitations

但是,BFT 算法在无权限(开放权限,无权限控制)的开放网络中可能会出现问题。如果分布式网络是开放的,任何人都可以访问,并且网络访问成本低,那么网络中可能有多少潜在的恶意节点是未知的。即使某些节点恶意行为,确定其身份也是一个难题。典型的攻击场景是女巫攻击,攻击者可以伪造身份来控制大量节点,进而控制整个分布式网络。

另外,BFT算法最大的局限是只能协调少数节点(比如不超过100个节点)。如果节点数以千计,则系统性能非常差,甚至无法达成共识,影响系统的活跃性和可用性。您可能已经注意到,PBFT 的三阶段协议都需要多播:在预准备阶段,主节点将请求广播到所有从节点;在准备阶段,从节点向所有其他节点广播;在提交阶段,各个节点(主要和次要)向所有其他节点广播。从这个过程中,我们可以知道通信次数是节点数的平方。当一个系统有大量节点时,这种广播机制将是一场灾难。该系统几乎无法在短时间内达成共识。

从以上内容我们可以得出结论,Paxos、Raft、PBFT等传统分布式共识算法普遍适用于需要权限控制且节点数量较少的可靠分布式网络。

Application in the Private Blockchain

事实上,这些传统的共识算法在区块链时代也获得了新的活力:它们被进一步理解和使用。这些共识算法广泛应用于网络环境相对可靠的私有区块链场景。由于以下特点,私有区块链的应用具有前瞻性:

  • Access authorization: 私有区块链不是完全开放的,一般由几家或几十家企业组成。只有获得授权的公司或组织才能加入网络(通常需要在加入网络之前完成实名认证)。
  • Data protection: 私有区块链中的信息和数据不是完全开放的,只有授权方可以看到。这对于行业或企业数据安全尤其重要。例如,跨境转账的交易信息在银行业非常关键,链上税务系统中的税务信息也非常敏感。
  • Supervision: 一般可以在私有区块链中设置监督和观察节点,对敏感信息进行监控和审计,从而满足合规性要求。

在现阶段,私有区块链可以被认为是实现快速解决方案实施和解决特定行业痛点的不错选择。私有区块链在区块链行业的应用也预示着对未来区块链发展的进一步探索。因为加入私有区块链需要授权,所以提前建立了一定程度的信任,网络环境相对可靠。网络中恶意行为和攻击的概率极低,即使发生,也可以轻松快速地确定责任。因此,传统的共识算法也可以应用在这些场景中。请参阅以下示例:

  • HyperLedger Fabric v1.0 利用 Solo 和 Kafka 发布/订阅系统来执行排序; v1.4 还引入了 Raft 算法。目前采用的这些算法都是CFT算法。 Raft 主要是为后续对 BFT 算法的支持做铺垫。 (Raft 是 Fabric 开发拜占庭容错(BFT)排序服务的第一步。正如我们将看到的,一些 Raft 开发决策是受此驱动的。)
  • R3 Corda 也采用了可插拔的共识设计。它既允许实现高速且需要高可靠环境的 Raft 算法,也允许实现相对低速且需要不太可靠的网络环境的 BFT 算法。有关详细信息,请参阅此文档。https://docs.corda.net/key-concepts-notaries.html
  • 企业以太坊联盟 (EEA) 还支持 BFT 算法、Raft 和 PoET。请参阅此文档。https://entethalliance.org/wp-content/uploads/2018/05/EEA-TS-0001-0-v1.00-EEA-Enterprise-Ethereum-Specification-R1.pdf
  • 蚂蚁金服区块链 BaaS 平台也采用了 PBFT 算法。

Challenges in a Permissionless Network

如果网络完全开放、无需许可、任何人都可以随时访问,整个系统能否在有限的时间内达成共识?我们如何协调网络中的所有节点,例如,包含一万个节点而不是只有几十个节点?

在回答上述问题之前,你其实需要问自己以下几个问题:为什么网络需要完全开放和无权限?什么样的场景需要一万个节点?这个节点需求在实际场景中真的存在吗?这些问题的答案与区块链中的公有链直接相关。要回答这些问题,我们需要回顾分布式系统的目标。

Significance of Decentralization

为什么我们需要分布式系统?这个问题不难回答。一般来说,分布式系统可以增加容错能力。毕竟,分布式系统依赖于许多不同的节点,所有节点同时发生故障的概率远低于单个节点。此外,分布式系统还支持攻击容错。攻击或破坏多个节点比攻击单个节点要困难得多。

但是,前面的内容仍然仅限于物理硬件。这些优点可以降低物理机硬件发生故障的概率。但是,人为因素并未考虑在内。如果一个系统足够重要(例如,一个电子货币系统),除了机器故障之外,我们还需要更多地关注人为因素。部署节点的人会不会有恶意?我们如何防止系统中节点之间的腐败和勾结?

以太坊创始人 Vitalik Buterin 提到了去中心化的意义,如下图所示。传统的分布式系统从容错性和抗攻击性(系统中有多少物理机器,系统允许同时发生故障的机器有多少)的角度来实现架构去中心化。同样,现在我们需要考虑如何实施政治分权和反勾结。有多少人或组织最终控制系统中的节点?我们如何防止腐败和勾结?如果说传统的分布式系统注重网络和机器硬件的可靠性,那么我们现在需要考虑的就是“可靠性”:我们能否找到一种有效的技术来防止人为的恶意行为?我们如何确保重要网络中的大多数节点不被一个人或组织恶意控制?

值得一提的是,这个问题仍有很大争议。许多人从来没有想过腐败和勾结,或者认为完全没有必要考虑它们。也许他们认为对于这个技术问题他们无能为力。毕竟,这个问题远离我们生活的现实世界。我们生活在一个中心化平台获得良好声誉、提供信用背书并控制所有规则和流程的世界。例如,很少有人担心银行会故意做假账,挪用他们存放在银行的资产。毕竟,银行通常被认为是可靠的。如果银行不可靠,人们可能无法开展任何商业活动。

然而,银行是可靠的只是我们的假设。我们只有“信任”和“怀疑”两个选项,我们不得不选择前者,因为我们无法开展业务活动,如果我们不信任银行,经济发展也会停滞不前。但是,没有任何实际的方法可以证明银行是非常可靠的。

如果可靠性确实是必要的和有意义的,你能找到一个解决方案让这个世界更可靠吗?你能证明与你做生意的陌生人是可靠的,而不是不得不相信陌生人是可靠的吗?不要相信;请验证。你不需要信任那个陌生人,也不需要信任那个陌生人。你只需要验证那个陌生人。

要解决这个问题,所有人必须是平等的。每个人都可以平等自由地参与决策过程。每个人都可以自由进出“议会”。这实际上是技术民主,包括以下技术要素: 网络必须是无许可的,任何人都可以随时进入或退出网络;节点必须是对等的,并且可以直接通信;不存在中介或集中授权(完全点对点);每个节点都可能成为簿记员。

由于网络是无权限的、完全开放的、透明的和民主的,参与节点的数量可能非常多,恶意节点的概率也非常高。那么,在这种节点众多、恶意行为可能性高的无权限分布式网络环境中,我们如何通过一定的机制协调节点的行为,保证整个系统的一致性呢?如前所述,共识算法无法做到这一点。我们需要寻求新的解决方案。

此外,去中心化可能是区块链领域最具争议的话题。有人认为去中心化是区块链的价值,是公链存在的灵魂和前提,应该尽可能保证系统的去中心化程度。而也有人认为完全去中心化过于理想,不太可能实现,所以要结合实际情况考虑弱中心化或多中心化,同时兼顾效率。不管价值判断如何,单纯从技术角度来说,去中心化程度越高,系统的安全性就越高。因此,在公有区块链系统设计中,应尽可能保证系统的去中心化程度。但是,结合Vitalik Buterin对去中心化含义的解读,在追求去中心化的过程中,不能停留在看似去中心化,而应该综合考虑去中心化的各个维度,根据实际情况做出必要的取舍。

The Proof-of-Work (PoW) Mechanism

开放网络中分布式共识的创新解决方案是比特币中的工作量证明(PoW)机制。

Bitcoin

2008 年 10 月 31 日,中本聪发表了比特币白皮书《比特币:一种点对点的电子现金系统》,奇迹般地为此类问题提供了创造性的解决方案,使得在复杂的网络环境中协调数千个节点成为可能。事实上,中本聪并没有发布白皮书来解决这个技术问题。相反,中本聪的想法更大。他创造性地发明了比特币,一种完全点对点的电子现金系统,以消除传统支付需要依赖的可信第三方中间商。在系统实施过程中,恰好解决了开放网络中多个节点的一致性问题。也可以说,比特币解决的核心问题是点对点网络中电子货币的双花问题。然而,比特币的实现机制不仅仅是分布式网络技术,它还结合了密码学、经济学、博弈论等思想,以非确定性概率模式实现节点间的一致性。因此,简单地称其为算法已不能准确表达其含义。将其称为共识机制可能更合适,因为它的实现确实依赖于一套完整的政策和制度。在这里,我们不会过多阐述比特币的思想意义和实现细节,而只关注其共识机制的实现。

比特币实际上是数字签名的电子链。币的所有者可以通过签署前一笔交易的哈希值和下一个所有者的公钥来转移币,并将这些添加到币的末尾。收款人通过验证签名来验证币主形成的链。但是,问题是收款人无法验证收到的币是否没有被双花,即所有者可能将相同的币转给了两个人。因此,我们需要一个收款人的机制,以确保之前的币主在此之前没有将币转移给其他人。为确保这一点,唯一的方法是让每个人都知道所有交易。在没有受信任的第三方的情况下,要实现这一点,所有交易都必须广播给所有人。因此,我们需要一个系统,所有参与者都同意他们收到硬币的顺序,以形成唯一的序列记录历史。这实际上是分布式共识的问题。

比特币系统提供的解决方案是使用一个由所有节点组成的时间戳服务器。时间戳服务器对事务块的哈希加时间戳,并广播它。每个时间戳都包含其哈希中的前一个时间戳,形成一个链,每个额外的时间戳都会加强它之前的时间戳。为了在对等网络中实现分布式时间戳服务器,比特币使用工作证明(PoW)机制。在进行哈希运算时,PoW 需要找到某个值,使得整体哈希值的前几位全为零,并且平均工作量随着零位数的增加呈指数增长。此外,哈希没有规则。为了确保哈希的前几位为零,唯一的方法是一遍又一遍地强制随机试验和错误。一旦消耗了足够的 CPU 算力,找到了满足条件的哈希值,就无法更改区块,除非再次使用 CPU 重做。

此外,PoW 解决了大多数决策问题。在比特币中,最长的链代表大多数决策。如果大部分算力由诚实节点控制,那么诚实链将迅速增长并超越其他链。如果攻击者想要在未经适当授权的情况下更改前一个区块,则攻击者必须重做相应区块及其所有后续区块的 PoW 任务,然后赶上并超越诚实节点。这是非常困难的。数学上不难证明,随着后期节点数量的增加,较慢的攻击者追上诚实节点的概率呈指数下降。一般来说,6个区块之后几乎不可能追上。此外,PoW 任务的难度不是固定的,而是使用移动平均法动态调整的,主要考虑了硬件计算速率的提高和矿工数量的增减。计算速度快,难度增加,计算速度慢,难度降低。通过难度的动态调整,比特币的出块时间大致稳定在10分钟左右。

整个网络运行如下:

  1. 新交易被广播到所有节点。
  2. 每个节点将收到的交易打包成一个块。
  3. 每个节点通过不断改变区块的随机数来执行 PoW 任务,使区块的哈希值满足指定条件。
  4. 一旦一个节点完成 PoW 任务,它就会将该块广播给所有其他节点。
  5. 其他节点收到区块后,验证区块内交易的有效性,如果验证通过,则接受该区块。
  6. 一个节点如何表达它对区块的接受?即在添加下一个块时,将接受块的哈希值作为下一个块的前一个哈希值。

交易和挖矿的细节在此不再详述。但是,简而言之,我们可以说的是,在比特币中,最长的信息链总是占上风。如果一个节点发现一条比自己长的链,它会自动切换到最长的链去工作。

既然 PoW 的成本很高,如何鼓励大家贡献自己的算力,成为节点,保证整个比特币网络的安全?比特币提供两种激励政策:

  1. 一个节点挖出某个区块会获得一定数量的比特币,这实际上是唯一的比特币发行机制(一级市场)。所有的比特币都只能通过挖矿挖出,然后才能进入流通。
  2. 矿工处理交易信息可以获得一定的服务费,这实际上是现有比特币(二级市场)的流通。当 2100 万个比特币全部挖完,用户的动力只能是服务费。

这些激励政策也隐含地鼓励节点诚实。如果一个贪婪的攻击者拥有超过一半的 CPU 计算能力,他必须做出选择:是更改交易记录并将花费的比特币转回,还是挖新币并诚实地赚取服务费?很有可能诚实开采更有优势。毕竟他能赚到的币,比其他所有节点赚到的币总和还要多。同时,破坏比特币系统也会破坏他自己财富的有效性。如果比特币不再可靠,价值将迅速崩溃。此外,攻击者并不像人们想象的那样自由地操纵、未经授权进行更改或伪造交易记录。他所能做的就是偷回他最近花费的比特币。

Why does PoW Work?

比特币已经稳定运行了 10 年,没有任何组织或团体对其进行维护,仅依靠社区志愿者的自愿维护。在此期间未发生重大问题。这是一个奇迹,足以证明比特币背后共识机制的有效性。为什么比特币可以做到这一点?为什么比特币背后的共识机制如此有效? Bitnodes数据显示,比特币节点数量超过1万个(比特币节点类型很多,不同口径的节点数量可能不同,这里只考虑全节点)。为什么比特币可以在无许可的网络环境中协调数万个节点?

在我看来,以下原因可能适用:

  • 有效的激励政策:激励政策有效地鼓励更多节点参与比特币点对点网络。节点越多,比特币网络越安全。
  • PoW:挖出块消耗CPU算力,人为制造障碍,增加成本,从而增加攻击者的成本。
  • 博弈论:激励策略也考虑到博弈平衡,让理性节点从保持诚实中获益更多。
  • 通信效率:比特币节点之间的通信效率不低。您可能会注意到还涉及交易和区块的广播。但是,这种广播不会在两个节点之间广播,而是由某个节点(发生交易或计算 PoW 的节点)向所有其他节点广播信息。此外,交易的广播不需要到达所有节点。只要有很多节点接受广播,很快就会被打包。 2014 年,Miller 等人(Anonymous Byzantine Consensus from Moderately-Hard Puzzles: A Model for Bitcoin)严格证明消息复杂度不随网络规模增加,而是一个常数。此外,块的广播也允许消息丢失。如果一个节点没有收到一个块,它会在收到下一个块时意识到自己错过了上一个块,并主动向其他节点请求该块。
  • 概率一致性:与其他共识算法相比,比特币共识机制最特别的地方在于它不追求确定性一致性,而是追求概率一致性。当一个区块刚被挖出来时,它所包含的交易信息并没有得到所有节点的确认,它所包含的数据也不是最终一致性的结果,仍然可能被攻击者改变。但是随着后期节点数量的增加,授权变更的概率呈指数级下降,最终一致性的概率显着增加。一旦后续节点的数量超过 6 个(即大约 60 分钟后),一致性就可以认为是确定性的和最终的。

比特币共识机制不再局限于分布式算法层面,而是包含了更多的思想,比如经济学、博弈论、概率论等。因此,将其称为共识机制可能更为恰当。但是,我们仍然可以将比特币 PoW 共识机制纳入一致性框架。从 FLP 和 CAP 的角度来看:

  1. 比特币最大限度地考虑了崩溃容错和网络分区的容错性,这也是网络开放的必要要求。开放的网络环境极其复杂,随时对所有人开放,节点分布在世界各地,随时可能发生机器故障、网络分化、系统攻击,因此必须考虑容错性。使用PoW机制,比特币不仅可以实现崩溃容错,还可以结合密码学非对称加密技术实现拜占庭容错,防御未经授权的更改和攻击。
  2. 比特币尽可能地确保了活跃性和可用性。比特币的出块时间总是在 10 分钟左右,也就是说系统总能在 10 分钟内达成协议。在过去的十年中,比特币网络从未中断过。从这个角度来看,它确实做到了极致的可用性。但是,必须指出的是,比特币的可用性与我们普遍理解的互联网领域的可用性有很大的不同。对于互联网领域的系统可用性,不仅要求系统稳定运行不停机,而且对服务体验有明确的要求,比如响应时间。如果你用支付宝转账,但随时不可用,3秒不到钱到账,却被告知系统繁忙,需要等待10分钟甚至30分钟,那么服务将被视为不可用。然而,这种现象一直在比特币中发生。比特币每 10 分钟就有一个区块,区块大小只有 1 MB,不能容纳太多的交易。如果同时存在太多交易,只能等到这些交易可以打包进下一个区块。因此,它可能需要 20 分钟、30 分钟甚至更长的时间。从这个角度来看,比特币网络实际上放宽了对响应时间的要求,实现了相对基本的可用性:读可用性极高,而写可用性却很低。
  3. 比特币不再追求安全性和一致性的确定性,而是使用概率保证,基本上可以认为保证最终的安全性和一致性,但这里的“最终”仍然是时间条件和基于概率的。例如,如果我刚刚给你转了一个比特币,没有人可以说结果是确定的和最终的。但随着时间的推移,新的区块不断被挖出,“我给你转账”的交易信息也将被更多节点确认,并被更多后续区块强化。这个结果的确定性的可能性在不断增加。一旦经过足够长的时间(例如1小时),我们可以从概率的角度考虑,结果被改变的概率非常低,而系统达到最终一致性的概率非常高。在实践中,我们可以认为系统保证了最终的一致性。

整体来看,比特币 PoW 共识机制在 FLP 和 CAP 的限制下取得了很好的折衷和取舍。在实践中,它确实为开放和复杂网络中的分布式共识问题提供了可行的解决方案。比特币过去十年的稳定可靠运行也证明了这一点。

此外,比特币 PoW 在 Miller 和 LaViola 的一项研究中经过严格分析证明,具有以下特点:

  • 比特币网络可以被视为由近似无限的节点组成。每个节点贡献少量的计算能力,相应地每个节点创建块的概率很低。
  • PoW 机制依赖于同步网络模型。在该模型中,如果网络延迟为 0,则该机制可以容忍 50% 的故障。但是,从实际观察到的网络延迟来看,比特币可以容忍 49.5% 的故障。如果网络延迟等于出块时间(10 分钟),则只能容忍 33% 的故障。如果网络延迟接近无穷大,该机制的容错也接近于 0。
  • 比特币 PoW 机制具有可扩展性,因为共识时间和消息复杂度与网络规模(网络中的节点数量)无关,而只与错误节点的计算能力有关,可以认为是无量纲的持续的。

PoW 机制不仅在实践中可靠,而且在理论上也可以测试 PoW 机制使用同步模型和随机概率来规避 FLP 确定性异步模型的不可能性定理。与 PBFT 算法的复杂度 $O(n^2)$ 相比,PoW 与网络规模无关的可扩展性具有很大的优势:节点越多,系统越安全。而且,系统的效率并没有降低。

What Exactly Is PoW?

PoW 机制有什么神奇之处?事实上,你可能知道,PoW 的思想并不深刻,实际上它并不是由中本聪首先提出的。早在 1993 年,这个想法就被提出来打击垃圾邮件(Pricing via Processing 或 Combatting Junk Mail)。然而,直到中本聪创造了比特币,它才被广泛使用。 PoW 的本质在于故意制造障碍,增加参与者的成本,以尽量减少参与者的恶意企图。例如,请求者需要做一些额外的工作来检测 DDoS 攻击和垃圾邮件。再比如,登录网站需要输入验证码是很常见的,也是为了增加登录成本,防止网站被攻击。这类任务的核心特征是非对称的:对于服务请求者来说,完成任务肯定是困难的。对于服务提供商而言,验证任务必须简单快速。对于比特币PoW来说,它是非对称的:需要大量的算力才能找到一个使哈希符合条件的nonce(随机数),经过不断的试错,同时验证找到的nonce是否符合条件只需要简单的哈希运算验证。

比特币 PoW 本质上是 one-CPU-one-vote 。为什么是 CPU 而不是 IP 地址?这仍然是基于任务的难度。如果使用一IP一票,系统可以很容易地被拥有大量IP地址的人(例如IP提供商)控制。相对而言,至少在 ASIC 或 FPGA 不可用的时候,CPU 还是比较昂贵的硬件,想要拥有大量的计算能力(CPU + Electric power)并不容易。这实际上隐含地为比特币的价值提供了一个现实世界的锚点:虚拟货币系统通过算力找到了现实物理世界的价值锚点,虽然在很多人看来,这种算力的消耗是没有意义的,浪费了活力。

很多人都在思考如何降低比特币挖矿成本。这种想法当然具有积极意义。 PoW 的成本需要适当:如果难度和成本都太高,确实会浪费更多的能源,但比特币网络的安全性也得到了提高。如果难度和成本都过低,就达不到防止攻击的目的,降低比特币网络的安全性。这其实是一个取舍的问题,也是一个主观的价值判断,取决于大众对比特币的理解和定位。价值判断总是充满主观偏见。目前关于比特币的争论如此之大,是因为公众还没有达成共识,对比特币的未来还没有形成一个共同的愿景。

简而言之,比特币 PoW 是一套完整的机制,包括技术的权衡,以及经济和博弈的考虑,共同保证了比特币网络的安全性和可靠性。

Limitations of the PoW Mechanism

PoW 机制也有其局限性。事实上,我们可以从对比特币的诸多批评中知道一两件事。通常,PoW 机制被认为具有以下限制:

  1. 高成本和能源浪费:对比特币浪费能源的批评不绝于耳。根据 Digiconomist 的数据,比特币的年用电量与新西兰基本持平,也相当于澳大利亚用电量的 1/5。每笔比特币转账交易的成本是每 100,000 笔签证转账交易的三倍。虽然这种比较有时是不公平的(比特币交易是清算,而签证交易除了交易成本还有额外的清算成本),但很多人不同意。如前所述,这也是一种主观的价值判断,但毕竟是一种观点,有时也是一个真正的痛点。比如,恐怕没人愿意用比特币买一杯咖啡,因为服务费可能比咖啡还高。 “罪魁祸首”是PoW机制所需的CPU算力消耗。因此,一些人不断地尝试改进,甚至提出新的解决方案。
  2. 效率低:习惯了互联网的便利,习惯了秒级传输和百万级TPS。但是,对于比特币交易,我们可能要等上几十分钟,每秒只支持 7 笔交易。我们不是很满意。这种比较也不公平。银行系统只有少数数据中心,后台最多有数百台机器,交易只进入其中一台机器,因此在之后的清算过程中保证了最终的一致性。而比特币没有单点。它协调上万台机器,交易就是清算。但是,这种低效率确实是一个事实,并且有人在不断地尝试改进它。例如,增加每个比特币块的大小限制,以允许每个比特币块打包更多的交易。这就是比特币现金的作用。再比如,比特币的出块时间被缩短以允许更快的出块。这就是莱特币所做的。即便如此,由于 PoW 机制需要巨大的 PoW 成本来保证网络安全,提高网络效率是困难的。
  3. 中心化风险:随着 ASIC 和 FPGA 等特制挖矿芯片的出现,普通个人 PC 几乎不可能挖出比特币。挖矿越来越集中于有芯片研发能力的巨头公司,矿池的出现(为了收益平滑,大量节点组成联盟共同挖矿,平分收益)也加剧了这一趋势。另外,比特币区块大小限制的增加也会导致需要很大的存储空间来运行所有的比特币节点,使得比特币无法在普通PC上运行,而只能在特殊的大型计算机上运行。这些中心化趋势无疑损害了比特币网络的安全性。毕竟,由全球普通PC组成的比特币网络的安全性远高于几家巨头公司直接或间接控制的比特币网络。尽管在这个问题上的争议更大,不同的人有不同的看法,但很多人仍在努力寻找新的解决方案。

PoS

在这些新的解决方案中,权益证明(PoS)无疑是最受关注的。同时针对开放复杂网络的一致性问题,提出了全新的解决方案。

Basic CcON

2011 年,一位名叫 QuantumMechanic 的用户在 BitcoinTalk 论坛上率先提出了 PoS 的想法。此后,理念不断发展完善,得到越来越多的人的信赖。

PoS的基本概念如下:

  • 所有节点不再同时竞争挖矿,而是每次只使用一个节点作为验证者:在比特币网络中,所有节点都需要执行PoW任务,即所有节点都需要执行复杂的哈希运算,并且消耗大量的 CPU 计算能力,而只有最先找到答案的节点才能获得奖励。这种所有节点之间的同时竞争,无疑会消耗大量的资源。那么,一次只能有一个节点工作吗?如果是这样,幸运者将如何被选中?在 PoS 中,不再需要挖矿或矿工。相反,一次只需要选择一个节点作为验证者来验证区块的有效性。如果选择一个节点作为验证者来验证下一个区块,它会验证该区块中的所有交易是否有效。如果所有交易都被验证为有效,则节点对该块进行签名并将其添加到区块链中。作为回报,验证者将收到与这些交易相关的交易费用。在 PoS 中,每个共识中只有一个节点工作,工作非常容易,从而达到节省资源的目的。
  • 成为验证人必须提供押金:为防止验证人作恶,节点必须提前将代币存入指定账户作为保证金或抵押担保才能成为验证人。一旦发现节点作恶,保证金将被没收,从而鼓励诚实工作。只要恶意行为的收益不超过存款限额,节点就会诚实。
  • 被选为验证者并不是完全随机的,而是与提供的存款金额成正比。例如,Alice 提供 100 个硬币的押金,而 Bob 提供 500 个硬币的押金,那么随机选择 Bob 作为验证者产生下一个区块的概率是 Alice 的 5 倍。这实际上类似于股份公司,按照出资比例来划分话语权和受益权等权利。大股东贡献更多,承担更多责任,相应回报更大。

不难看出,PoS 也采用了经济学和博弈论的思想,通过激励政策和惩罚机制来保证网络的安全可靠。

Why does PoS Work?

PoS 协议仍然符合传统拜占庭容错(BFT)算法的结论。目前对 PoS 的研究可以分为两条主线:一条为同步网络模型,另一条为部分异步网络模型。基于链的 PoS 算法几乎总是依赖于同步网络模型,其有效性和安全性可以像 PoW 算法一样得到严格证明。如需参考,请参阅此文档。https://nakamotoinstitute.org/static/docs/anonymous-byzantine-consensus.pdf

另外,从 CAP 的角度来看,基于链的 PoS 算法与 PoW 算法类似,也尽可能地做到了容错,在可用性和一致性之间更加保证了可用性。

如果说传统的共识算法(Paxos、Raft 和 PBFT)实现了确定性的确定性或一致性,那么 PoS 就类似于 PoW,而是寻求概率的最终一致性。从传统 CAP 的角度来看,这其实是一种一致性的弱化。但是,从实际可行性来看,也是一种全新的思考和突破。

从 PoS 的设计策略来看,可以分为两种。供参考,请参阅本文。https://arxiv.org/pdf/1710.09437.pdf

  • 第一种是前面提到的基于链的PoS。主要模仿PoW机制,通过伪随机分配出块权给利益相关者来模拟挖矿过程。典型代表包括 PeerCoin 和 Blackcoin。其安全性和有效性可以从 PoW 的类比来看。
  • 另一类是基于 BFT 的 PoS,基于近 30 年的 BFT 共识算法研究。基于 BFT 算法设计 PoS 的想法最初是在 Tendermint 中提出的。以太坊 2.0 中的 Casper 也沿袭了这一传统,做了一些修改和改进。这类 PoS 算法的安全性和有效性可以参考 BFT 算法看出。例如,可以从数学上证明,只要有超过 2/3 的协议参与者节点诚实地遵循协议,无论网络延迟如何,该算法都可以确保最终状态不存在冲突块。然而,这样的算法也并不完美,特别是对于 51% 攻击,还没有完全解决。目前,该领域仍处于开放探索阶段。

Debate over PoS

PoS 的理念并不复杂,更容易被诟病的恰恰是类似于现实世界,按照出资比例获取收益的制度。人们已经对现实世界中的马太效应保持警惕。该系统导致富人更富,穷人更穷的结果:拥有更多代币的人将有更多机会成为验证者,从而参与网络并获得更多收益。

但是,在这个问题上的观点争议很大,很多人提出了完全不同的观点,认为 PoS 比 PoW 更公平,更有利于对抗中心化趋势。主要原因是PoW挖矿依赖于现实世界中的物理硬件和电力资源,容易产生规模经济。购买10,000台矿机的公司比购买1台矿机的个人更有议价能力,甚至可以以更低的成本开发自己的矿机。并且,拥有10000台矿机的矿场在电费方面具有更高的议价能力,可以迁移到电费较低的国家和地区的电站附近,甚至可以以较低的成本自建电站。结果是组织越大,综合挖矿成本越低,这正是现实世界中真实发生的情况。相比之下,PoS 在现实世界中不需要依赖硬件,也没有规模经济优势。如果不考虑价格操纵,1个硬币的价格和10,000个硬币的价格线性增加。从这个角度来看,PoS 可能更公平,更有利于去中心化。

PoS 的另一个担忧是它的安全性。毕竟,PoS 不再像 PoW 那样执行复杂的 CPU 操作来证明自己。在 PoW 中,如果要发起攻击,需要控制 51% 的算力(最近有研究发现只需要 25% 的算力就可以使攻击成为可能),这意味着大多数挖矿需要机器和计算能力资源。在 PoS 中,如果要控制整个系统,需要 51% 的代币。哪个更安全?其实不好说,但从一个现实世界的例子来看,如果比特币算法切换到 PoS,大约需要一半的比特币市值来控制比特币系统,也就是大约 40-1600 亿美元(比特币的价格范围:5,000-20,000 美元)。这个数字远远高于矿机的成本。用这么多的钱发动攻击几乎是不可能的。在这方面,PoS 可能更安全。

此外,由于 PoS 部署成本低(硬件要求低),代币在现实世界中很容易分叉,从而产生一堆山寨币。 PoW 中不存在这个问题。 PoW 依靠硬件进行挖矿,因此很容易改变比特币的参数。但是,如果你真的要运行它,它需要大量的计算能力和大量矿工的支持。例如,从比特币分叉比特币现金经历了曲折。 PoS 完全没有这样的顾虑。任何人都可以下载开源代码并随意更改。通过赢得一些节点的支持,他们可以声称他们已经创建了一个全新的令牌。例如,数十个或数百个山寨币可以很容易地从 EOS(代币名称)中分叉出来,每一个都声称是独一无二的。这确实是事实,但好坏不好说。

PoS: Improvement and Optimization

PoS 机制最重要的部分是下一个区块中验证者或创建者的选择机制。谁将是幸运者?上述根据账户资金比例和概率进行选择其实是最简单的方法。这种方法确实很容易导致富人一劳永逸地获得收益,从而损害网络中其他参与者的积极性。目前,有很多想法可以改善这个问题,其中比较有趣的是基于币龄的方法。选择创建者时,不仅要考虑资金的多少,还要考虑币龄。所谓币龄,是指币在账户上的保留时间。比如1个币转入指定账户10天,可以认为币龄为10,每次币所在账户发生变化时,币龄都会从0开始重新计算。这样可以限制资金量大的节点频繁成为创建者。例如,可以设置只有币龄为 30 的节点才有机会成为创建者,节点成为创建者后币龄立即清零。这实际上限制了大参与者的利益,为中小参与者提供了更多机会。

基于 PoS 改进的著名解决方案是委托权益证明 (DPoS),其中采用了代理委托机制。在 DPoS 中,所有节点不再可能都成为创建者。相反,节点相互投票,只有得票最高的节点才能参与出块过程。详细情况如下:

  • 代理的职责包括确保自己节点的持续运行、收集交易信息并将其打包成块、验证签名和广播块,以及解决网络中可能存在的一致性问题。
  • 对于大多数 DPoS 链来说,网络中的所有代币持有者都可以投票给代理,投票权与持有的代币数量成正比。代币持有者也可以将他们的投票权委托给其他人代表他们投票,而不是直接投票。
  • 投票是动态和可变的,这意味着可以随时选举或退出代理。一旦发现代理人有恶意或欺诈行为,他/她将失去收入和声誉。这可以激励代理诚实并确保网络安全。代理可以将收到的区块奖励按比例分配给投票给他的用户(这实际上相当于买票,在某些场景下是不允许的)。
  • 与传统 PoS 不同,代理不再需要持有大量代币,而是必须相互竞争以赢得代币持有者的选票。
  • DPoS 限制了交易区块中验证者的数量,在一定程度上牺牲了去中心化但提高了效率,因为在网络上达成共识所需的工作量大大减少。

img

不难发现,DPoS 通过引入投票机制,尽可能保证了节点的广泛参与。而且,系统通过限制验证者的数量(通常为 21-101)来尽可能高效。尽管争议很大,但 DPoS 仍然是一个可行的解决方案,越来越多的区块链系统也在尝试改进和探索。

Application in the Public Blockchain

在公链中,很多项目采用PoS机制。比较有名的有:

  • Ethereum: 目前,以太坊仍然使用 PoW 机制。不过,以太坊创始人、公链领域的领军人物Vitalik Buterin对PoS机制更看好,也详细阐述了PoS的设计理念(见这篇博文)及其相对于PoW的优势(见这篇文章) ) 很多次。以太坊目前正在开发基于PoS的Casper协议(参考本文),预计今年下半年发布。这种从 PoW 到 PoS 的转变也标志着以太坊 2.0 时代的开始。如下图所示,在以太坊 2.0 PHASE0 中,将发布使用 Casper 协议的 PoS 信标链作为协调层(参考本网站)。

  • EOS: DPoS 发起人 Daniel Larimer 发起了 EOS 公链项目,其中许多节点将相互竞争,希望成为拥有记账权的 21 个超级节点之一。这种类似于现实世界的理事会系统的设计引起了很大的争议,超级节点选举也可能包含巨大的商业利益,已经超出了技术讨论的范围,这里不再赘述。

Proof of X?

事实上,PoS 机制的兴起不仅是因为它自身的低成本、高效率和去中心化等特点,还因为它为更广泛的使用博弈论机制设计的技术打开了大门,以便更好地阻止中心化卡特尔的形成,如果它们确实形成,则阻止其以对网络有害的方式行事。

随着区块链,尤其是公链的飞速发展,近年来,其他 Proof of X ?这种机制也正在出现。从上面的众多机制中,我们可以看到 PoS 概念的影子,即如何从经济和博弈论的角度设计一个系统,以尽可能地保证去中心化、安全和效率。以下是这些机制的简要说明:

  • Leased Proof of Stake (LPoS): 许多代币很少的节点可以将代币出租给其他节点,从而形成合力,增加成为验证者的可能性。一旦节点赢得选举并获得奖励,服务费将按比例分配,这实际上类似于矿池的想法。
  • Proof of Elapsed Time (PoET): 所有节点都必须等待一定的时间才能成为记账者,等待时间完全随机。为了保证公平,两个核心问题是:如何保证等待时间确实是完全随机的?如何保证某个节点真的等待了指定时间?当前的解决方案依赖于 Intel 的特殊 CPU 硬件,即 Intel SGX 系统。目前只能在许可的网络环境中应用,比如前面提到的企业以太坊联盟(EEA)。
  • Proof of Activity (PoA): PoA 结合了 PoW 和 PoS 的思想。在 PoA 中,初始过程类似于 PoW。矿工们还在争先恐后地解决问题和挖矿,只不过挖出的区块只包含了头信息和矿工的地址。一旦挖出一个区块,系统会自动切换到 PoS 模式。区块头信息指向一个随机的权益持有者,该权益持有者验证预挖的区块。
  • Proof of Importance (PoI): 鉴于 PoS 机制倾向于鼓励人们持币而不是流通,容易导致富人越富的问题,PoI 将计算节点对系统的重要性纳入了更多维度:币数和币在账户上的保留时间,交易对手(与其他账户的净交易越多,得分越高),以及最近30天的交易数量和交易规模(交易越频繁)并且金额越大,分数越高)也被考虑在内。
  • Proof of Capacity (PoC): 它也被称为空间证明(PoS)。思路与 PoW 类似,但是以存储空间而非 CPU 计算能力来衡量的。
  • Proof of Burn (PoB): 矿工必须烧掉一定数量的代币,也就是将一定数量的代币转移到一个吃的地址(黑洞地址,代币只进不出,即私钥未知的地址)来证明自己.从本质上讲,它接近于 PoW 的概念。不同的是,PoW 消耗算力资源,而 PoB 直接消耗代币。
  • Proof of Weight (PoWeight): PoWeight 在考虑 PoS 中代币数量的基础上,考虑了更多的权重因素。例如,FileCoin(IPFS 分布式文件系统上的令牌)考虑了您拥有的 IPFS 数据的大小。其他权重因素包括但不限于时空证明 (PoSt) 和声誉证明 (PoR)。

可以看出,虽然Proof-of-X?机制层出不穷,又各不相同,要解决的核心本质问题是一样的:谁是记账的幸运儿?这些机制只是采用不同的策略来制定游戏规则,让节点尽可能公平地证明自己,公平地选择幸运者。所有这些策略,包括 CPU 计算能力、持有的代币数量、存储空间大小、随机等待时间、烧毁的代币数量、节点活动和节点贡献,都是对特定场景下开放网络一致性问题的探索。

All about Trust

从 PoW 到 PoS,再到 Proof of “X (Everything you can think)”,无许可网络的一致性问题一直在探索中。 “一致性”的内涵也在发生变化,从如何防止网络和机器硬件的故障,保证网络节点间数据的一致性,到如何防止开放网络中人的恶意行为,保证数据的真实一致性节点之间。可以说,我们已经从硬件的可靠性走向了“人的可靠性”,而公链技术也被视为“信任机器”。但是,“人的可靠性”这个问题太复杂了,甚至超出了技术范围。现阶段能做的,还远远不能保证“人的可靠”。但是,在大多数情况下,它仍处于人们对机器和协议的信任阶段。幸运的是,我们终于迈出了这一步,开始正视这个棘手的问题,探索创新的解决方案。

Summary

世界充满了不确定性,计算机科学也是如此。自计算机出现以来,我们不得不面对机器硬件的不确定性:可能因意外故障而产生的问题。而且,自从互联网兴起以来,我们不得不面对网络的不确定性:通信消息可能存在的延迟、混乱和丢失。不确定性问题最自然的解决方案是冗余。大量节点用于保证系统的整体安全,避免单点故障(SPOF),增强容错和攻击防御能力。正是在此基础上,大规模分布式网络蓬勃发展。如何在不确定的网络和节点之间找到一定的确定性,协调多个节点之间的一致性,正是分布式共识算法需要解决的问题。能够处理故障类型错误的CFT算法包括最经典的Paxos算法和更简单的Raft算法。当网络中的正常节点超过一半时,可以保证算法的有效性。这些算法通常用于具有可信环境的封闭网络中,以协调几个到几十个节点之间的一致性,例如公司内部的分布式存储、分布式服务协议、分布式消息系统等。此外,它们还可以应用于由少数需要授权才能访问的组织组成的私有链网络。

然而,不确定的不仅仅是网络和机器本身,还有人控制网络中节点的行为。在攻击者可能擅自更改数据或攻击网络的情况下,如何保证分布式网络的一致性,正是 BFT 算法需要解决的问题。最常见的 BFT 算法是 PBFT 算法。当网络中的正常节点超过1/3时,算法的有效性可以得到保证。即便如此,PBFT 处理网络中恶意行为的能力仍然有限,其性能也会随着网络中节点数量的增加而显著下降。这些限制也导致PBFT算法只能用在环境更可靠的许可网络中,协调几个到几十个节点之间的一致性,比如私链场景。

然而,在一个无需许可的开放网络中,不确定性问题更为严重,尤其是网络节点背后的人的行为的不确定性。如何防止网络中的控制者通过腐败和勾结形成巨头,从而控制网络中一半以上的节点,从而达到控制、破坏和攻击网络的目的,是当前需要解决的问题。开放网络。从这个角度看,开放网络中的一致性也蕴含着安全的前提:它不仅要求节点之间能够达成共识,而且该共识确实是由众多节点控制器的真实表达形成的。要实现这种一致性和安全性,不仅要实现物理硬件节点的结构去中心化,还要尽可能保证节点背后的实际控制者的去中心化。为此,需要:保证任何人都可以随时部署和运行网络协议,成为网络中的一个节点,随时可以访问网络;确保节点之间的点对点通信,无需任何集中控制节点;并保证节点的角色完全对等,所有节点都能按照规则公平参与记账。如何在一个开放的网络中协调数万个节点之间的行为,保证网络的一致性和安全性,是公有区块链共识机制要解决的问题。其中,最典型的就是比特币发起的PoW共识机制以及后续的PoS共识机制。这些共识机制不再局限于技术一致性,而是更多地引入了经济学和博弈论的思想,从经济学和博弈论的角度尽可能保证网络的一致性和安全性。

从封闭分布式网络环境下的一致性到许可私链场景下的一致性,再到无许可公链开放网络环境下的共识机制,问题越来越复杂,挑战也越来越大严重的。从纯粹的技术角度来看,对共识的研究是一脉相承的。这些共识算法或共识机制也受到传统分布式共识理论研究中的 FLP 不可能性和 CAP 定理的限制。 Paxos、Raft 和 PBFT 都强调容错性和安全性/一致性,削弱了活性和可用性。 PoW 和 PoS 从全新的角度考虑问题,尽可能保证容错性、活性和可用性,放弃对安全性和一致性的确定性追求,只以概率的方式追求最终的安全性和一致性。

此外,关于共识的思考也在不断深化,从单纯的节点间数据一致性到强调节点背后人的共识和识别,从保证网络和硬件的可靠性到保证背后人的可靠性尽可能多地组成网络的节点。虽然人与人之间的可靠性非常复杂,超越了单纯的技术范围,但令人欣慰的是,我们已经在路上,在这一领域不断创新和积极探索,必将使世界变得更加可靠。