# 共识算法的比较：Casper vs Tendermint

By [DK](https://paragraph.com/@iamdk) · 2022-05-11

---

权益证明的漫漫长路
---------

权益证明的定义可以查看[理解权益证明](https://link.jianshu.com/?t=https://blog.cosmos.network/understanding-the-basics-of-a-proof-of-stake-security-model-de3b3e160710)。

1982年，拜占庭将军问题首次被Lamport，Shostak和Pease提出。Cosmos的Ethan Buchman这样描述它：”这是一个在可妥协的通信网络中实现分布式协议的问题，也就是在不可靠的环境中建立一个可靠的系统的问题“。从1982年到1999年，都没有人能够创造一个可以解决拜占庭将军问题系统。长久以来，拜占庭将军问题与计算都是无关的，因为在那个时候，互联网演进出基于云的中央中心化计算模式，所需要解决的只是容错问题。

所以，故障容错算法得到普及，例如1998年发明的Paxos算法和2013年发明的Raft算法被广泛的应用。而1999年发明的实用拜占庭容错（PBFT）却没有被学术界之外采用。直到2008年，中本聪将网络规模级别的分布式拜占庭容错(BFT)算法设计到区块链方案中，才使拜占庭容错得到推广。当这种原型出现之后，系统研究界的人都开始围绕将学术界“奇物”应用到真实世界而去构思各种想法。

在2011年，[BitcoinTalk论坛](https://link.jianshu.com/?t=https://bitcointalk.org/index.php?topic=27787.0)对一个叫做权益证明(PoS)的概念组织了一场讨论。最初的PoS协议例如点点币，实现结果的并不理想。第一个真正提出将BFT研究应用到PoS公有区块链环境中是Jae Kwon，他在2014年创造了Tendermint。

在当时，PoS研究做出了很大的假设：假设系统中的一系列对等节点都是静态的，并且在长时间内都是稳定的。在区块链环境中完全是不现实的。 Jae Kwon的重大突破是使Tendermint能够使用区块，哈希链接，动态验证器集合和循环的领导者选举来将BFT研究适应复制状态机（区块链）的领域。

在Tendermint环境中，出现了大量的共识算法（Honeybadger, Ouroboros, Tezos, Casper），它们都包含了BTF研究的元素以及在区块链上其他模块观察的元素。

为权益证明做的所有研究都指向一个重要问题：在不耗尽物质稀缺资源的情况下，我们可以达到工作量证明（PoW）的安全级别吗？这个问题可以转化为：PoS的投票权以链上货币计价而不是计算力计价。区块链的POS共识问题比可扩展性更被广泛讨论，运行PoW挖矿的高开销成本以及环境外部性方面存在的问题都刺激了大量资源涌入PoS安全研究。

本文主要探讨了在加密货币中使用了权益证明的三个主要PoS协议的特性：由Vlad Zamfir带领研究的Casper the Friendly Ghost(**CTFG**)和由Vitalik Buterin带领研究Casper the Friendly Finality Gadget(**CFFG**)以及Jae Kwon带领研究的**Tendermint.**

权益证明的陷阱
-------

### 无利害关系

起初，有多种不同的说法来描述权益证明的一般陷阱，无利害关系就在这时被提出。Jae Kwon 2014年5月以“错误选择谬论”的不幸名字[第一次提到这个问题](https://link.jianshu.com/?t=https://github.com/tendermint/tendermint.github.io/blob/5c111743a03d2c6ed2e0b14bd3091cac8974c8da/docs/tendermint_v02.pdf)。在2014年7月Vitalik把比特币开发者所描述的确切定义的问题普及推广为“无利害关系”。问题呈现出此情况：验证者通过在给定高度为多个有冲突的区块投票可以有效的破坏安全性而不用付出任何代价。

简单的PoS实现对于这些攻击而言是非常脆弱的。灾难性的是，因为没有任何的激励来鼓励大家永远集中在一个独一的链上，并且每次激励都要同时在相互冲突的链条上进行重复签名，所以为了获得更多的区块奖励，在经济上最优的策略就变成了尽可能的在多个分杈上进行投票。下面这张图就展示了：

在简单的PoS设计中竞争链上的期待投票数高于单一链上期待的投票数

在工作量证明中，对于在多个链上进行挖矿的矿工“惩罚”是他们必须分开他们的计算力（非常稀缺的资源）。在现代非简并的PoS设计中，这种成本必须嵌入到协议里面以此模仿物理PoW挖矿的限制。

  

Vitalik Buterin在2014年1月引入的“slasher”概念或协议内惩罚可以减轻这个攻击。Jae Kwon在同一年[进一步推算了此方法](https://link.jianshu.com/?t=https://tendermint.com/static/docs/tendermint.pdf)，这是实现Tendermint共识协议的第一个迭代进展。苛刻以及允许这种惩罚的条件，对于所有的非简并BFT协议都是有帮助的，甚至在本文中出现的三种共识都采用了。

### 远程攻击

远程攻击来源于用户不得不撤回保证金的权利。这就产生了一个基本问题，因为这意味着攻击者可以从任意长度的距离建立一个分杈而不用担心被削减。一旦保证金被解除绑定，激励不从某个高度区块前进行长距离投票就被取消了。换句话说，当超过2/3的验证者解除了绑定，那么他们就可以恶意的创造包含之前验证者集的第二条链，这可能导致任意的交易。

对于权益证明协议这是相当致命的，因为安全模型必然是“主观”的。当参与网络要求大量的社会信息，那么这个安全模型就会被称为是“主观的”。一个新节点加入网络之后，对于当前网络的状态可能会得出不同的结论，因为他们的决策是基于主观信息的，即社会声誉。在相反面，工作量证明的安全模型必然是“客观的”，因为当前网络状态总是工作量最多的那个状态，新节点对于网络状态的结论总是相同的，因为他们的决策是基于客观信息。

PoS的远程攻击在[弱主观性](https://link.jianshu.com/?t=https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/)模型下进行了纠正，这要求接入到网络中的后续新节点：

*   _当前必须是被绑定的_。只相信_当前_有保证金的验证节点
    
*   解除绑定保证金必须要经过一个"解冻"期。解除绑定之后，代币需要数周到数月的“解冻”时间，用以实现“同步性”前提（即延迟的消息）
    
*   禁止在N个块之前恢复，其中N是保证金的长度。 这个规则使任何长程分杈无效。
    

可选择的将验证者集存放在PoW的链上

\*

Casper（s）和Tendermint采用一种简单的锁定机制（“Tendermint”中俗称“冻结”）来锁定股权一段时间（几周到几个月后“解冻”），以防止任何恶意联合验证者 违反安全。在CFFG算法中，一个分杈选择规则永远只能修改最终块之后的块阻止了远程攻击。通过使用时间戳，在CFFG中的长距离分叉试图修改比最终块还要更早的块的时候会被协议直接忽略掉。

卡特尔形式
-----

第三，最后的障碍是面临任意价值的任何经济形式都将面对一个真正的寡头垄断问题，就算本土加密货币也不例外。

_“加密货币令人难以置信的集中，挖矿算力也是一样。寡头垄断竞争是很多现实市场的常态。少数相对富有的验证者之间的协调比多数相对贫穷验证者之间的协调要容易的多。在我们这种情况下，卡特尔形式是完全被预料到的。”_ ——Vlad Zamfir，[_Casper的历史第4章节_](https://link.jianshu.com/?t=https://medium.com/@Vlad_Zamfir/the-history-of-casper-chapter-4-3855638b5f0e)

Tendermint依靠额外协议管理方法来与寡头垄断验证者进行对抗。虽然在审查制度方面没有任何协议措施，但依靠带外社会信息解决卡特尔形成，其中的基本原理是：用户最终将不可避免地注意到卡特尔的形成，社会上也会对此到处八卦，然后放弃或者投票重新组织受到攻击的区块链。

到目前为止，Vlad的Casper协议是唯一一个明确使用共识内审查激励来打击卡特尔形式一种模式。

概述
--

有很多不同的方式来实现权益证明的算法，但是权益证明设计的两个主要原理是基于链的PoS和基于拜占庭容错(BFT)的PoS。Tendermint是基于拜占庭容错的PoS设计，CTFG是基于链的PoS设计，而CFFG则混合了两者。

计算机科学中的[CAP理论](https://link.jianshu.com/?t=https://en.wikipedia.org/wiki/CAP_theorem)返回在分布式数据系统中提供超过2/3担保的不可能性：可用性、一致性、分区容错。基于链的PoS算法倾向于选择可用性高的而不选择一致性高的，因为可用性高意味着所有的交易都能被处理，不过要以牺牲整个网络中一致性状态复制为代价。基于BFT的却相反，会倾向于选择高一致性。

### 基于BTF的权益证明

拜占庭容错共识算法源于30多年的丰富研究。Tendermint（2014）是Castro和Liskov在1999年引入的实用拜占庭容错(PBFT)算法的第一个PoS的改编版。基于BFT的PoS协议伪随机的安排一个验证者在多轮投票的过程中提出一个区块。但是，提交和最终化区块取决于大多数——所有验证者中2/3的验证者在提交的区块中签名。在区块最终化之前可能需要进行几轮(译者注：这种多轮投票和现实世界的波尔卡舞蹈类似， 这也是polkadot 名字的由来)签名。BFT系统只能容错1/3的失败，其中失败包括故障或是恶意的攻击。

### Tendermint核心

Tendermint主要包含两个主要的技术：区块链共识引擎和通用的应用接口。共识引擎被称为Tendermint核心模块，确保相同的交易在每个机器中都按照相同的顺序被记录下来。应用接口被称为应用区块链接口(ABCI)，让交易可以被任何编程语言编写的程序处理。

在核心模块中，Tendermint基于循环投票机制进行工作，这也是共识协议的原理。一个回合被分成3个处理步骤：验证者提出一个块、发送提交意图、签名后提交一个新区块。这种机制为原子广播提供了一个安全的状态复制机，增加了一个责任层——安全故障可以完全归结于Tendermint。

Tendermint共识算法从验证者集开始。验证者们都维护了一份区块链的全拷贝，并且可以用公钥来识别验证者的身份。在每个新的块高度他们轮流的提出一个区块。每轮投票都只有一个验证者可以提出块，并且要用验证者相应的私钥对此进行签名，这样的话如果有错误发生就可以找到为此负责的验证者。然后剩下的验证者就需要对每个提议都进行投票，投票都需要用自己的私钥进行签名。这些组成一个回合。不过可能因为网络的异步需要好几个回合才能提交一个新块。

验证者提交块的时候由于几种原因可能会失败：当前的提议可能下线了，或者网络可能遇到了延迟。Tendermint允许验证者可以被跳过（就是轮到一个验证者出块的时候但是此验证者没出块）。验证者在移到下一轮投票之前等待一小段时间来接收提议者（此轮出块的验证者）提出的整个区块。这种对超时的依赖让Tendermint成为一个弱同步协议，而不是一个异步协议。不过，剩下的协议是异步的，并且验证者只有在接收到了超过2/3的验证者集消息时才会进行处理事物。正是因为这样，所以Tendermint需要大多数的验证者可以100%正常运行，如果1/3或更多的验证者离线或脱机，网路就会停止运行了。

  

假设少于1/3的验证者是拜占庭，Tendermint保证安全永远不会被破坏——也就是，验证者（2/3以上）永远不会在同一个高度提交冲突的区块。因此，基于Temdermint的区块链永远不会分叉。

目前为止，Tendermint的设计决策确实是把安全性和不可改变性地位放在了灵活性之上。在现实世界上有相当高的可能性是，系统真的会停止运行，参与者将会需要在协议外组织在某种软件上更新后重启系统。

在数字加密货币社区中只有少数人理解 Casper以及为什么它很有价值的时候，Tendermint就为Casper研究奠定了基础。这个洞察力就是：如果一个链的本身是高度容错的，那么你就可以依赖链来对于谁来生产区块做出一个好的决定，但是如果链的本身就是不可靠的，那么你就陷入了鸡和鸡蛋的问题中去了，这也是之前所有其他共识算法的灭顶之灾。

这个设计决策被认为不如可用性优先的协议例如以太坊和比特币。比特币中的权衡是：如果它的网络被分裂了，比特币在各种攻击的情况下就失去了它的安全保证。这其实就是一个不可修改理论，也就是你的置信区间是100%的时候，那么你跟随的就是一条正确的链，你会使用这条链来选择谁来生产下个区块，但是一旦你转移到一条不安全的链上之后，并没有一条明确的路径让你回到正确的链上。

#### Tendermint的明确属性

1.  可证明的活跃性
    
2.  安全阈值：1/3的验证者
    
3.  公有/私有链相容
    
4.  即时的最终确定性：1-3秒，取决于验证者数量
    
5.  一致性优先
    
6.  在弱同步性网络的共识安全
    

基于链的权益证明
--------

基于链的权益证明模仿了工作量证明共识算法，在此权益证明中协议让伪随机选择出来的验证者产生一个新块，新块是哈希连接（包含上个块的哈希值）到前一个最长链的父区块上。基于链的PoS非常依赖同步的网络，通常优先考虑可用性而非一致性。Casper(s)对于倾向于活跃性而非安全性环境而言，它就是Tendermint核心思想的一个改编。

### CFFG

CTFG是一个明确的PoS构造，但是CFFG是一个覆盖在已存在的以太坊PoW提议机制上的PoS——融合了PoW和PoS两者，由Vitalik Buterin带领实现。

  

比特币和以太坊的PoW共识协议都不会做“最终”决定，并且区块可能会潜在的被重新组织到一些过去区块高度。当区块没有机会再被修改的时候才能称为“最终确定”的。因为工作量证明没有提供这样的修改保证，所以它被认为是共识不安全的。相反，当我们持续加长链的时候区块的最终确定性概率也越来越高。为了为以太坊区块链增加想要的最终确定性和51%的攻击阻力，CFFG实现的逻辑就完美的提供了这种效果。

CFFG将通过多个步骤推出，以保守的方式将以太坊的PoW安全模式逐渐过渡到PoS安全模式。Casper的第一个迭代将会是实现这里讨论的混合PoW/PoS协议，Casper的最后一个迭代很有可能吸取CFFG和CTFG的教训，朝着一个完整的PoS协议发展。

CFFG是基于链的PoS和基于BFT的PoS的之间的混合体，因为它吸取了两者的思想。它的模块化覆盖设计让现在的PoW链的更新变得更加容易，因为它对于将系统升级到完全不同的共识模式而言是一种更保守的方法。

Casper的应用逻辑存在于智能合约的内部。要想在Casper中成为验证者，必须要有ETH并且要将ETH存储到Casper智能合约中作为杠杆的权益。在Casper第一次迭代中区块提议的机制会被保留：它依然使用Nakamoto PoW共识，矿工可以创建区块。不过为了最终化区块，Casper的PoS覆盖掌握控制权，并且拥有自己的验证者在PoW矿工之后进行投票。

Casper的PoS共识最重要的一个部分就是检查点(checkpoints)。Casper在50区块增量的时候评估最终确定性就称之为检查点，每50个块片段就称之为周期(epoch)。通过验证者在每个周期发送投票消息时触发这个处理过程。

在一个周期前最终化检查点需要2个周期才能完成，也就是需要两轮投票。例如，当超过2/3的验证者（也就是大多数）给一个检查点c投票了，那么就说这个检查点已经被"审判"了。下一个周期，当大多数人给检查点c投票了，会发生两件事情：c变成了被审判的并且c已经最终化了。c这个周期也就代表着最后一个最终化的周期(LFE)。

回顾一下，一个区块最终化需要两个条件：

1.  大多数(超过2/3)验证者在周期1的时候给区块1进行了投票，因此审判了区块1
    
2.  大多数(超过2/3)验证者在周期2的时候给区块2进行了投票，区块2是区块1的子区块，因此在周期2的时候最终化了区块1
    

在理想执行中，一个区块的最终化是按照下面的步骤的：

> 区块1的2/3投票→审判区块1→2/3投票区块2→最终化区块1

其中区块2是区块1的子区块

\*

当一个检查点被最终化之后验证者就会得到报酬。不过，如果有两个最终化的检查点在相同高度上分杈时，那么就破坏了安全性，这个时候就达到了消减的条件，最少1/3的保证金将会被消减掉。当安全性被破坏的时候可以将错误归因的证据当作交易广播给PoW的矿工。然后PoW就将这个证据交易组成一个区块来进行挖矿，提交了这个证据的验证者会得到查找者的费用。当此事发生的时候，签署了在冲突区块的有罪验证者将会在两条链上被消减掉。

  

现在如果一个矿工进行蛮力攻击，那么会发生什么？现在Casper的最终化区块链可以防止PoW的攻击者，就算是51%或者更多的计算力重写最新检查点之外的历史也会被阻止。因此，Casper协议提供了安全。不像CTFG，因为CFFG就是不同提议机制上的一层覆盖，Casper不能确保活跃性，因为活跃性是取决于提议机制的。

验证者是被激励着集合在权威链上的，因为如果他们持续在不同的链上进行投票将会受到惩罚。[slasher 2.0](https://link.jianshu.com/?t=https://docs.google.com/document/d/13_FSQ1Koq8uLvqTaSvZdb6OT2SpUZZq53vFiiDQj4qM/edit?usp=sharing)的形成让验证者不仅仅会为双重投票而受罚也要为在_不正确_的链上进行投票而受到惩罚。不过这也造成了一个“泄气”的窘境，因为验证者担心如果出现一个分杈而自己不确定到底哪个才是权威的，然后投错票之后被消减所以选择退出投票。

#### CFFG的明确属性

1.  最终化：超过20分钟最终化。每隔50块（一个周期）就最终化一次区块，防止PoW挖矿暴利攻击
    
2.  共识安全性
    
3.  可证明的活跃性
    
4.  优先可用性
    

### CTFG

CTFG是Vlad Zamfir的正确构造(CBC)共识协议专用于对抗寡头垄断的真实世界的环境。CTFG是工作量证明中[GHOS](https://link.jianshu.com/?t=https://eprint.iacr.org/2013/881.pdf)或GHOST协议的PoS改编版，用于其分杈选择规则。CTFG背后的指导设计原则是基于加密经济学的，使用旨在实现评估安全的正规方法。与前面详细说明的CFFG混合协议不同，CTFG是纯粹的权益证明的概念。

  

_“Casper刚刚开始的时候只是简单的‘友好的幽灵’，它对于PoS而言是GHOST的改编，完善的激励让卡特尔‘友善地’变成‘非卡特尔’的验证者。”_

——Vlad Zamfir，[_Casper的历史第5章_](https://link.jianshu.com/?t=https://medium.com/@Vlad_Zamfir/the-history-of-casper-chapter-5-8652959cef58)

与工作量证明类似，CTFG会为一致性和可用性进行权衡。特别，在区块没有被最终化的时候，随着在链中的深度越深的它们就会越安全。CTFG与CFFG有一点相似，链头部的处理总是比区块最终化的处理要快很多。

Casper的PoS提议机制与Tendermint提议机制最大的区别是相比较伪随机选择领导者，前者的验证者可以基于自己见到的块提出块。

Casper提供的一个独特功能是参数化安全阈值。与比特币中使用6个确认来确定一个经济最终状态类似，CTFG中的“评估安全”提供了一个验证者可以有一个与其他验证者不同的安全阈值功能。Casper的设计目标是在网络维持PoS低开销的时候能够允许验证者选择自己的容错阈值。

Casper对Tendermint的核心优势在于网络随时可以容纳一定数量的验证者。因为Tendermint中的区块在创建的时候需要最终化，所以区块的确认时间应该短一点。为了达到短区块时间，Tendermint PoS能够容纳的验证者数量就需要有个限制。由于CTFG和CFFG到在区块创建的时候都不需要安全性，所以以太坊网络相对于cosmos容纳100个验证者来说，可以容纳验证者的数量会更加的多一点。

#### CTFG的明确属性

1.  可用性。Casper的节点在它们达成共识之前可以块分杈
    
2.  异步安全性
    
3.  生存。Casper的决策可以在部分同步中存活，但是不能在异步中存活
    
4.  卡特尔阻力。Casper的整个前提是建立在抵制寡头垄断攻击者基础之上，因此不会有任何勾结的验证者可以超越协议
    
5.  安全性。取决于每个验证者的评估安全阈值
    

未来的工作
-----

公链在产品上运行是一个比较新生的技术。在这个范例中到目前为止显示出不会腐败的唯一安全模型就是工作量证明。权益证明的设计空间还非常的大，而且工程学上权衡的理解也远远不够，因为权益证明是一个研究前沿也没有足够的数据。不用多说，要达到一个最佳的PoS共识算法，我们还有很多未来工作需要完成。

Tendermint的一个改进可能是新的提出机制，或者将Tendermint的多轮投票过程压缩成一轮投票。

第二个未来工作的领域可能是利用更高级的加密技术让区块头的签名更小一点。因为我们是通过Cosmos来建立一个“区块链的互联网”，所以将轻客户端证明从一条链上移到另一条链上就是我们的核心工作。从这个观点来看的话，使用更加高级的密码学将区块头的大小减少三十倍或者更多是非常有利的。目前，100验证者，Tendermint的区块头接近4KB，它们都是验证者的签名。我们可以使用高级的加密技术让100个签名从3.2KB减少到64字节。

还有一些优化p2p层的方法，这样我们就可以显著减少点对点需要最终化块的流量。在未来的工作中，不仅仅是压缩区块头中的数据量，还会减少发送到对端的数据量。这样的话，在Cosmos网络初始100个验证者的阈值之上，Tendermint还可以增加更大的验证者集。

---

*Originally published on [DK](https://paragraph.com/@iamdk/casper-vs-tendermint)*
