本文介绍了Beacon Chain ETH的Slashing Release,重点在于EigenPod相关的变更。主要包括share accounting方式的改变、EigenPod结构的变更(Checkpoint struct definition),以及 pre-release migration、完全slash和完成遗留提现等边缘情况的处理方式。
份额计算正在发生变化。当一个 EigenPod
的 checkpoint 完成时,一个负的余额差额将不再减少你的份额。
相反,你的新余额和旧余额的比例将累积到你的 “信标链罚没因子” 中,这是一个单调递减的值,EigenPodManager
使用它来跟踪 pod 的份额实际对应的资产数量( 代码链接):
/**
* @notice 返回一个 pod 所有者在更新他们的 pod 余额时所经历的比例余额减少的历史总和。
*/
function beaconChainSlashingFactor(
address staker
) external view returns (uint64);
例如,假设你的 EigenPod
拥有价值 32 ETH 的原生 ETH 份额。如果你的验证者累积了 16 ETH 的罚没,并且这在 checkpoint 中被报告,则 EigenPodManager
将:
stakerDepositShares
等于 32 ETHWAD
的比例 ( 16 ETH * (WAD/32 ETH) == 0.5 WAD
)WAD
,因此你的新信标链罚没因子将是 WAD * (0.5 WAD / WAD) == 0.5 WAD
如果你随后使用 32 ETH 重新抵押一个新的验证者,则 EigenPodManager
会将你的 stakerDepositShares
增加到 64 ETH。然而,DelegationManager
委托给你的运营商(或允许你排队提款)的数量部分基于你的信标链罚没因子。在这种情况下,可委托/可提取的数量将为 48 ETH,等于支持你的 pod 的实际资产。
你需要知道的是:
EigenPodManager.stakerDepositShares
将不再返回负值stakerDepositShares
不会减少。相反,EigenPodManager.beaconChainSlashingFactor(staker)
将被更新以反映这一点
DelegationManager.getWithdrawableShares
计算信标链 ETH 策略的实际可委托/可提取的份额:/**
* @notice 给定一个 staker 和一组 strategies,返回他们可以加入提款队列的份额和相应的 depositShares。
* 该值取决于 staker 被委托给哪个 operator。
* 返回的份额数量是 staker 将收到的 Strategy 份额的实际数量(取决于每个 strategy 的底层 shares 到 token 的比率)。
*/
function getWithdrawableShares(
address staker,
IStrategy[] memory strategies
) external view returns (uint256[] memory withdrawableShares, uint256[] memory depositShares);
EigenPod
变更为了适应上述的计算变更,EigenPods
将会有一些小的变更:
Checkpoint
结构体定义Checkpoint
结构体定义正在变更,以适应一个新的 “previous balance” 计算,用于更新你的信标链罚没因子:
struct Checkpoint {
bytes32 beaconBlockRoot;
uint24 proofsRemaining;
uint64 podBalanceGwei;
int64 balanceDeltasGwei;
uint64 prevBeaconBalanceGwei;
}
请注意,balanceDeltasGwei
现在是一个 int64
(从 int128
降下来),并且有一个新的字段 prevBeaconBalanceGwei
,用于跟踪在 checkpoint 中证明的每个验证者的先前验证者余额的总和。
当最终确认一个 checkpoint 时,它不再从状态中删除。 当前的行为是删除 currentCheckpoint
和 currentCheckpointTimestamp
,并将它们都设置回零 ( 链接)。
从 slashing release 开始,只会删除 currentCheckpointTimestamp
( 链接)。这与上述更改无关,但可以在启动新的 checkpoint 时节省 gas - 因为 checkpoint 的存储槽不再需要从 0 初始化。
为了适应 EigenPods
的更改,我们将在 slashing release 之前进行一次简短的 “迁移”。目前对该迁移的计划大致如下:
EigenPod.startCheckpoint
方法将对所有 EigenPods
暂停。EigenPods
的 任何未完成的 checkpoints。EigenPod.startCheckpoint
将被取消暂停,正常操作可以恢复。你的信标链罚没因子从 1 WAD
(1e18) 开始,并随着你的 pod 通过 checkpoints 报告余额减少而降低。
如果在任何时候你的信标链罚没因子达到 0,DelegationManager
将无法处理你 pod 的余额增加、取消委托或提款。 本质上,你的 pod 将被锁定 - 因为尝试添加新的验证者、取消委托或排队提款将导致 revert。
但是,只有在 所有 你的 pod 的验证者都被罚没到 0,并且 你的 EigenPod
中没有 ETH 余额的极端情况下,才会发生这种 “完全罚没” 的情况。
如果在 slashing release 时你有负的 stakerDepositShares
, 你将无法完成 checkpoint 或向你的 pod 添加新的验证者。请参阅相关的检查和解释。
为了解决这种情况,你需要使用 receiveAsTokens == false
完成 DelegationManager
中任何现有的提款。
- 原文链接: hackmd.io/@-HV50kYcRqOjl...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!