文章讨论了以太坊权益证明(PoS)机制中存在的中心化风险,这些风险源于大型验证者在MEV捕获、重组攻击和提议者时间游戏中的优势。为了解决这些问题,文章介绍了EIP-7716,旨在通过对相关性故障进行惩罚,激励验证者多样化其设置,从而实现规模不经济,提高以太坊网络的稳健性。
特别感谢 DappLion 和 Vitalik 在总体概念上的合作,以及 Anders 和 Julian 对这篇文章的宝贵反馈!
以太坊依赖于一个去中心化的验证者集合,以确保可信中立和抗审查等特性。验证者会质押( stake) 一定数量的 ETH 来参与以太坊的共识并保护网络。作为回报,验证者直接从协议中获得奖励(#issuance),以及在提出区块时获得执行层奖励,其中包括交易费用和来自他们提出的区块的 MEV(#mevboost)。时至今日,即使存在一些不利因素,成千上万甚至数万个小型实体也在家中运行验证器。这些不利因素包括运营和维护节点的风险和责任、与设置和维护相关的技术负担、潜在的停机时间,以及缺乏流动性质押代币,否则该代币将提供灵活性和流动性。
随着以太坊 PoS 的不断成熟,我们遇到了当前协议固有的各种中心化力量:
在一年内,随机验证器获得至少一个利润 >10 ETH 的区块的概率为 0.1%:
P(\text{至少一个 10} \, \text{ETH} \, \text{区块}) = 1 - (1 - 0.0004041)^n = 1 - (1 - 0.0004041)^{2.628}
如果你控制了所有验证器的 1%(约 1 万个验证器),那么在一年内获得至少一个包含超过 10 ETH 的 MEV 的区块的概率会攀升至约 99.99%。
下图显示了 y 轴上的 MEV-Boost 支付的累计总和 和 x 轴上的 MEV-Boost 支付的累计数量。我们可以看到,90% 的所有区块分配了大约 44% 的总价值,剩下 56% 分配给幸运的 10% 的提议者。
\
Bk31ssG_R.png700×500 33.6 KB
Reorgs: 当 slot n_{1} 的提议者孤立 slot n_{0} 的提议者的区块时,就会发生“诚实重组”([Honest reorgs](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127), 因为该区块没有收到该 slot 的至少 40% 的委员会成员的投票。通过使用 proposer boost,下一个提议者可以重组这些“弱”区块(那些少于 40% 证明的区块),以惩罚前一个提议者的不良表现,例如迟到,因此 rug 了一些证明者正确 head 投票。重组可能具有中心化力量,并且一个实体持有的 stake 越多,它就越能策略性地决定是否重组特定区块。大型运营商更安全,因为他们可以确保自己的验证器永远不会投票重组自己的区块。基本上,一个实体的所有节点都可以协调一致,始终投票支持当前 slot 的区块,而不是其父区块(如果当前区块来自该实体)。这种协调可能会让大型实体冒险在 slot 中稍后广播其区块,同时仍然有很高的区块成为规范区块的概率。分析表明,在 slot 的第 4 秒,已经看到了该 slot 的 40% 的所有证明。一个控制许多验证器并且知道这些验证器永远不会投票重组其区块的大型运营商,可以稍微延迟区块传播,而不会显着增加其风险。当单个实体拥有连续的 slot 时,该原则同样适用。从理论上讲,该实体可以等到 slot 结束(甚至更长时间)才发布其区块。然后,它可以利用下一个 slot,通过利用 proposer boost 将该弱区块固化到链中。
提议者时机博弈:提议者时机博弈(另请参见 [1], [2])是一个术语,概括了某些区块提议者采用的策略,他们延迟自己的提议,以便让 builder 有更多时间提取 MEV。这会增加提议者的利润,但显然会对其他提议者,尤其是证明者产生负面影响。提议者时机博弈是有风险的,因为延迟的区块被重组的几率会增加。一般来说,大型运营商在玩时机博弈时面临的风险低于小型实体。这源于以下事实:更大的运营商平均而言更复杂,并且在 P2P 网络中具有更好的连接性:对于澳大利亚验证器来说可能是延迟的区块(加油 sassal) 可能对于位于美国的 Coinbase 验证器来说刚刚好。因此,延迟越低,验证器冒险延迟的程度就越高。
\textbf{上述所有症状都因一件事而加剧,即...}
\underline{\mathbf{规模经济。}}
规模经济 并不新鲜,加密领域也不例外。看看 Wikipedia,它被定义为“企业因其运营规模而获得的成本优势 […]”,这同样适用于以太坊 staking:
\
ryZMFz-_R.png635×570 11.3 KB
像 Coinbase、Kraken 或 Kiln 这样的大型运营商可以利用规模经济来使 staking 更有利可图。这使他们能够提供与 solo staker 具有竞争力的奖励,即使在扣除他们的分成后也是如此。为了说明这一点,请考虑一个简单的示例(这里的确切数字并不重要):
实体 | 一个节点上的验证器 | 硬件成本 | 其他成本 | 总成本 ($) |
---|---|---|---|---|
Solo Staker | 1 个验证器 | 1 个 Intel NUC ($ 1,200) | $ 5,000 | $ 6,200 |
Coinbase | 1,000 个验证器 | 1 个 Intel NUC ($ 1,200) | $ 50,000 | $ 51,200 |
有关更真实的数字,请参阅此处发布的最新 EthStaker 调查 here。通过为大型运营商分配 10 倍的其他成本,我们考虑了在一台机器上设置多个验证器的复杂性增加。对于我们在这里提出的观点来说,这已经足够真实了。
我们可以看到规模经济的影响:与 solo staker 相比,Coinbase 使用的机器将产生 1,000 倍的利润,而成本仅高出八倍。因此,大规模运营商的 ROI 明显更好。
为多个验证器使用一个硬件设备只是其中的一部分。其他包括:
在所有这些类别中,目标是最大限度地实现多样化,以最大限度地减少外部因素降低或损害网络的风险。尽管有这个目标,但经济上理性的参与者可能更喜欢一站式解决方案,例如在位于中欧的 Google/AWS/Hetzner 实例上运行 Lighthouse + Geth 节点,并由专门的专家团队维护。虽然这种设置在效率方面可能表现良好,但不应创建进一步加剧中心化的激励措施。
但是,谁是大型的,谁不是?
协议本身并不知道哪个验证器由哪个实体运营。从协议的角度来看,Coinbase 验证器看起来与 solo staker 相同。因此,为了防止出现关联性,我们不能简单地根据验证器背后实体的市场份额来缩放奖励和惩罚。有关此主题的更多信息,我推荐 Barnabé 的文章,““Seeing Like a Protocol””。
幸运的是,规模经济本身就伴随着关联,这是协议可以意识到的。利用规模经济可以与关联性线性缩放,因此我们可以实施规则来动态缩放经济激励措施,并引导验证器集合朝着多样化方向发展。
\
BJbZ1XWuR.png635×569 11.5 KB
惩罚相关的错误对于以太坊来说并不新鲜。在当前的 slashing 机制中,当一个“恶意”验证器被 slashing 时,最初会受到相当于其有效余额的 1/32 的减免的惩罚。在经过取款期的一半后,它们会受到额外的惩罚(correlation penalty),该惩罚会随着大约在同一时间(+/- 18 天)被 slashing 的验证器数量(特别是它们的 stake)而缩放。因此,一个 solo staker 意外地为两个不同的 head 区块投票,这是一种 slashable 的违规行为,其损失将大大低于一个拥有 20% 市场份额的参与者(假设所有 20% 的参与者集体失败)。
最终,目标一定是激励验证器多样化他们的设置。如下面的例子所示,我们希望验证器减少他们与其他验证器的相关性,使整个网络更能抵御外部影响。
\
ry5bkuMO0.png970×323 21.7 KB
“EIP-7716:反相关性证明惩罚”的目标是让我们更接近规模不经济。一个实体的 staking 设置越同质化,它应该受到的惩罚就越多,而非相关的设置可以从提议的更改中获利。
使用反相关性惩罚,之前的“规模经济与验证器数量”可能更像以下情况:
\
S179FsfOA.png635×570 27.3 KB
反相关性惩罚首先由 Vitalik 在 ethresearch post 中描述。在进行了一些 initial analyses 和一个更concrete proposal 之后,EIP 现在已经到了每个人都可以研究相关惩罚的内部运作并留下反馈的阶段。
简而言之,EIP 建议将错过的(来源)投票惩罚乘以一个惩罚因子,该因子的范围从 0 到 4,但平均等于 1(值得注意的是,这对于不影响发行政策非常重要)。
变量 | 符号 | 描述 | 值 |
---|---|---|---|
penalty_factor |
p | 惩罚缩放因子 | 动态 |
net_excess_penalties |
p_{exc} | 净超额惩罚 | 动态 |
non_participating_balance |
balance_{non\_attesting} | 未/错误证明的验证器的总余额 | 动态 |
PENALTY_ADJUSTMENT_FACTOR |
p_{adjustment} | 惩罚调整因子 | 2**12 |
MAX_PENALTY_FACTOR |
p_{max} | 最大惩罚因子 | 4 |
EXCESS_PENALTY_RECOVERY_RATE |
p_{recovery} | 超额惩罚减少的速率 | 1 |
这些常数的最终值仍有待确定。
惩罚因子 p 将 slot 的惩罚缩放到最大值 MAX_PENALTY_FACTOR
,或者缩小。它的计算方式如下:
p = \min\left(\frac{balance_{non\_attesting}\ \times\ p_{adjustment}}{\max(p_{excess},\ 0.5)\times\ balance_{total}\ +\ 1},\ p_{max} \right)
penalty_factor = min(
((total_balance - participating_balance) * PENALTY_ADJUSTMENT_FACTOR) //
(max(self.net_excess_penalties, 0.5) * total_balance + 1),
MAX_PENALTY_FACTOR
)
该公式计算惩罚因子,作为未证明的验证器的“惩罚权重”与按所有验证器的余额缩放的净超额惩罚的比率。更高的惩罚调整因子会增加惩罚因子的敏感性。相反,更高的净超额惩罚会导致更低的惩罚因子。
最后,penalty_factor
变量的使用方式如下:
def get_flag_index_deltas(state: BeaconState, flag_index: int) -> Tuple[Sequence[Gwei], Sequence[Gwei]]:
"""
Return the deltas for a given ``flag_index`` by scanning through the participation flags.
"""
...
for index in get_eligible_validator_indices(state):
base_reward = get_base_reward(state, index)
if index in unslashed_participating_indices:
if not is_in_inactivity_leak(state):
reward_numerator = base_reward * weight * unslashed_participating_increments
rewards[index] += Gwei(reward_numerator // (active_increments * WEIGHT_DENOMINATOR))
elif flag_index != TIMELY_SOURCE_FLAG_INDEX:
# [New in correlated_penalties]
slot = committee_slot_of_validator(state, index, previous_epoch)
penalty_factor = compute_penalty_factor(state, slot)
penalties[index] += Gwei(penalty_factor * base_reward * weight // WEIGHT_DENOMINATOR)
return rewards, penalties
我们检查是否正在处理来源投票(第 12 行),推导出验证器应该投票的 slot(第 14 行),计算惩罚因子(第 15 行),并将其乘以基本奖励(第 16 行)。
虽然来源投票可能是一个好的起点,但这个概念同样适用于 head 投票和 target 投票。
p_{exc} 在每个 slot 结束时使用以下公式更新:
p_{exc} = \max(p_{recovery},\ p_{exc} + p) - p_{recovery}
这等于:
net_excess_penalties = max(
EXCESS_PENALTY_RECOVERY_RATE,
net_excess_penalties + penalty_factor
) - EXCESS_PENALTY_RECOVERY_RATE
我们可以观察到以下动态:
当 non_participating_balance
连续几个轮回增加时,penalty_factor
和 net_excess_penalties
也会增加。这种情况会一直持续到 non_participating_balance
停止增加。然后,net_excess_penalties
和 penalty_factor
开始一起减少。
通过 net_excess_penalties
跟踪过去 epoch 的超额惩罚,该公式可以自我调节什么是“大量”未命中,什么不是。
这种机制确保了此 EIP 不会改变惩罚的总和,只会改变分配。
不是。与大型运营商相比,通常被称为小型运营商或在家中运行 1-10 个验证器的个人预计会以非常不相关的方式行事。虽然地理位置和客户端软件等因素会影响相关性,但 solo staker 在不同的时间离线的可能性高于 Coinbase 或 Kraken 等大型运营商。因此,solo staker 收到的惩罚低于当前系统中的惩罚。相反,如果大型运营商的 staking 设置出现错误导致其所有验证器都无法证明,则相关性很明显,并且惩罚更高。
这种预期首先在对反相关性惩罚的 initial analysis 中得到证实,该分析表明 solo staker 和 Rocketpool 运营商的情况会更好,而大型运营商平均会收到更高的惩罚。
不是。事实上,它鼓励使用少数客户端。使用多数客户端会导致更高的相关性。例如,如果 Lighthouse 客户端出现错误导致证明者对错误的来源进行投票,则相关性很高,并且惩罚会增加。相反,如果所有 Lodestar 证明者都失败,则被认为是较小的集体错误。相关性惩罚对于少数群体比对于多数客户端更宽容。因此,即使预计少数客户端会出现更多错误,相关性惩罚也可以引导验证器使用它们。
反相关性惩罚有效地区分了小型运营商和大型运营商,而无需依赖已巩固其 stake 的验证器或其他链下解决方案。通过为多样化的行为引入经济激励措施,我们可以使已经“反相关”的小型参与者受益,同时鼓励大型参与者减少外部因素对其 staking 运营的影响,例如单节点设置或云提供商。
如果大型参与者投资于提高容错能力,这仍然是有益的。增强容错能力既困难又昂贵。在某些时候,投资于反相关性比进一步改进容错能力更便宜。虽然大型运营商可能必须将验证器从流行的云平台转移到不同的环境中,但从家中运行节点的 solo staker 可以像以前一样继续。任何让大型运营商花钱但对 solo staker 免费的东西(=规模不经济)都有助于去中心化。
\
HyW84oMdA.jpg1950×613 98.4 KB
主要的论点是,无论大型运营商如何反应,无论是选择反相关性,还是做相反的事情,将所有验证器放在一个极其强大的节点上,这两种做法都需要花钱并降低他们的 APY。由于容错能力有其局限性,除了多样化之外,没有办法逃避更严厉的惩罚。
这是不正确的,因为 penalty_factor 变量的上限为 4(待分析)。设置上限可确保相关性惩罚永远不会失控。
这是一个很好的问题,由于对该主题的研究还处于起步阶段,因此尚未做出决定。反对 head 投票和 target 投票的一个论点是,它们取决于外部因素:如之前的分析所示,head 投票对提议者时机博弈很敏感。因此,如果这些时机博弈越来越成为标准,那么连接性较差的验证器(通常是 solo staker )可能会变得更糟。但是,this 分析表明情况恰恰相反,从长远来看,小型 stake 者将从反相关性惩罚中获利。这同样适用于与每个其他 slot 相比,epoch 的第一个 slot 中更难做对的 target 投票。尽管如此,从长远来看,这应该可以平滑验证器之间的差异,使我们能够对证明的所有部分进行反相关性惩罚,包括来源投票、target 投票和 head 投票。
- 原文链接: ethresear.ch/t/diseconom...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!