淘汰表现不佳者

lido__ 发布于 2024-07-31 阅读 10

该提案针对以太坊社区质押模块(CSM)中验证者长期低效运行的问题,提出在不改变现有简单债券和性能预言机单阈值机制的基础上,新增『三振出局』惩罚措施:验证者在6个周期内若3次未达到性能阈值,将被EIP-7002强制退出,同时根据框架内错失的网络收益计算『性能税』并从其stETH债券中扣除。提案还讨论了两种性能税计算方式、如何用strikes系统替代CL余额阈值、具体算法实现(如验证者键索引匹配)、以及提前退出等边缘情况的应对。该方案力求在保留CSM社会化与性能宽容度的同时,提升模块的规模化和资本效率。

正如 Izzy 多次提到的:“拥有不可触及的 bond rebase 在规模上是不可持续的。”说实话,这一点很难反驳。目前,这个问题或许可以通过 in-protocol bonds 解决。鉴于 in-protocol bonds 在一年左右的时间内无法实现,因此提出了一种替代方案。

Max 的推理:

打开规模化的可能性需要一些技术,来激励 NO

  • 表现良好(而不必追求达到最大可能水平)
  • 如果某个 NO 无法达到可接受的性能水平,则自行离开 / 或被移出模块

虽然第一点通过性能阈值来激励,但第二点仅在以下情况下才会触发:出现极端表现(验证者停机超过 2 个月),或验证者因余额过低而退出

模块的可扩展性需要一种更灵活的管理 NO 集合的方式,包括那些表现足以维持正的验证者余额(验证者只需约 40% 的时间在线即可实现)但不足以向资本提供者(质押者)提供合理 APR 的 NO

https://hackmd.io/@5wamg-wlRCCzGh0aoCqR0w/SJnxLSnp6 启发

驱逐表现不佳者

提议保留 Simple Bond 和 CSM Performance Oracle 及其单一阈值不变,并添加另一个工具来确保表现不佳者被驱逐,同时保留 CSM 出色的社交化与性能余量特性。

  1. Bond 按照 Simple Bond 中的描述运作,以 stETH 抵押品的形式存储,并像普通 stETH 一样获得 rebase。

  2. CSM Performance Oracle 按照 CSM 架构文档中的描述,以单一性能阈值分配质押奖励。

  3. [新增] 在 6 个 frame 内有 3 个 frame 表现低于性能阈值的验证者,将使用 EIP-7002 从共识层被逐出。

让我们深入探讨第三点。

没收错失利润

除了驱逐表现不佳者之外,另一项附加功能是没收错失利润,或没收在低性能 frame 期间获得的 bond rebase。

有几种计算错失利润(performance tax)的方法:

  • 笨办法。由 DAO 设定固定值,可在网络 APR 发生重大变化时更新。罚款计算为 oneFrameProfit * 3;如果只没收 bond rebase,则计算为 oneFrameRebase * 3 * bondAmount
  • 聪明办法。为每个 Performance Oracle frame 报告平均网络 APR,并将其用于计算,例如 32 ETH * avgAPR * 3 / 12

具体选项可以稍后决定。

需要特别指出的是,performance tax 是一种补充工具,即使不进行驱逐也可以使用。然而,提议将这两种工具(驱逐 + performance tax)结合起来。

CL 余额低的表现不佳者

在 CSM 架构文档的初始版本中,提议由 CSM bot 跟踪验证者的 CL 余额,并驱逐余额低于某个阈值的验证者。随着 CSM strike 的引入,跟踪 CL 余额变得多余,因为验证者很可能在 CL 余额降至阈值以下之前就已获得 3 次 strike。因此,移除 CL 余额阈值、依靠 strike 系统来驱逐表现不佳的验证者似乎是合理的。

详细算法

CSM Performance Oracle 每个 frame 提供一次额外的 tree root,其中包含验证者的“strike”信息。Strike 意味着验证者在该 frame 中的表现低于阈值。在更新这棵树时,CSM Performance Oracle 会考虑旧树中的先前值。所有超过 6 个月的 strike 都会被丢弃。

一旦 strike 数量达到 3(即 6 个月内 3 次 strike),无需许可的方法即可触发该验证者退出,并从 Node Operator 的 bond 中没收 performance tax + ejection tax。

Strike 树的叶子形式为 {noID, validatorPubkey, [strikeTimestamps]}

由于在新的乐观审查方法中,Node Operator 的 key 索引可能会发生变化(被删除的 key 会与 keys 存储中的最后一个 key 交换位置),因此需要向无需许可的方法提供 Node Operator 存储中的当前 key 索引,并检查 leaf 中的 key 与存储中的 key 是否一致。

function ejectBadPerformingValidator(uint64 noId, bytes32 proof, uint256 keyIndex) {
	validatorKey = getNoKey(noId, keyIndex);
	checkKey(proof, validatorKey);
	checkProof(proof);
	requestEjection(validatorKey);
	confiscatePerfTax(noId);
	confiscateEjectionTax(noId);
}

优点

  • 表现不佳者被驱逐,以避免 unbonding 以及对协议 APR 的进一步影响;
  • 表现不佳者的 bond 将因错失利润而受到惩罚;
  • OK 和半 OK 的表现者不会受到影响;
  • 实施可行;

缺点

  • 这可能对叙事不太有利。需要进行全面的沟通准备;
  • 又为模块增加了一层复杂性;
  • 仍然有可能在 2 个 frame 中表现低于阈值,然后在 1 个 frame 中表现高于阈值,从而将 strike 计数器重置为 0;

可能的边缘情况

在获得第三次 strike 之前退出

Node Operator 有可能在获得第三次 strike 之前决定退出其验证者。这样他就可以避免被没收 performance tax。然而,所有直接损失仍将被没收,并且在表现不佳的 frame 期间不会分配质押奖励。

为了克服这个问题,提议在验证者退出报告时对 strike 进行核算,并对每次 strike 没收 performance tax。

  • 原文链接: hackmd.io/@lido/Sy0nRd36...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论