这篇文章上次修改于 625 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

1 Proof of Stake

1.1 什么是 POS

构成共识机制的基础,区块链使用这些机制实现分布式共识。验证者将 ETH 质押到智能合约中,如果失信或消极怠工,则罚没质押。验证者检查新区块是否有效,有时候自己也会创建新区块。

1.2 验证者

在 deposit 合约中质押 32 ETH,运行三个独立的软件:execution,consensus,validator。

质押 ETH 后,可以从 peer 收到新的区块。验证者可以向该区块投票(称为认证)。

太坊中的时间分为 slot(12 秒)和 epoch(32 个 slot)。在每个 slot 中会随机从验证者中选一位区块提议者,创建新区块并发给其他节点。还会随机选择一个验证者委员会,对提议区块进行投票。

1.3 一笔交易时如何执行的

  1. 用户签名交易。交易中的小费支付给验证者。
  2. 交易被提交到 execution client,以验证其合法性。
  3. 如果交易合法,execution client 将其添加到自己的 local mempool,并广播。当其它节点收到交易后,也会添加到自己的 local mempool。
  4. 某个节点是区块提议者,该节点负责创建并广播新区块,更新全局状态。该节点由三个 client 组成:execution,consensus,validator。execution client 将交易从 local mempool 打包到 “execution payload” 并在本地执行,生成新状态,然后传到 consensus client。在 consensus client 中,execution payload 会被包装为 “beacon block”,其中还保护了奖励、惩罚、罚没、验证等信息,以使得对区块达成共识。execution 和 consensus client 之间的通信细节见 Connecting the Consensus and Execution Clients
  5. 其它节点收到新的 beacon block。将其传到 execution client 并重新执行,以确保其状态合法。validator client 会验证区块是合法的,认为应该是下一个块,将其添加到本地数据库。
  6. 交易被认为是“最终确定的“,即,已成为两个 checkpoint 间”绝大多数链“的一部分,不会再被回滚。checkpoint 出现在每个 epoch 的开始,并且拥有多数链,必须得到网络上总质押 ETH 66% 的证明。

1.4 最终确定性

该交易是区块的一部分且无法改变,除非燃烧掉大量以太币。通过 checkpoint 管理确定性。每个 epoch 的第一个区块是 checkpoint。验证者为认为是合法的 checkpoints pair 投票。 如果一对 checkpoint 获得了质押以太币总数中三分之二以上的投票,那么这对检查点将被升级为”finalized“状态,其中较新的一个成为”justified“状态,较旧的本身就是“justified”状态。如果回滚确定的区块,攻击者至少会损失质押 ETH 的三分之一。因为最终确定性至少需要三分之二的投票,如果攻击者使用至少三分之一的质押总数阻止实现最终确定性,会触发怠惰惩罚。当超过 4 个 epoch 还没有确定,该项机制会罚没与多数投票不同的验证者的质押。

1.5 加密经济的安全性

验证者可以获得奖励,质押余额增加,也会因为因为不当行为而受到惩罚。如果未参与验证,或错过奖励;如果有不诚实行为,质押会被销毁。不诚实的行为有主要有两种:在一个 slot 钟提出多个块和提交相互矛盾的认证。罚没的 ETH 金额与大致同一时间受到罚没的验证者数量相关,被称为“相关惩罚”。相关惩罚可以是轻微的,也可以说比较重的。该惩罚在强制退出期执行,第 1 天是立即处罚,第 18 天使相关惩罚,第 36 天逐出网络。如果验证者不投票,每天都会受到轻微的认证惩罚。这些措施都提高了协同攻击的代价。

1.6 分叉选择

当由于网络延迟或区块提议者提议了多个块时,可能会分叉。consensus client 会通过 LMD-GHOST 算法来确定支持哪个块。它的工作原理是确定其历史记录中具有最大证明权重的分叉。

1.7 权益证明和安全性

同 PoW 一样,PoS 也存在 51% 攻击,但攻击风险更大。攻击者需要获得 51% ETH,然后自己认证所选的分叉有最多累积认证。但 PoS 的优势在于,社区可以灵活地发动反击。

2 Gasper

Gasper 是友好的最终确定性工具 Gasper (Casper-FFG) 和 LMD-GHOST 分叉选择算法的组合。

Gasper 是一种定义验证者如何受到奖惩的机制,决定要接受和拒绝哪个区块,以及将区块建在哪个区块链分叉上。

2.1 什么是最终确定性?

区块必须完成“两步”升级流程才能最终确定下来。

  1. 区块必须获得总质押 ETH 2/3 的投票,才可升级为”justified“状态,该状态不太可能被回滚。
  2. 当一个”justified“区块上有另一个”justified“区块是,前者被升级为”finalized“状态,除非攻击者销毁数百万以太币(几十亿美元),否则该区块不会回滚。

只有 checkpoint(位于 epoch 边界的区块)才会被升级。升级需要一对”checkpoint“,两个连续的 checkpoint 之间必须存在”绝对多数链“,才能将较旧的 checkpoint 升级为”finalized“,而较新的区块升级为”justified“。

如果攻击者想要创建另一条 finalized 链,必须满足:

  1. 拥有或控制总质押以太币的 2/3。
  2. 至少销毁总质押以太币的 1/3。

第二个条件是因为,如果总质押到 2/3 同时支持两个分叉,必然有 1/3 对两个分叉都进行了投票,而双重投票会受到惩罚。Gasper 中用来合理化和最终确定区块的算法是友好的最终确定性工具 Casper (Casper-FFG) 的微调版。

2.2 激励和罚没

当验证者诚实地提议和验证区块时,会受到奖励,奖励会被加到质押额。另一方面,缺席和调用时未能响应的验证者会错过奖励,有时还会损失一部分现有质押。通常,离线的惩罚较小,大多数情况下仅仅是错失奖励。但如何出现恶意行为,比如在同一个 slot 提议多个区块或验证多个区块,或者与之前的 checkpoint 投票相反,会受到更严里的“可罚没”行为,验证者的部分质押会遭到销毁,甚至被移出验证者网络。整个过程需要 36 天,第一天进行最高 0.5 ETH 的初次罚款。随后,被罚没验证者的以太币将在退出期一点点耗尽,但到第 18 天,他们会受到一个“相关惩罚”,即当更多的验证者都在大致相同的时间受罚时,惩罚将更重。 最大的惩罚是永久质押。 这些奖励和惩罚可以激励诚实的验证者和打击网络攻击。

2.3 不作为惩罚

如果链未能在四个 epoch 内最终确定,便会激活“不作为惩罚”。 对于未能积极证明主链的验证者,其质押货币将逐渐耗尽,直到主链重新获得总质押 2/3 的投票,这确保了活性失败只是暂时的。

2.4 分叉选择

LMD-GHOST 分叉选择算法:选择具有最大累积验证权重的分叉作为权威分叉(最贪婪、最重的子树);如果从验证者那里收到多条消息,则只考虑最新的那个(最新消息驱动)。 在将最重的区块添加到权威链之前,每位验证者都会使用这个规则来评估每个区块。

3 弱主观性

主观性是指依赖社会信息对当前状态达成一致,会有多个有效分叉供选择。客观性是只能有一个有效链,必须应用编码规则才能使所有节点达成一致。弱主观性是指获得初始化主观信息种子后,可以客观进展的链。

3.1 弱主观性解决了哪些问题?

主观性是 PoS 链固有的,因为需要从多个分叉中通过计算历史投票来做出正确选择。这会给区块链带来多种攻击,比如长程攻击:早期参与链的节点维护一个替代分叉以获得利益。如果 33% 的验证者取出质押,但仍然继续证明和生产区块,可能会生成一个替代分叉。而新的节点或长时间离线的节点不知道这些攻击者已经取出来资金,从而被诱骗跟随不正确的链。以太坊可以通过限制解决这些攻击,将主观(信任假设)降到最低。

3.2 弱主观性检查点

弱主观性检查点是一些状态根,所有的节点都同意其加入规范链。分叉选择算法相信该检查点中确定的区块链状态是正确的,并且会独立和客观地验证从该点开始的区块链。 检查点起到了"回滚限制"的作用,因为位于弱主观性检查点之前的区块不能改变。为了避免长程攻击,应确保弱检查点之间的距离小于验证者的撤款期,这样就就可以让验证者在撤款前被罚没一部分金额,新的参与者也不会被那些已经撤款的验证者欺骗到不正确的分支。

3.3 弱主观性检查点和最终确定区块的区别

最终确定的区块和弱主观性检查点在以太坊节点中被不同对待。当一个节点看到两个不同的最终确定的区块,无法识别哪个是规范分支,表明共识失败。相比之下,一个节点只需拒绝与弱主观性检查点冲突的任何区块即可。从节点的角度,弱主观性检查点代表了一种无法被同行新知识所破坏的绝对整理。

3.4 多弱为弱?

以太坊的 PoS 主观方面要求从可新来源获得最新状态(弱主观性检查点)。获得弱主观性检查点的风险很低,因为可以从多个获取来源交叉检查。不过,运行任何软件都需要一定的信任,比如,相信软件开发人员开发了诚实的软件。

一个弱主观性检查点甚至可以成为客户端软件的一部分。攻击者可以像破坏软件一样破坏检查点本身,该问题无解。但在以太坊中,不可信开发者的影响降到了最低,因为客户端团队较多,各个团队采用的语言也不同,他们都是维护诚信链到既得利益者。

最后,可以从其他节点请求检查点;也许另一个以太坊用户会运行一个全节点来提供检查点,然后验证者可以根据区块浏览器的数据进行验证。不过,信任弱主观性检查点的提供者和信任客户端开发人员有着相同的信任问题。但是,只要在多数验证者密谋生成另一个区块链分叉这种不太可能的情况下才需要考虑这些。

4 验证

验证者在每个 epoch 都会创建、签名和广播证明。

4.1 什么是验证

每个 epoch 验证者都会提议一个验证。验证针对 epoch 中的特定 slot。验证的目的是投票以支持验证者对的链观点,尤其是最近被 justified 的块和当前 epoch 的第一个块(即 source 和 target 检查点)。参与验证的信息会被合并,以达成对于区块链的共识。

验证包含如下部分:

  • aggregation_bits:一个 bit 列表,下标映射了验证者在委员会中的位置;值(0/1)表明验证者是否签名 data(比如是否活跃并同意区块提议)。
  • signature:BLS 签名,聚合了所有独立验证者的签名。
  • data

    • slot
    • index:表明验证者属于哪个委员会
    • beacon_block_root:验证者在链头看到的块的根哈希(应用分叉选择算法后的结果)
    • source:最终性投票的一部分,表示验证者认为最近 justified 的区块。
    • target:最终性投票的一部分,表示验证器认为当前 epoch 中的第一个区块。

一旦 data 构建完成,验证者就可以将 aggregation_bits 中对应自身索引的比特从 0 改为 1,以显示参与。

最后,验证者会签名验证并广播。

4.2 聚合验证

对于每个验证者来说,将数据传到网络中的开销都比较大。因此,同一个子网中的验证在广播之前会被聚合。这样广播的验证中就会包含共识数据和所有同意该数据都验证者的签名聚合而形成的单个签名。这可以通 aggregation_bits 进行检查,因为它提供了每个验证者在委员会中的索引,可以用来查询单个签名。

在每个 epoch 中,每个子网中会选出一个验证者作为 aggregator。aggregator 会收集所有与自身 data 相等的签名。每个匹配的验证会被记录在 aggregation_bits 中。aggregator 会广播聚合后的验证。

当一个验证者当选为区块提议者后,他会将聚合验证打包到区块中。

4.3 验证包含生命周期

  1. 生成
  2. 广播
  3. 聚合
  4. 广播
  5. 包含在链中

4.4 奖励

验证者会因提交验证而受到奖励。验证奖励取决于两个变量,base rewardinclusion delay。最好的情况下,inclusion delay 是 1。

attestation reward = 7/8 x base reward x (1/inclusion delay)

base reward

基本奖励根据验证者数量和起8有效质押金额计算:

base reward = validator effective balance x 2^6 / SQRT(Effective balance of all active validators)

inclusion delay

在验证者投票选出链头(块 n)的时候,块 n+1 还没有被提出。因此,验证会包含在下一个区块中,所以所有对块 n 进行链头投票的验证都包含在了块 n+1 中,并且延迟时间为 1 个区块。如果延迟时间增加到两个 slot,则验证奖励减半,因为验证奖励是基础奖励乘以延迟时间的倒数。

4.5 验证场景

缺失投票

验证者有最多 1 个 epoch 的时间提交验证。如果在 epoch 0 缺失了验证,可以 epoch 1 中提交延迟验证。

缺失聚合

每个 epoch 总共有 16 个聚合器。此外,随机验证者订阅两个子网,为 256 个 epoch 提供备份,以防缺少聚合器。

缺失块提议者

如果块提议者缺失,下一个区块提议者将捡取聚合的证明并将其包含到下一个区块中。但是,inclusion delay 会加一。

5 奖励与惩罚

节点通过质押 ETH 到合约中来参与到区块验证和确定链头。他们通过运行验证软件来检查从 p2p 网络收到的块的合法性并应用分叉算法确定链头来获得奖励。

验证者有两个主要职责:1)检查新区块并当其合法时给出证明;2)当被从验证者池中随机选中时,提议新区块。如果没有履行这些职责,会失去奖励。验证者有时候也会聚合签名和参与同步委员会。

有时候会出现一些恶意行为,比如在一个 slot 中提议多个区块或证明多个区块。这会导致验证者在被移除网络前罚没一些 ETH(最多 1 ETH),该过程耗时 36 天。被罚的验证者的 ETH 会在退出期间一点点被消耗,但是第 18 天会收到“相关惩罚”,更多的验证者在同一时间被罚没。这些措施确保了奖励诚实者并惩罚恶意者。

一个 epoch 中只惩罚和奖励一次。

5.1 奖励和惩罚

5.1.2 奖励

在提议区块或参与同步委员会时,验证者会因和其他多数验证者投票一致时受到奖励。每个 epoch 的奖励值都从 base_reward 计算而得。这是用于其他奖励计算的基本单位。base_reward 代表了验证者每个 epoch 中在最好条件下收到的平均奖励。通过验证者的有效金额和总活跃验证者数量计算而得:

base_reward = effective_balance * (base_reward_factor / (base_rewards_per_epoch * sqrt(sum(active_balance))))

base_reward_factor 是 64,base_rewards_per_epoch 是 4,sum(active balance) 是所有活跃验证者的总质押 ETH。

总奖励是由五个组成部分的加权和计算而来:

1. source vote: 验证者及时为正确的 source checkpoint 进行了投票
2. target vote: 验证者及时为正确的 target checkpoint 进行了投票
3. head vote: 验证者已及时为正确的头块进行了投票
4. sync committee reward: 验证者参与了同步委员会
5. proposer reward: 验证者在正确的 slot 内提出了一个区块

权重如下:

TIMELY_SOURCE_WEIGHT    uint64(14)
TIMELY_TARGET_WEIGHT    uint64(26)
TIMELY_HEAD_WEIGHT  uint64(14)
SYNC_REWARD_WEIGHT  uint64(2)
PROPOSER_WEIGHT uint64(8)

权重总和为 64。一个及时进行 source、target 和 head 投票、提出区块并参与委员会的验证者可获得 64/64 * base_reward == base_reward。然而,一个验证者通常不是区块提议者,所以他的最大奖励是 64-8 /64 * base_reward == 7/8 * base_reward。如果验证者既不是区块提议着也没有参与同步委员会,则收到 64-8-2 / 64 * base_reward == 6.75/8 * base_reward

为了激励快速认证,额外的奖励被添加进来。这个奖励叫做 inclusion_delay_reward。它的价值等于 base_reward 乘以 1/delay,其中 delay 是区块提议和认证之间隔开的 slot 数量。例如,如果认证在区块提议后一个 slot 内提交,则认证者将获得 base_reward 1/1 == base_reward 的奖励。如果认证在下一个 slot 中到达,则认证者将获得 base_reward 1/2 的奖励,依此类推。

当有效的见证被包含在区块中时,区块提议者会获得 8/64 * base_reward,因此奖励的实际价值与见证验证者数量有关。如果区块提议者在其提议区块中包含了其他验证者不当行为的证据,还会获得额外奖励slashed_validators_effective_balance / 512

5.1.3 惩罚

如果没有 target 和 source 投票,惩罚值等于奖励值,意味着从余额扣除与奖励等额的值。但如果没有 head 投票则不会受到惩罚。未能提议区块也不会被惩罚。

5.2 罚没

罚没会导致验证者退网并损失质押的 ETH。有如下三种行为会导致罚没,均与不诚实地提议和证明区块有关:

  • 在同一 slot 中提议并签名两个不同的区块
  • 证明一个区块包含另一个区块(有效改变历史)
  • 为同一个区块的两个候选者进行双重投票

如果以上行为发生,验证者会被罚没。意味着 1/32 的质押(最多 1 ETH)会被燃烧,然后是 36 天的驱逐期。驱逐期间,验证者的质押会被逐渐消耗。在中期(18 天),会有额外的相关性惩罚,大小与前 36 天中所有被罚没的验证者的质押总额成正比。这意味着如果有更多的验证者被罚没时,罚没幅度会增加,甚至导致失去全部质押。

5.3 不活跃惩罚

如果超过 4 个 epoch 还没有确定,则触发不活跃惩罚。这时意味着超过 1/3 总数的验证者离线或未能提交正确的证明,以至于无法获得超过 2/3 的投票。不活跃验证者的质押会逐渐流失,直达他们的总质押少于 1/3,从而允许剩余的活跃验证者确定链。不活跃验证者池有多大,剩下的活跃验证者最终将控制超过2/3 的股份。失去质押是激励不活跃的验证者尽快重新激活的强有力动因!在 Medalla 测试网上遇到了一种不活跃场景,当 <66% 的活跃验证者能够就当前区块链头达成共识时。该不活跃惩罚被激活并最终恢复了确定性!

6 攻击和防御

6.1 攻击者想要什么

攻击者目的:reorg,double finality 或 finality delay

regog:将区块重新排列成新的顺序。恶意的重组可能会确保特定的区块被包含或排除,从而允许双重支付或通过前向和后向运行交易(MEV)进行价值提取。重组也可以用于防止某些交易被包括在规范链中。最极端的重组形式是“finality reversion”,当摧毁总抵押以太币的三分之一以上时发生。

double finality:不太可能发生但有很严重的情况,即两个分叉同时完成,从而在链中创建永久性裂痕。理论上,攻击者可通过总质押到 34% 实现。社区将被迫在链下协调来同意遵循哪条链,这需要社交层面的力量。

finality delay:该攻击的目标可能只是为了破坏以太坊,而不是直接获利。

6.2 攻击方式

6.2.1 L0 攻击

L0 是社交层,是构建以太坊的基础。一些攻击例子包括:

  • 错误的信息宣传
  • 恐吓开发者社区
  • 过度热衷的监管
  • 有知识但恶意的人渗透到开发者社区中
  • 行贿以影响以太坊生态系统中的关键人物

这些攻击可能不需要资本或技术知识。

防御第 0 层攻击可能并不简单,但可以建立一些基本原则。其中一个是通过博客、Discord 服务器、注释规范、书籍、播客和 Youtube 等由社区诚实成员创建和传播的以太坊公共信息维持整体高信噪比。在这里,我们努力维护准确的信息,并将其翻译成尽可能多的语言。用高质量的信息和模因淹没空间是对错误信息的有效防御。

另一个重要的防御社交层攻击的措施是明确的使命宣言和治理协议。以太坊看重 L1 的去中心化和安全性,同时高度重视可扩展性和可持续性。无论以太坊社区出现什么分歧,这些核心原则都应尽量不妥协。通过 EIP(以太坊改进提案)过程中连续几轮审查来检验这些原则,可能有助于社区区分好人与坏人,并限制恶意行为者影响以太坊未来方向的范围。

最后,至关重要的是以太坊社区保持开放和欢迎所有参与者。

6.2.2 攻击协议

发起攻击的一种方法是累积更大比例的总质押,然后使用它来否决诚实验证者。但是,大多数攻击者将无法累积足够数量的以太币进行此类攻击,因此他们必须使用微妙技术来操纵诚实多数人采取某种方式行动。

从根本上讲,所有小规模攻击都是两种验证者不当行为造成:低活跃度(未能或过晚证明/提议)或高活跃度(在一个 slot 中提议/证明太多次)。这些行为很容易被分叉选择算法和激励层处理,但攻击者有聪明的方法来玩弄系统以获得优势。

6.2.3 使用少量 ETH 的攻击

Reorg

Neuder et al 2020 展示了一种重组攻击。验证者在 slot n+1 创建并证明了块 B,但是不广播。一个诚实的验证者在 slot n+2 提议了块 C。与此同时,攻击者发布其扣留的块 B,并将用于 slot n+2 的票投给块 B,从而否认了块 C。当发布诚实区块 D 时,分叉选择算法认为应该将 D 建立在 B 上而不是 C 上。结果,攻击者用 1 个预先重组块删除了 C 块。Neuder 等人在 2020 年描述了该攻击需要 30% 的股份才能生效,但后来证明只需总股份的 2%。

Balancing attack

一种更为复杂的攻击可以将诚实验证者集分成不同的组,这些组对链头看法不同,这被称为平衡攻击。攻击者会等待机会提出两个块,将一个块发给验证者集合的一半,另一个块发给验证者集合的另一半。分叉选择算法检测到这种矛盾后,将区块提议者驱逐出去,但这两个块仍然存在,且约一半的验证者对每个分支进行认证。同时,剩余的恶意验证者保留其认证,在分叉算法执行时,有选择地向倾向其中一个分支。这可以无限期地继续下去,攻击性验证器在两个分支之间保持着平衡状态。由于没有任何一条链能够吸引 2/3 以上多数派,则链不会完成最终化。

Bouncing attacks

验证者扣留投票,在适当的时候用这些投票来回验证两个分支的 checkpoint,使得难以出现一对 source 和 target checkpoint,从而阻止了链的最终确定。

弹跳攻击和平衡攻击都依赖于攻击者在网络中具有非常精细的消息时间控制。虽然不太可能发生,但协议中还是建立了防御,即及时消息拥有更高的权重,被称为提议人权重提升(proposer-weight boosting)。为了防御弹跳攻击,分叉算法进行了更新,这样最新的检查点只有在每个 epoch 的前 1/3 slot 可以切换到另一条链。这可以防止攻击者保留选票 -- 分叉算法会选择前 1/3 epoch 的 checkpoint,此时多数诚实验证者已经投票。

以上措施创建一个场景,当诚实提议者在 slot 开始后快速发出一个块,在大约 1/3 slot(4s)内,分叉选择算法可能会选择该块,从而切换到新链。在截止时间前,靠后的证明权重低。这有利于区块的快速提议和验证,并大大降低弹跳攻击和平衡攻击的可能性。

需注意,提议者权重提升(proposer-weight boosting)方案只能抵御“廉价重组”攻击,即攻击者以少量质押权益进行的重组攻击。事实上,在另一种事前重组攻击中,提议者权重提升方案本身可能被更大的质押者玩弄。这篇文章描述了控制 7% 质押权益的攻击者如何通过有策略地投票,以欺骗诚实验证者去投票他们的分支,重组掉一个诚实块。这种攻击是假设了不太可能的延迟,攻击成功的概率仍然较低,因为高利益意味着高风险,更大的经济压力会阻止该攻击行为。

Balancing attack specifically targeting the LMD rule

还有人提出了一种专门针对 LMD 规则的平衡攻击,尽管有了提议者权重提升(proposer-weight boosting)方案,这种攻击仍被认为是可行的。攻击者通过模糊他们的区块提议,并将每个区块传播到大约一半的网络来建立两条竞争链,从而在分叉之间建立近似平衡。然后,勾结的验证者会模棱两可地投票,以使一半的网络首先收到它们对分叉 A 的投票,而另一半网络首先收到它们对分叉 B 的投票。由于 LMD 规则只为每个验证者保留第一个证明,因此一半的网络只看到对 A 的投票,另一半网络只看到对 B 的投票。作者描述 LMD 规则给予了对手“显著的力量”来发动平衡攻击。

这种 LMD 攻击 已通过更新分叉选择算法关闭了,分叉选择算法会丢弃模糊的验证者。

Avalanche attacks

2022 年 3 月的一篇论文描述了另一种称为雪崩攻击(avalanche attacks的攻击类型。攻击者需要控制多个连续的块提议者。在每个块提议 slot,攻击者都保留块,直到诚实链与扣留区块的 subtree 子树权重相等,然后释放这些区块,以造成最大程度的混乱。这篇论文的作者认为,提议者权重提升(proposer-weight boosting)方案无法防止雪崩攻击的某些变体。然而,论文也只展示了对没有使用 LMD-GHOST 分叉选择算法版本的攻击。

雪崩攻击可由 LMD-GHOST 分叉选择算法的 LMD 部分缓解。 LMD 表示“最新消息驱动”,它指的是每个验证器保存的包含来自其他验证器接收到的最新消息的。每个 slot 中,共识客户端使用来自每个验证器最先到达的消息,并且丢弃相互矛盾的消息,以防止雪崩攻击。

有几个潜在的未来升级可以增加提议者权重的安全性。其中之一是视图合并,即在 slot 开始前 n 秒冻结验证者对分叉选择的观点,然后提议者将视图同步到整个网络。另一个潜在的升级是 single-slot finality,它通过在仅在一个 slot 后确定链来防止基于消息时间的攻击。

Finality Delay

同一篇论文首次描述了低成本的单块重组攻击,也描述了一种最终性延迟(又称“活力失效”)攻击。攻击者需要成为 epoch 边界块的提议人,这很重要,因为这些 epoch 边界块会成为 Casper FFG 用于完成链的检查点。攻击者只需保留他们的区块,直到足够多的诚实验证者使用他们的 FFG 投票支持前一个 epoch 边界的块成为当前的最终化目标。然后攻击者释放并证明保留的块,从而与其余诚实验证者创建具有不同目标 checkpoint 的分叉。如果时机恰当,会导致最终性延迟,因为任何一个分叉都不会获得 2/3 的投票。质押越小,越需要把控好时机,因为攻击者控制的证明较少,控制提出给定 epoch 边界块提议人的几率较低。

Long range attacks

还有一种特定于 PoS 的攻击,参与创世块的验证者会维护一个独立于诚实链的分支,并最终说服诚实验证者在某个时机切换过去。这不会发生在 ETH,因为确定性工具会确保所有的验证者定期(checkpoint)同意诚实链的状态。这个简单机制中和了长程攻击者,因为 ETH 客户端不会重组已完成的块。新节点会找到一个可信的最近状态哈希(weak subjectivity checkpoint),在其上构建区块。

Denial of Service

下一个 slot 的区块提议者会通过某种算法事先选好,这样攻击者可以向该区块提议者发送垃圾邮件,防止他们与其它节点交流。实施单秘密领导人选举(SSLE)或非单秘密领导人选举将减轻 DoS风险,因为只有区块建议人知道他们已被选中,并且选择无法事先确定。尽管还没有实现,但研究和发展比较活跃。

6.2.4 攻击者使用总质押的 >=33%

当攻击者有了足够多的质押时,本文之前提到的攻击都有可能实现,因此攻击者希望掌握尽可能的质押。

33% 是一个基准,攻击者不需要太精细地控制其它验证者,只需要集体消失即可,这样链就不会受到超过 2/3 的多数票,从而无法完成。这种攻击会触发消极惩罚(inactivity leak),那些未能证明或证明与大多数人相反的验证者拥有的质押 ETH 会逐渐流失,直到最终所占总数的比例不到 1/3,这样区块链才能再次完成最终确定。即便不惩罚,33% 的质押不再活跃代价也比较大。

假设 ETH 网络上异步的(消息的发送和接收之间有延迟),一个控制了 34% 总质押的攻击者可能会造成双重确定性。当攻击者被选为块提议者时,可以与其掌握的验证者进行双重投票,导致每个分叉都有 34% 的投票,每个分叉只需要剩余验证者投票的 50% 就可以获得多数投票。在这种情况下,两条链都可以最终确定(因为 34% 的攻击者验证器 + 剩余 66% 的一半 = 每个分叉 67%)。不过这需要攻击者在某种程度上控制消息在网络上的传播时间。这也是为什么这种攻击需要网络异步的原因——如果所有节点都立即收到消息,它们将立即知道这两个区块,并拒绝较早接收的区块。攻击者必须付出 34% 质押被销毁的代价才能实施这种攻击,因为双重投票会导致相关性惩罚。对于这种攻击,社区需要在带外协商遵循哪个分支。

6.2.5 攻击者使用总质押的 ~50%

理论上,在一个恶意验证者控制的质押 ETH 比例达到 50% 的情况下,他可以将以太坊区块链分裂成两个大小相等的分叉。四个 epoch 后,两个分叉都会触发消极惩罚(inactivity leak)。这种情况只能靠社区恢复。但考虑到诚实验证者的数量,50% 的攻击成本,这种攻击不太可能发生。

如果攻击者的质押达到 51%,则其可以控制分叉选择算法,选择对自己有利的分叉。但成本太大,且社交层可能会介入,并采用诚实的少数派分叉,从而使攻击者的质押权益大幅贬值。

6.2.6 攻击者使用总质押的 >=66%

这种情况攻击者不仅可以控制未来,还可以改变过去。当前控制 66% ETH 质押权益的成本约为 250 亿美元,这里唯一的防御措施是退回到社交层来协调采用替代分叉。

6.3 社区:最后防线

治理已经是一个复杂的话题,而对于以太坊社区来说,对不诚实的最终链进行第 0 层紧急响应无疑会是一个挑战,但在以太坊的历史上,这已经发生了两次‌。最终,即使我们拥有如此惊人的技术堆栈,如果最坏的情况发生,社区的参与者也必须协调出一条出路。

6.4 总结

  1. 33%:延迟最终性
  2. 34%:导致双重最终性
  3. 51%:审查,控制区块链的未来
  4. 66%:审查,控制区块链的过去与未来

7 密钥

新密钥使用 Boneh-Lyn-Shacham (BLS) 签名模式。BLS 可以实现非常高效的签名聚合,但也允许逆向获得每个验证器密钥,并且非常适用于管理验证者之间的操作。

在 PoS 中,希望成为独立质押者的用户还需要一个 validator key 和一个 withdrawal key。

8 区块提议者

8.1 谁生成区块

将验证软件作为 execution 和 consensus 客户端的节点需要在合约中质押至少 32 ETH。但是每个验证者只是有可能提议区块。ETH 用 slot 和 epoch 衡量时间,每个 slot 是 12s,32 个 slot (6.4 minutes)组成一个 epoch。每个 slot 都是添加新区块的机会。

随机选择

使用 RANDAO 算法伪随机选择一个验证者来提议区块,该算法将区块提议者的哈希与每个区块更新的种子混合在一起。验证者选择过程会提前 4 个 epoch,以避免某些 seed 操纵攻击。

全局 RANDAO 值仅在每个 epoch 更新一次。为了计算下一个块提议者的下标,需要将 RANDAO 值与 slot 值混合在一起,以便在每个 slot 中得到唯一值。验证者被选中的概率是其有效 ETH 余额加权的。最大有效余额为 32 ETH(这意味着余额 <32 ETH 会导致比余额 == 32 ETH 更低的权重,但余额 >32 ETH 并不会导致比余额 == 32 ETH 更高的加权)。

每个 slot 只随机选择一个区块提议者。正常情况下,区块提议者会在该 slot 中创建并发布一个块,如果创建了两个块会受到惩罚。

8.2 如何生成区块

区块提议者应该广播一个已签名对块,该块建立在根据自己本地运行的分叉选择算法所选链的头部。分叉选择算法应用前一个 slot 中排队的证明后,会找到具有最大累积权重证明历史记录的区块,该块是新块的父级。

区块提议者通过从其本地数据库和链视图中收集数据来创建一个区块。 区块的内容如下所示:

class BeaconBlockBody(Container):
    randao_reveal: BLSSignature
    eth1_data: Eth1Data
    graffiti: Bytes32
    proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS]
    attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS]
    attestations: List[Attestation, MAX_ATTESTATIONS]
    deposits: List[Deposit, MAX_DEPOSITS]
    voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS]
    sync_aggregate: SyncAggregate
    execution_payload: ExecutionPayload
  • randao_reveal 区块提议者通过将其自己的熵添加到先前区块累积的 RANDAO 值中,创建一个可验证的随机值来填充字段。
  • eth1_data 是投票,表示区块提议者对存款合约观点,包括存款 Merkle 树的根和存款总额。
  • graffiti 是可选字段,可以用来向块中添加消息。
  • proposer_slashingsattester_slashings 包含了某些验证者提交的关于可被惩罚当违规行的 proof。
  • deposits 是区块提议者所知道的新验证者押金列表。
  • voluntary_exits 是区块提议者从共识 gossip 网络中听到的验证者退出列表。
  • sync_aggregate 是一个向量,是之前分配给同步委员会(一组用于提供轻客户端数据的验证者子集)并参与签署数据的验证者。
  • execution_payload 使交易信息能够在 execution 客户端和 consensus 客户端之间传递。是嵌套在块内的执行数据。execution 客户端可以访问本地交易池,该池包含在 gossip 网络中了解到的交易。这些交易在本地执行,以生成一个称为后状态(post-state)的更新状态 trie。这些交易作为名为“transactions”的列表包含在 execution_payload 中,并且后状态在 state-root 字段中提供。

8.3 这个块发生了什么

块会被添加到区块提议者的本地数据库,并被广播。当一个验证者收到该块,会验证其数据,包括该块是否有正确的父块,对应于正确的 slot,提议者索引是否正确,RANDAO 是否有效以及提议者未被罚没。execution_payload 被拆分,验证者的 execution 客户端会重新执行块中的交易并检查状态变更。如果块通过了这些检查,每个验证者会将其添加到自己的规范链中。然后在下个 slot 中再开启该过程。

8.4 块奖励

区块提议者会因工作而受到奖励。base_reward 根据活跃验证者数量和其有效余额算出。当每个合法证明被包含在块中时,区块提议者会收到一部分 base_reward;块的验证者越多,区块提议者收到的奖励越大。举报应该被罚没的验证者也会收到奖励,等于每个被罚没验证者的 1/512 * effective balance

9 FAQ

9.1 什么是节点、客户端和验证器?

节点是连接到以太坊网络的计算机。这些计算机运行了客户端就会成为节点。有两种类型的客户端:execution 客户端和 consensus 客户端。这两种在创建节点时都是必需的。验证器是 consensus 客户端可选的附加组件,使得节点能参与 PoS 共识。要运行验证器,节点操作员必须将 32 个 ET H存入存款合约中。

9.2 以太坊中的 PoS 有什么特别之处?

以太坊中的权益证明机制被称为“Casper”。 Casper 定义了如何选择验证者来提出区块,何时进行认证,如何计算认证、给予验证者奖励和惩罚、削减条件、失效保护机制(例如不活动泄漏)以及“终局”条件。

以太坊的 PoS 还使用了一种独有的分叉选择算法,称为 LMD-GHOST。LMD-GHOST 选择具有最大“权重”的那个分叉。 权重是验证者的有效余额加权的见证数量。

9.3 富人在 PoS 中是否会变得更加富有吗?

质押的 ETH 越多,就可以运行越多的验证器,获得奖励越多。奖励与抵押的 ETH 数量成线性比例,每个人可获得相同百分比的回报。PoW 比 PoS 更加让富人受益,因为购买大规模硬件的富有矿工从规模经济中获得了好处。