Casper the Friendly Finality Gadget 是以太坊现在使用的共识机制,属于 PoS 的一种实现。这种关系类似于同样是 PoW 挖矿,Bitcoin 使用 sha256 而 Dogecoin 使用 scrypt。其他的 PoS 实现还有比如 Cardano 的 Ouroboros。
EIP-7251 的主张是增加单个验证者的质押额度上限,原先是 32 ETH,希望改为 2048 ETH,这样可以有效减少验证者的数量,同时有效 P2P 网络的通信量。
这项改动有点迫在眉睫,因为以太坊在测试环境中模拟了大量质押者的情况,测试结果 显示,当质押者数量达到 2.1 M,网络的投票率会不到 50%,已经不能正常进入 Final 状态,意味着检查点机制失效,整个网络处于非常不安全的状态。而以太坊现在的验证者数量已经达到了 1.4M。如果不及时做出改变,以太坊网络将在不久的将来奔溃。
那为什么以太坊会面临这样的困境?PoS 不是公链专属的共识机制,能够适用于大规模网络的吗?
究其原因,Ehtereum Casper 其实是对 BFT 的改进,而不是对 PoS 的改进。
先来看看 Vitalik 是怎么描述 Ethereum Casper 的,他把 Ehtereum Casper 相对于 BFT 的改进视为重中之重:
再来看一下 Ehtereum Casper 的具体流程:节点质押资产成为验证者,然后通过 VRF 来随机选择一个节点出块,出块后所有验证者都对块的有效性进行一次投票。这些投票会先投递给委员会的成员,委员会成员聚合投票结果之后,再在委员会成员之间同步。委员会成员是每隔一段时间随机选举出来的。
对于了解 BFT 但是不了解 Ethereum Casper 的人,在接触到以太坊网络后,当知道只有收到 2/3 投票的块才有资格被标记为 Final 状态时,会不会对 2/3 这个数字有点敏感?因为 2/3 是 BFT 一直在强调的投票比例,以保证 3f+1 的容错能力。
BFT 的投票机制保障了网络绝对不存在分叉,以太坊引入了 BFT 的这个优点,使得 Ethereum Casper 处理分叉场景相对容易,只需要判断哪个区块的得票率最高,就可以认定主流块了。如果验证者同时对两个块投票,验证者会为此受到惩罚,这也是以太坊在众多 PoS 链中唯一一个有 Slash 机制的原因。同时结合 checkpoint 机制,以太坊就可以面对非常复杂的分叉情况,整个网络分叉成树都能从中找出主链。
问题在于,Ethereum Casper 在引入 BFT 优点的同时也引入了 BFT 的缺点,那就是通信量过大。BFT 的通信量是 O(n2) 级别的,一般只能承受 100 个以下的节点规模,例如 这篇报告 就给出了具体的数值。
可以大致计算对比一下 BFT 和 Ethereum Casper 的消息量。
BFT 在 100 个节点的时候大概是 50 tps 的能力,消息膨胀量 O(n2),那么消息数量是:
n = (100^2) * 50)
= 500000
= 0.5 M/s
Ethereum Casper 在 2M 验证者的时候大概 50% 的投票率,以太坊的块时间是 12 秒,一共 64 个委员会,消息膨胀量 O(n),那么消息数量为:
n = 2M * 0.5 / 12 * 64
= 1000000 / 12 * 64
= 5 M/s
这样计算比较草率和粗略,结果数字上差了一个数量级,但是考虑到两种共识机制具体实现上有很大差异,包括测试的硬件环境差异,有出入很正常,总体上差不太多。
所以由于以太坊集成了 BFT 的投票机制,导致以太坊网络需要大量的通信量。或者说,Ehtereum Casper 改进了 BFT 并且把 Stake 机制加入其中,使得 BFT 更进一步能够支撑起十万规模的节点数量。
同时,有没有注意到,Ethereum Casper 的消息膨胀量仅仅只是 O(n),为什么呢,因为 Ethereum Caspe 不需要进行第二次投票,一次就够了。
另外,委员会机制有点像联盟链的分层共识。有些国内公司需要在没有 token 概念的前提下,对区块链技术进行改进,但是 BFT 算法最多只能撑起几十个节点的规模,于是有了基于 BFT 的分层共识,基本思路是,从所有节点中选出一部分节点作为提案节点,然后提案节点来进行出块和投票,其他节点只接收数据,并且每隔一段时间换一次共识组(提案节点)。
对于联盟链,VRF + BFT + 分层共识已经是比较完善的技术组合了。
与之相比,以太坊多出来的是 Stake 机制,联盟链中每一个节点都是验证者,都有机会出块,而以太坊想成为验证者,需要事先质押一定量的 token 才行。后面的委员会机制相比分层共识,也有一些改进,委员会机制保留了每一个验证者的投票权,只是选出一些代表来归集投票结果。而分层共识直接剥夺了多数节点的出块权,只有少数节点负责出块。
所以以太坊的共识能简单理解为 Stake + VRF + BFT + 委员会机制。