EigenLayer 集成:为开发者和审计师

这篇文章为开发者和审计师提供了将应用与 EigenLayer 集成时的关键注意事项。它详细介绍了 EigenLayer v0.2.5 (M2) 的复杂性、潜在问题,包括原生再质押、提款延迟、操作员与委托机制,以及与信标链的交互细节,旨在帮助理解系统工作原理和避免集成风险。

EigenLayer 为开发者和审计人员提供的集成指南

Eigenlayer 是一个复杂的系统,在集成时需要考虑其边缘情况。接下来,我们将介绍集成中的特殊之处和注意事项,以帮助开发者和审计人员理解可能出现的问题及其原因。

EigenLayer 在过去几个月中一直处于热议的焦点,因为它使通过 PoS 担保的服务(如 L2、桥、预言机,统称为 Actively Validated Services (AVS))能够轻松地启动其 cryptoeconomic security。

它通过允许将原生 ETH 或 LST 存入系统来实现这一点。一旦完成,用户可以选择将其质押委托给他们信任的Operators,以参与 AVS 的一个子集。Operators必须经过 AVS 的白名单认证。如果操作员因 AVS 获得 $AVS(AVS 的代币)奖励,部分奖励可以分配给委托人。相反,如果操作员在 AVS 上行为不端,委托的质押可能会被 Slashing。

尽管该协议看起来很有前景,但它是一个复杂的系统,在与 EigenLayer 集成时需要考虑其边缘情况和细节。在本文中,我们将尝试涵盖尽可能多的集成特殊之处,以帮助开发者和审计人员理解可能出现的问题及其原因。

本文适用于 EigenLayer v0.2.5 (M2),而非第一个主网版本 M1。如果你不熟悉 EigenLayer 及其架构,请首先阅读架构概述部分。

与 EigenLayer 集成时需要注意的细节

原生再质押者必须等待信标链(Beacon Chain)纳入才能进行再质押

原生再质押涉及在信标链上激活验证者。因此,扮演podOwner角色的集成方必须考虑到这一延迟,并实现验证者激活的验证功能(verifyWithdrawalCredentials())。此外,集成方必须注意,份额仅在验证者的凭证激活后才会铸造。

取消委托和提款延迟

取消委托和提款的路径几乎相同。实际上,取消委托可以看作是完全提款并清除委托人映射。在这两种情况下,请求都会进入一个有延迟的队列。在此延迟之后,质押者可以选择提取金额,或将其委托给当前设置的委托人。集成方必须意识到这一延迟,并在其实现中加以考虑。原生再质押注意事项:如果在延迟之后,质押者想提取他们的 ETH,他们还需要将其从信标链中提取,否则从 EigenLayer 的提款将失败。

来自 {{code}}DelayedWithdrawalRouter{{code}} 的成熟提款可以由任何人认领

在原生再质押的背景下,为了退出共识层奖励和发送到 {{code}}EigenPod{{code}} 的其他 ETH 金额(执行层奖励、赠予等),ETH 必须经过延迟提款过程。负责此过程的提款队列 {{code}}DelayedWithdrawalRouter{{code}} 允许任何人代表 {{code}}podOwner{{code}} 认领成熟的提款。

由于此功能(?),实现podOwner的集成方必须能够正确核算其合约可能未预期在专用函数调用之外收到的任何 ETH 金额。此外,实现podOwner的集成方应该能够认领这些提款,并且必须能够接收 ETH。

建议的费用接收方不能是 {{code}}EigenPod{{code}}

如果验证者是区块的coinbase,接收执行层奖励不会触发任何receive()fallback()函数。因此,EigenPod将不会知道新的奖励,并且nonBeaconChainETHBalanceWei将不会增加,导致奖励被锁定在 pod 中。为避免这种情况,验证者应将suggested_fee_recipient设置为可以管理执行层奖励的合约,请参阅这篇文章

一些未来考虑:Slashing

Slashing 尚未实施,所以我们不要对它将如何详细工作进行创新。但当它存在时,集成的关键部分将是正确核算存入的价值,考虑到 Slashing 可能会发生。目前,集成方必须拥有一个足够灵活的代码库,以适应未来的 Slashing。

如果你是从 M1 开始开发的,还有最后一件事

  • 由于 M2 现在允许在 EigenLayer 上证明验证者的状态,因此在 M2 之前创建的EigenPods需要升级。请参阅这篇文章了解如何通过网页应用程序进行操作。如果你的podOwner是智能合约,它应该在 pod 上调用activateRestaking
  • 在 M1 中,从 EigenLayer 的提款是在StrategyManager中发起的。从 M2 开始,它们通过DelegationManager进行。从 M1 开始开发的集成方必须更新其提款实现。

EigenLayer 架构概述

存款概述

有两条路径可以存款到 EigenLayer:

  • 流动再质押:质押者通过StrategyManager将其 LST 存入策略中。一些份额被核算并添加到质押者当前的委托人(操作员)中(如果有),位于DelegationManager中。

EigenLayer LST architecture

  • 原生再质押:此选项涉及两个步骤,并要求质押者运行一个或多个验证者。
    1. 如果是质押者第一次进行原生再质押,他们必须调用EigenPodManagerstake()函数。这将部署一个新的EigenPod,其podOwner是质押者。然后,新创建的 pod 将存入32 ETH以将验证者放入激活队列,并强制withdrawalCredentials指向该 pod。可以将多个验证者链接到一个EigenPod,即,将withdrawalCredentials指向EigenPod的地址。
    2. 一旦验证者在信标链上处于活跃状态并且包含证明可用,podOwner(质押者)必须在 pod 上使用证明数据调用verifyWithdrawalCredentials(),以通知 EigenLayer 验证者已活跃。这将把验证者的有效余额计为份额,这些份额将被添加到质押者当前委托人(操作员)中(如果有),位于DelegationManager中。

EigenLayer LST architecture

委托概述

默认情况下,份额不会被委托。当进行委托时,质押者选择加入的所有策略中的所有份额都会被委托。这是全有或全无。有两种方式可以启用委托:

  1. 注册为Operator:一旦注册为操作员,待成为操作员的份额将委托给自己。这是不可逆的。一旦成为操作员,就永远是操作员。操作员不能取消委托。
  2. 委托给操作员:拥有份额的质押者可以将其委托给他们信任的操作员。要更改委托人(操作员),质押者必须首先取消委托。一些操作员可以设置一个delegationApprover地址,该地址需要通过签署消息来批准委托。这作为委托的白名单。

取消委托和提款不能是即时的,因为 AVS 可能需要时间来惩罚(Slashing)行为不端的 Operator。三方可以发起取消委托:质押者、质押者的 Operator 以及质押者 Operator 设置的delegationApprover地址。在后两种情况下,这被称为强制取消委托。

当发起取消委托时,所有份额都将从质押者的份额中移除,并放入提款队列。份额将从操作员的账户中移除,并且质押者的委托映射将被清除。经过足够长的时间后,如果质押者在此期间没有重新委托,他们可以最终确定提款并取回其份额,或者重新委托给他们当前的 Operator,或者将他们的份额兑换成代币。

提款概述

我们需要区分 EigenLayer 的提款和信标链的提款。

信标链完全提款

首先,验证者必须在信标链上发送完全提款请求消息,并等待证明可用。然后,podOwner可以在EigenPod上使用证明数据调用verifyAndProcessWithdrawal()。这将验证信标链在 EigenLayer 上的提款,并使该金额可用于从 EigenLayer 提款。请注意,如果金额大于原始质押(32ETH),超额部分将放入DelayedWithdrawalRouterpodOwner被设置为延迟提款的接收方。剩余的质押将需要由DelegationManagercompleteQueuedWithdrawal()处理。

信标链部分提款

与信标链完全提款类似,验证者必须在信标链上发送部分提款请求消息。然后podOwner必须在 pod 上调用verifyAndProcessWithdrawal(),资金将通过DelayedWithdrawalRouter退出。podOwner被设置为延迟提款的接收方。

EigenLayer 提款

从 EigenLayer 提款意味着用 deposited 的信标链 ETH 或 LST 赎回份额。要赎回他们的份额,质押者可以:

  1. DelegationManager上调用undelegate()并要求以代币形式接收提款:请参阅上面的“委托概述”。请注意,这将移除所有资金。
  2. DelegationManager上调用queueWithdrawals():与取消委托的情况相反,质押者可以指定从哪些策略以及他们想提取多少。相关的份额将从质押者的余额中扣除,并从其相关操作员的委托份额中扣除(如果有)。然后,这些份额将进入一个提款队列,质押者可以为每次提款指定一个专用的withdrawer

请注意,有两种不同的提款队列:

  1. DelegationManager队列,用于 LST 和原生再质押者的质押。这支持 EigenLayer 份额。
  2. DelayedWithdrawalRouter队列,将验证者系统中任何超额余额退出。超额部分不支持 EigenLayer 份额。

Slashing

AVS Slashing:Slashing 机制和Slasher合约尚未实现。我们可以预期在最终确定提款时会有一个额外的步骤,其中Slasher将对从故障操作员取消委托/提取的金额收取费用。

关于 ChainSecurity

ChainSecurity 自 2017 年以来一直致力于智能合约安全。我们的客户包括蓝筹 DeFi 协议、有前景的 Web3 项目、中央银行和大型组织。

阅读我们已发布的审计报告。

预约通话以讨论审计前景。

external-link

  • 原文链接: chainsecurity.com/blog/e...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
chainsecurity
chainsecurity
江湖只有他的大名,没有他的介绍。