ETH2.0中的CASPER FFG机制

上一篇文章 何为CASPER FFG 讨论的是关于Casper Friendly Finality Gadget (Casper FFG)的基础知识,那么这篇文章的第一部分将重点介绍信标链Casper FFG机制实现的高层级细节,第二部分将讨论分叉选择规则(fork choice rule)和活性的其他相关因素。

这篇文章解释的是直接从Eth2.0规范中挑选的概念,我会尽可能地提供规范中参数与函数的相关链接。这些链接仅供参考,因此无需查阅这些链接也能读懂这篇文章。

Casper FFG 机制

Slots、 Epochs 及 Attestations

Slots**(时隙)**:**区块链上的时间是按照 slot 来划分的,每个slot期间有一个新区块被提议。** 每个slot为12秒, 一个slot分配一个验证者提议产生一个新区块

Epochs**(时段)**: Casper FFG机制无需在完整的区块树上运行,仅处理投票所需的某些特定slot的区块即可。 因此,在通过查看投票情况以对区块进行最终确定时,能够免于查看过多来源区块 – 目标区块对,从而减少了成本。由于这些特殊slot为验证者提供了足够的投票时间,因此当每次进行FFG最终确定性检查时,预计将看到绝大多数验证者的新投票结果。每个epoch由32个slot组成,所以每个epoch的时间长度为6.4分钟,即 1 epoch = 32 slots * 12s = 6.4mins 。FFG机制只处理这些epoch的边界区块(称为”检查点(checkpoints)”或“epoch边界区块(EBB)”)。

***假设每个epoch由3个slot组******成,******Slots******和******Epochs******之间的关系示意图,******其中区块* A* 、* D* 、******G**** 是检查点*

Attestations **(证明****)** :指的是Casper FFG投票,其中包含诸如来源区块、目标区块、进行证明时的slot编号及验证者的标识符等信息。证明由验证者广播到p2p网络,最终再由区块生产者打包进区块。

Casper FFG 机制的变化

与我以前的文章中提到的相比较,最终确定性的定义有所改变。

Finalization**(最终确定性)**:区块B已最终确定的条件如下:

  • 或是充当创世区块
  • 或是B_0已被证明,条件如下:
    • slot编号按顺序递增,检查点也随之按[B_0, B_1, … , B_n]顺序排列,其中n >= 1,这些检查点区块位于同一条链上且已被证明。
    • 同时超过2/3的验证者已将票投给 (B_0, B_n)

黄色区块处于已证明状态,红色区块处于最终确定性状态

更改后的定义仍然保留了上一篇文章中Casper FFG安全证明的概要。关于完整证明的内容,请参见 本文 的“安全性”部分。

Casper FFG 最终确定性检查

信标链采用链上FFG机制来处理区块与证明,以检测最终确定性。在每个epoch边界,该机制都会处理新的证明,并更新已证明与已最终确定区块的信息。

为了尽可能降低任何来源区块-目标区块对之间证明的处理成本,链上FFG机制仅处理特定的来源区块-目标区块对,即只处理当前与上一个epoch的证明 (事实上还要满足更多条件) 。这种特性导致链上FFG机制无法检测所有最终确定性实例!简而言之,这种链上机制是合理的,但并不完善。

另外,由于仅处理最后两个epoch的证明,该机制还引入了网络同步假设(etwork synchrony assumption),假设证明在两个epoch的时间内广播到全网。

链上FFG机制规范 十分简单:

  • **第一步要检查区块合理性。**采用最后两个epoch的新证明来检查它们的边界区块是否合理。
  • **下一步要检查区块最终确定性,**检查对象是最后两个epoch的边界区块。仅对四组来源区块-目标区块对进行最终确定性检查,以求提高性能和简化规范。

**此图展示最终确定性检查涉及的检查点,** 黄色区块为已证明状态,红色区块为已最终确定区块

分叉选择与验证者计划

尽管Casper FFG机制对区块最终确定保证规则进行了概述,但并未提及在实践中如何保证网络活性。 (注意:本文并非试图证明网络活性,而是概述有望保证活性的过程。相关严谨分析,请参阅 此文 。)

本文这部分将重点关注两个主要的活性相关因素:

  • 验证者用来查找区块链头所执行的分叉选择规则
  • 验证者遵循的区块生成与证明计划

HLMD GHOST 分叉选择规则

提议区块的验证者首先必须找到本地区块链头,为此,他们要遵循Hybrid Latest Message Driven (HMLD)GHOST作为分叉选择规则。

分叉选择规范 如下:

  1. 在每个epoch开始的时候,验证者确定当前视图下的最新已证明区块。这一变量会在该epoch内被冻结,并在下一个epoch开始时再次更新。
  2. 筛选并排除出没有把步骤1确定的已证明区块作为此区块链中最新已证明区块的区块。
  3. 遵循 一般LMD GHOST规则 ,由上至下遍历区块树,直到找到叶节点为止。

分叉选择的更多相关信息,请参见 此文 的“Hybrid HLMD GHOST”部分。

验证者计划

每个验证者对网络负有两大主要责任:提议新区块和在其本地视图中证明最佳区块,为此制定了验证者计划,以防止产生混乱和简化网络中的消息传递。 此计划由每个验证者利用从当前信标链状态获取的随机性计算而得 ,以免攻击者支配验证者计划。

提议计划(Proposal Schedule):**在每个epoch中的每个slot, 都会有一位验证者被分配为提议者 。**该验证者遵循分叉选择规则在区块树的本地视图中找到链头,并为该链头生成一个新的子块。验证者将其见到的证明打包到区块中并获取奖励。当进行最终确定性检查时,这些证明将输入到链上FFG机制。

证明计划(Attestation Schedule):**每个epoch中的每个slot中的每个验证者都要生成证明。**实际上,对于每个epoch,整个验证者集被随机划分为SLOTS_PER_EPOCH个等同大小的委员会,这些委员分别被分配到一个特定的slot,然后生成证明。在生成证明时,验证者将根据其本地视图,以最后一个已证明区块作为来源区块,以链头后的最新检查点作为目标区块。

验证者计划的更多相关信息,请参阅Eth2.0规范中的 验证者指南

来源 | adiasg.me 作者 | Aditya Asgaonkar 感谢Danny Ryan与笔者共同讨论及审阅文章。