这篇文章详细介绍了Lido Staking Vaults (stVaults) 平台的设计、架构和核心机制。
免责声明! 这不是产品规范或目标文档——尽管这些内容会简要提及以供参考。详细的技术参考资料将在 stVaults 文档中心中提供。
Lido Staking Vaults (stVaults) 是模块化的原语,连接了质押者、节点运营商和协议——使他们能够定义自定义费用结构、调整验证者配置并微调风险/回报。这种灵活性在不损害去中心化、安全性或 $stETH$ 流动性访问的前提下得以实现。
stVaults 的设计目标是:
这些目标建立在 Hasu 的第二份 GOOSE 投票通过提案中概述的愿景之上,为多样化的质押产品线奠定了基础。
stVaults 的引入对现有 Lido 核心池协议合约(下称 Lido Core)带来了重大改变。为确保协议的稳定性,定义以下不变的基础约束至关重要:
因此,维护 Lido Core 和整个 Lido 质押基础设施的稳定性和安全性仍然是关键优先事项。
Lido Vaults 平台包含以下合约:
StakingVault 合约是一个 $0\text{x}02$ 类型提款凭证目标,也是 Lido Vaults 平台的基本组成部分。它代表了一个由单个 所有者 管理并由单个 节点运营商 提供服务的独立质押头寸。当连接到 Lido 时,该 Vault 可以用作铸造 $stETH$ 的抵押品。
通过 StakingVault,所有者可以:
质押 Vault 是一个有效的 $0\text{x}02$ 类型提款凭证目标,并支持 EIP-7251。任何 $0\text{x}01$ 或 $0\text{x}02$ 类型的验证者都可以通过执行层整合请求将其余额转移到 Vault 验证者。$0\text{x}00$ 类型的验证者必须首先迁移到 $0\text{x}01$ 类型凭证。

所有者是 Vault 中拥有最大权限的管理账户。所有者可以:
当 Vault 连接到 Lido 协议时,VaultHub 被设置为 Vault 的技术所有者,充当一个中间层,强制执行抵押品锁定以保护针对该 Vault 铸造的 $stETH$。Vault 的实际所有者记录在 VaultHub 内部。一旦链接被移除,VaultHub 将释放控制权并恢复所有权给该记录的所有者,从而保持其非托管性质。
节点运营商地址代表运行与 Vault 相关联的验证者的实体。该地址在 Vault 初始化时设置,不能更改。
强烈建议使用多重签名账户(例如 Gnosis Safe)以避免失去对该账户的访问权限。
由于验证者提款凭证硬编码到 Vault($0\text{x}02$ 类型指向合约),所有共识奖励和已退出余额都会自动流入 StakingVault;运营商绝不会保管 $ETH$。
节点运营商:
存款人地址是唯一被允许向信标链存款的方,消耗的是 Vault 中暂存的余额。由于抢跑漏洞(参见 3.6:PredepositGuarantee),此职责被提取为一个由 Vault 所有者控制的单独角色。当连接到 Lido 协议时,存款人必须设置为 PredepositGuarantee,这是一个专门用于缓解存款抢跑的合约。
暂存余额是一种机制,仅作为 PredepositGuarantee 合约完整证明存款流程的一部分使用。
Vault 存款人控制 Vault 的 暂存余额 计数器,该计数器为验证者激活保留 $ETH$,并且不能被提取。取消暂存 $ETH$ 将使这部分 $ETH$ 再次可供提取。这种暂存机制确保了 Vault 激活验证者的承诺。暂存强制执行了一个严格的不变量:每 $1 ETH$ 的预存款必须与为激活而暂存的 $31 ETH$ 配对。这保证了验证者总是可以被补充到所需的 $32 ETH$,这是验证者激活的最低余额。如果没有这个规则,一个 Vault 可能会产生许多 $1 ETH$ 的验证者,这些验证者永远不会激活,从而使资金锁定在信标链上,无法用于协议义务。
StakingVault 源代码:https://github.com/lidofinance/core/blob/feat/vaults/contracts/0.8.25/vaults/StakingVault.sol
VaultHub 是 Lido Vaults 平台的中央协调合约。它维护连接的 StakingVaults 的注册表,强制执行抵押品约束,根据每个 Vault 的总价值铸造/销毁 $stETH$,并跟踪 Vault 的义务。
当一个 StakingVault 连接到 VaultHub 时,后者:
图表。VaultHub 交互

VaultHub 源代码:https://github.com/lidofinance/core/blob/feat/vaults/contracts/0.8.25/vaults/VaultHub.sol
每个 StakingVault 有两个重要的参数来定义其状态:总价值 和 锁定。
为了控制 $stETH$ 铸造,VaultHub 为每个 stVault 跟踪以下参数:
如果 Vault 的锁定金额突破 $FRT$,则 Vault 被视为不健康:
总价值计算 感谢 Pectra 的 EIP-6110 和 PredepositGuarantee,有效的待处理存款会计入
totalValue,这使得无缝铸造无需等待入场队列清算存款。
图表。Vault 总价值分解

与 Lido Core 以 $1:1$ 的比例铸造 $stETH$ 与提供的以太币不同,Lido Vaults 以更保守的比例铸造 $stETH$。较低的比例实际上意味着 StakingVault 必须保持由风险参数和限制决定的准备金率(储备金率 或 $RR$)。
铸造 $stETH$ 后,相应数量的以太币(加上由于 $RR$ 而产生的一些准备金)将作为抵押品 锁定 在 StakingVault 上,即无法提取。系统会跟踪为每个 StakingVault 铸造的 stETH 份额 (liabilityShares),并根据 $stETH$ 再平衡更新 StakingVault 上的 locked 金额(以以太币计价)。要解锁以太币进行提款,StakingVault 必须销毁未偿付的 $stETH$ 金额(即偿还 $stETH$)。
给定:
阶段 1 - 初始状态(健康):
阶段 2 - 初始状态(健康):
阶段 3 - 罚没:
锁定金额是 Vault 中无法提取的总 $ETH$。它代表支持 Vault 的 $stETH$ 负债和准备金的抵押品。这个锁定金额确保了 Vault 保持超额抵押,并且可以吸收罚款而不会立即产生坏账。锁定金额由 stETH 负债 和 准备金 组成,即 locked = liability + reserve。准备金本身是根据准备金率计算的准备金和最低准备金中较大者得出的。
最低准备金是无论存在多少负债,必须锁定在 Vault 中的抵押品的绝对下限。最低准备金是作为 连接存款 和 罚没准备金 中较大者计算得出的。
因此,锁定 的最终计算如下:locked = liability + max(calculatedReserveFromRR, max(connectDeposit, slashingReserve))。
图表。锁定金额分解

义务是 StakingVault 欠 Lido 协议的所有记录,因此,它会以未决义务的金额阻止 Vault 余额。VaultHub 跟踪三种类型的义务。
健康义务以 $stETH$ 份额计价,是必须强制再平衡以恢复 Vault 健康的负债份额数量。当抵押品因验证者罚款、罚没或与 $stETH$ $APR$ 相比表现不佳而低于健康阈值时,健康义务会自动产生。健康义务对其他所有义务具有最高结算优先级。
强制再平衡是一项惩罚性操作,因此强烈建议在接近 $FRT$ 时通过偿还 $stETH$ 或为 Vault 注入资金等更有效的方式恢复健康。
赎回以 $stETH$ 份额计价,代表必须再平衡或销毁的负债金额,以支持 Lido Core 提款。在 Lido Core 池耗尽且需要流动性以满足其提款队列的罕见情况下,协议保留向符合条件的 Vault 发出赎回义务的权利,该义务应通过再平衡或销毁份额来解决。赎回结算会冲销 Vault 相应负债金额,并向核心池提供 $ETH$ 以处理提款。赎回具有第二优先级,这意味着协议首先恢复 Vault 的健康,然后才清算任何赎回。
已发行的赎回不会增加Vault 的负债。赎回可以被认为是 Vault 现有负债的一部分,必须被销毁或再平衡。
以 $ETH$ 计价的 Lido 费用——包括 基础设施、流动性 和 预留 费用——是 Lido 协议的服务费。这些费用在每次预言机报告时持续累计,报告提供更新的累计费用计数器。VaultHub 跟踪已结算费用计数器,因此,累计费用和已结算费用之间的差额被视为 未结算费用。Lido 费用具有最低优先级,即仅在 Vault 健康且没有分配赎回时才结算。Lido 费用通过 VaultHub 中的专用功能以无需许可的方式结算。
Vault 上的任何未清义务:
义务速查表
| 义务 | 优先级 | 以…计价 | 描述 | 累计 | 结算 |
|---|---|---|---|---|---|
| 健康 | 1 | $stETH$ 份额 | 恢复 Vault 健康所需的负债减少量 | 健康状况下降时自动产生 | 再平衡。强烈建议在接近 $FRT$ 前销毁 $stETH$ 或为 Vault 注入资金,以避免惩罚性强制再平衡 |
| 赎回 | 2 | $stETH$ 份额 | 为服务 Lido Core 提款所需的负债减少量 | 在 Lido Core 流动性极度短缺时由 $DAO$ 分配 | 再平衡或销毁份额 |
| Lido 费用 | 3 | $ETH$ | Lido 协议服务费 | 每次报告时持续累计 | 手动无需许可,断开连接时自动 |
准备金率确保 Vault 铸造的 $stETH$ 超额抵押。当 Vault 跌破强制再平衡阈值时,应进行再平衡以恢复抵押率。然而,在严重的群体罚没事件中,Vault 总价值可能跌破 $1:1$ 的比例,这意味着 Vault 的总价值无法完全覆盖未偿付的 $stETH$ 负债。这就是坏账。
坏账通过升级路径解决:
LazyOracle 是一个处理 Lido Vault 记账报告的合约。LazyOracle 从 AccountingOracle(为整个 Lido 协议报告)接收每日快照。这种“惰性预言机”机制有效地处理了数千个独立 Vault 的状态更新。与其在单次交易中更新每个 Vault 的状态——这在 gas 成本方面将是极其昂贵的——系统使用基于 Merkle 树的方法,其中只有表示全局状态的根哈希由 AccountingOracle 作为主要记账协议报告的一部分每天存储和更新。
单个 Vault 的更新是按需进行的,通过提供 Merkle 证明来验证特定 Vault 的数据与存储的根哈希。当 Vault 的数据需要更新时,任何人都可以提交证明以及 Vault 的最新数据。系统会根据 Merkle 根哈希验证此数据,如果有效,则更新 Vault 的状态并将相关信息转发到 StakingVault 合约。
每个依赖于 Vault 总价值准确性的 Vault 操作都受到新鲜度检查的限制。单个 Vault 报告仅在其时间戳与 LazyOracle 发布的最新全局报告检查点匹配 并且 自该检查点以来经过的时间少于 $2$ 天时才被视为新鲜。如果情况并非如此,则 Vault 被视为陈旧。如果报告陈旧,Vault 所有者无法:
因此,陈旧状态将 Vault 密封在保守状态,直到提交新的报告,确保抵押品计算绝不会在过时数据上进行。
隔离区是 LazyOracle 对 Vault 报告价值突然跳跃施加的时间锁,因为它无法立即在链上确认。如果报告的总价值超出正常例行 EL/CL 奖励,超额部分不会立即反映在总价值中。相反,超额部分被推入隔离缓冲区并忽略预定义的时间;只有在该延迟之后,隔离价值才会被释放到 VaultHub 的总价值中。如果在隔离期内发生另一次跳跃,则初始金额将在当前隔离期结束时释放,并且新超额的累积金额将进入在第一个隔离期结束后立即开始的新隔离期。
这种时间锁机制为协议提供了检查突然增长并在必要时发出警报的时间。
正常的充值——所有者首先将以太币存入 Vault 合约——绝不会通过隔离区。因为这笔以太币在 Vault 余额上是可见的,所以增加可以在链上验证,因此被视为安全。实际上,这意味着直接注资会立即反映在总价值中。
除了一些健全性检查外,隔离区是相对运作的,因此总价值的突然跳跃可能会在一个小 Vault 中被隔离,但相同数量的增长可能不会在一个总价值很大的 Vault 中受到隔离。
OperatorGrid 合约控制连接到 Lido 协议的 Vault 的铸币参数。其主要目的是将 Vault 组织成不同层级的组,并具有特定的 $stETH$ 铸币限制,同时确保任何单一节点运营商都不会处理过多的 $stETH$。
一个 组 代表一个节点运营商。每个组都有一个 shareLimit,用于限制该运营商所有 Vault 可以铸造的 $stETH$ 份额总数。一个组包含一个或多个层级。组会跟踪其负债份额(所有该组 Vault 铸造的份额总数)。
重要! OperatorGrid 中的节点运营商地址与 StakingVault 合约中设置的节点运营商地址相同。此地址具有关键权限。失去对该地址的访问意味着失去管理 Vault 配置以及与 Vault 所有者协调参数更改的能力。因此,强烈建议节点运营商使用多重签名账户。
一个 层级 代表一组铸币参数。每个层级都属于一个特定的节点运营商组(默认层级除外)。每个层级都有其份额限制、准备金率、强制再平衡阈值和 Lido 费用。层级会跟踪其负债份额(该层级 Vault 铸造的份额总数)。
OperatorGrid 源代码:https://github.com/lidofinance/core/blob/feat/vaults/contracts/0.8.25/vaults/OperatorGrid.sol
所有 Vault 都从默认层级开始。默认层级没有特定的节点运营商组。它的 $stETH$ 铸币限制在初始化时定义。默认层级的 Vault 不会计入任何运营商组的负债。当 Vault 从默认层级移动到运营商层级时,其份额会添加到该运营商的组负债中。
即使 Vault 节点运营商有注册组,新 Vault 也会被放置在默认层级。Vault 可以更改其层级,这必须由 Vault 所有者和节点运营商双方确认。断开连接后,Vault 会回到默认层级。
每个层级定义了控制 Vault $stETH$ 铸币能力的关键参数:
这些参数在 Vault 连接或更改层级时传播到 VaultHub。
图表。一个具有 $100k$ 限制和三个层级的示例组

层级更改通过多重确认操作(参见 Dashboard,多重确认)执行:Vault 所有者和相应的节点运营商必须在彼此设定的时间范围内独立提交匹配的层级更改,无论顺序如何。每次确认都会存储在链上,如果未及时完成则会自动过期,并且可以无副作用地重新提交。一旦第二笔交易到达,合约会从旧层级将 Vault 的负债重新分配到新层级,更新组和层级份额计数器,并且——如果 Vault 已经连接——将新的铸币参数直接推送到 VaultHub。
OperatorGrid 配置了三种类型的 Lido 费用(以基点表示):基础设施费(补偿协议运营成本)、流动性费(针对 $stETH$ 流动性收取)和 预留费(涵盖按需流动性)。费用在创建层级时在层级级别设置,并且可以由 $DAO$ 全局针对整个层级或单独针对特定 Vault 进行更新。
Vault 可以拥有与其层级不同的个人参数:
这些参数可以通过所有者和节点运营商双方通过同步层级方法相互确认来恢复。
OperatorGrid 可以对 Vault 进行 惩戒 作为一种保护措施。惩戒机制的主要目的是防止有问题的 Vault 进一步铸造。
VaultFactory 合约提供了一种流畅的、单笔交易的方式来创建和配置带有 Dashboard 的 StakingVault。关键是,VaultHub 只接受由该工厂部署的 Vault。任何其他方式部署的 Vault 都将被拒绝。这确保了 Vault 合约代码经过验证,并且其存储未被恶意篡改。
工厂执行以下操作:
工厂支持两种创建 StakingVault 的方式:
为了防止 存款抢跑漏洞,StakingVault 强制执行预存款和验证机制。节点运营商不能直接将支持 $stETH$ 的锁定资产存入信标链。相反,他们必须使用 PredepositGuarantee (PDG) 合约,该合约要求节点运营商发布匹配的担保金额。
通过 PDG,节点运营商进行 $1 ETH$ 预存款并锁定等额担保。同时,PDG(作为 Vault 的存款人)为每个验证者暂存 $31 ETH$ 在 Vault 上,保留激活 $ETH$。为了验证验证者,必须提供使用 EIP-4788 信标区块根的正确提款凭证证明。正向证明(验证者 WC 与 Vault 匹配)解锁担保。只有在验证后,验证者才能使用暂存资金完全激活。负向证明会没收节点运营商的担保,作为对 Vault 的补偿。
💡 对于未锁定且未支持任何 $stETH$ 的 $ETH$,Vault 所有者可以选择简化的“PDG 快捷方式”流程,该流程绕过了担保要求。这种更简单的方法假定 Vault 所有者和节点运营商之间存在信任(可能由链下协议支持)。在此流程中,PDG 可以直接证明和激活验证者,但任何恶意抢跑只会影响 Vault 所有者。
图表。节点运营商存款快乐路径

stVault 验证者存款的完整流程如下:
图表。已证明的验证者存款流程

重要须知!
- 节点运营商担保可以来自专门的担保人账户(信任运营商的账户)。
- $1 ETH$ 担保 始终保留在 PDG 中;只有 Vault 的 $ETH$ 才会发送到信标存款合约。
- 连接时,VaultHub 强制 Vault 中的所有预存款都有足够的暂存余额。
- StakingVault 支持 Pectra 的 EIP-7251
MAX_EB,因此预存款 + 激活流程适用于 $32 ETH$ 和多 $ETH$(高达 $2048$)验证者。- PDG 中的大多数步骤都可以批量处理,包括一条快速路径,可以在一次调用中证明、激活和充值多个验证者。
- 节点运营商可以在预存款期间附加其 PDG 余额。
- 一旦验证者预存款被发送,它就会出现在信标存款队列中。提款凭证证明只能在验证者在共识状态中最终确定后才能生成。
为了操作灵活性,节点运营商可以指定一个专用的 存款人 地址(不要与 StakingVault.depositor 混淆),该地址被授权代表该运营商通过 PDG 执行存款(包括预存款和激活)。存款人角色可以随时由运营商替换,而不会影响现有余额或担保。如果未分配,存款人默认为运营商地址。
值得注意的是,VaultHub 强制所有已连接的 Vault 将 PDG 设置为 Vault 中的 存款人,而 PDG 本身则验证调用者是否与运营商指定的存款人匹配。这种分离允许安全的验证者签名操作,同时保持管理密钥离线。
预存款操作必须包含有效的 $BLS12-381$ 签名,才能通过 EIP-2537 中引入的预编译在链上进行验证。这就是为什么交易还必须携带必要的签名转换数据。签名验证至关重要——它确保预存款是合法的存款,并且具有指定 pubkey 的验证者最终将出现在共识层。这将使得能够为验证者及其提款凭证生成存在证明。
已证明的验证者充值不需要有效的 $BLS$ 签名,只有预存款需要。
Lido 协议支持直接向存款合约存款以及针对与 Vault 关联的验证者进行验证者整合。为了处理此类情况,PDG 包含一种特殊方法,用于证明“侧面”或“整合”验证者的提款凭证——这些验证者要么绕过了标准预存款流程,要么后来合并到 Vault 的验证者集中。
此方法允许这些验证者在 PDG 中清除,而无需经过预存款流程。然而,这些验证者的余额不计入 Vault 的 totalValue,直到通过预言机报告确认。
重要! 只有已在信标链上激活的验证者才能向 PDG 证明。待处理的验证者将被拒绝,因为它们尚未符合 EIP-7002 提款条件,并且在激活之前无法强制退出。
图表。向 PDG 证明未知验证者

PredepositGuarantee 源代码:https://github.com/lidofinance/core/blob/predeposit-guardian/contracts/0.8.25/vaults/predeposit_guarantee/PredepositGuarantee.sol
Dashboard 是 StakingVault 的一个实用扩展,处理以下事务:
尽管技术上是可选的,但 Dashboard 强烈建议用于 StakingVaults 更简单的操作管理。没有 Dashboard,Lido 的网络界面和 CLI 工具将无法运行。选择不使用 Dashboard 的 Vault 所有者应具备底层合约的强大技术知识,并准备通过原始交易调用来管理其 Vault。对于大多数用户来说,Dashboard 提供了基本的质量改进,极大地降低了管理验证者和 $stETH$ 铸币操作的复杂性。
StakingVault 是一个最小的质押原语,只管理即时质押操作并跟踪其 totalValue 和锁定的以太币。它实现了一个简单的单所有者模型。Dashboard 是可选的,并且在 VaultHub 之上运行,即它在 VaultHub 中被记录为 Vault 的所有者,而实际的 Vault 所有者成为 Dashboard 合约的管理员。
图表。Dashboard 访问控制模型

使用 Dashboard,StakingVault 中的每个操作都需要相应的角色。例如,向 StakingVault 注资需要发送者拥有 FUND_ROLE。所有这些角色都有其 角色管理员。
图表。角色受限操作

重要须知!
Dashboard合约包含批量授予和批量撤销角色的功能;- 某些操作(如再平衡)如果交易中附带以太币且发送者拥有
FUND_ROLE,则可以预先注资。
多角色确认机制限制了一些管理操作,从而防止单方面决策。这意味着每个所需角色的成员必须在可配置的持续时间(生命周期)内发送具有相同参数的交易,但无论顺序如何。
图表。多角色确认流程示例

StakingVault 有意不包含任何额外费用(例如,节点运营商费用、奖励份额)的核算,以允许在不同设置中具有灵活性。相反,此逻辑已在 Dashboard 中实现,并留有配置空间。Dashboard 包含节点运营商管理角色,该角色授予代表节点运营商利益的地址,并且可以与 Vault 中设置的节点运营商地址不同。
费用核算采用高水位线方法,计算方式如下:
将 增长 定义为 Vault 总价值中非明确注资的部分:
growth = totalValue – inOutDelta
因此,费用基数是:
unsettled = max(growth – settledGrowth, 0)费用是:
fee = unsettled \times feeRate如果 unsettled 为零或负数,则 settled growth 保持不变,不产生费用。
费用以无需许可的方式支付(异常高额费用除外)。支付流程:
unsettled 增长和费用,自愿断开连接时,费用会首先自动支付,然后才进行断开连接。
为了防止由于配置错误/过时的已结算增长导致过高支付,Dashboard 强制执行一个 异常高额费用阈值。
DEFAULT_ADMIN_ROLE)可以执行单独的管理员功能进行支付。$1\%$ 的阈值是非常保守的:如果 $APR$ 约为 $5\%$,即使运营商费用为 $10\%$,如果费用从未支付,Vault 也需要大约 $2$ 年才能达到阈值。
更改费率需要双重确认(管理员 + 节点运营商经理)和几项安全检查:
Dashboard 强制执行由管理员配置的 PDG 策略:
所有验证者资金必须通过完整的预存款和证明流程。
节点运营商可以证明不通过标准流程(例如,侧面存款)的验证者,以便它们有资格通过 PDG 进行未来的充值。
节点运营商可以 (a) 执行无担保存款——从 Vault 中提取 $ETH$ 并直接存入信标合约,绕过担保/签名检查——和 (b) 随后向 PDG 证明这些验证者。此快捷方式假定 Vault 所有者和运营商之间存在信任。
Dashboard 合约为节点运营商提供了一个快捷流程,允许他们执行绕过标准 PDG 预存款流程的存款——具体来说,跳过 $1 ETH$ 担保要求和 $BLS$ 签名验证。此路径旨在用于 Vault 所有者信任节点运营商不会抢跑存款,或者存在正式法律协议管理安排的情况。
这些 无担保存款 是通过从 Vault(不包括锁定部分)提取 $ETH$ 并直接向以太坊存款合约存款来执行的,而无需通过 PDG 路由交易。因此,Vault 的 totalValue 会因存款金额而减少,协议不承担与存款相关的任何风险。
此快捷流程通过更新已结算增长自动调整 Vault 的节点运营商费用核算。相关的验证者不计入奖励计算,因此节点运营商只收到实际获得的奖励——而不是完整验证者余额的份额。一旦验证者激活,其提款凭证可以使用 PDG 的“未知验证者”证明方法进行证明。证明后,验证者可以通过标准 PDG 流程接收充值存款。
图表。PDG 快捷方式

其他情况——例如验证者整合或不通过 Vault 直接向存款合约存款——也可能导致与 Vault 关联的验证者获得新的质押。为了在这些情况下确保准确的奖励归属,节点运营商可以在 Dashboard 合约中手动添加费用豁免,以增加已结算增长。

fund() 向 stVault 发送 $ETH$。totalValue。$0\text{x}02$ 提款凭证。totalValue。locked > totalValue 则回滚。totalValue 中。requestValidatorExits() 请求自愿退出。VaultHub(在极端条件下)可以调用 triggerValidatorWithdrawal() 执行 EIP-7002 “可触发提款”。withdraw() 从 Vault 余额中提取任意数量的未锁定 $ETH$(即 totalValue - locked)。
VaultHub 上的 mint(),铸造 $stETH$,最高可达锁定以太币(包括 $RR$)可覆盖的金额。liabilityShares。totalValue、liabilityShares、shareLimit 和 reserveRatio 的限制。针对 stVault 的铸币受协议范围内的铸币 速率限制 的约束。

VaultHub 上的 burn() 代表 Vault 销毁 $stETH$。liabilityShares。locked 金额会随着下一次证明更新而减少。
VaultHub 上的 rebalance() 将 $ETH$ 从 Vault 中再平衡出去。liabilityShares 和 totalValue。totalValue 为代价改善 Vault 健康状况。forcedRebalanceThreshold 被突破,也可以无需许可地执行。每个质押 Vault 都可以作为基本的委托质押设置独立运行。然而,为了启用 $stETH$ 铸币,它必须连接到 Lido VaultHub——一个管理 Vault 注册和控制铸币的中央合约。
连接流程:
断开连接流程:
Staking Vault 使用自定义的 BeaconProxy 模式部署。从 VaultHub 断开 Vault 不会 阻止它接收由 Lido $DAO$ 控制的未来升级。
为了永久冻结 Vault 的逻辑并拒绝任何未来升级,Vault 所有者可以对其进行 固化——通过在代理中锁定当前实现地址。此固化只能在 Vault 完全与 VaultHub 断开连接之后才能执行。
stVaults 设计的一个基石原则是:
$stETH$ 偿付能力 - 所有现有的 $stETH$ 都可以以 $1:1$ 的比例转换为 $ETH$
因此,每个 Vault 必须保持偿付能力,防止任何 Vault 特定的损失蔓延到 $stETH$ 持有者。强制执行此目的的机制称为 强制再平衡:
$$ (mintedShares - X)(totalValue - X) = 1 - RR $$
质押者和生态系统参与者应在参与 stVaults 之前仔细考虑这些风险并进行自己的研究。
2025-02-11: 初始版本
2025-04-24: 为 Hoodi 上的 Lido V3 测试网进行修订
2025-06-16: 为 Hoodi 上的 Lido V3 测试网 2 进行修订
2025-10-17: 为 Hoodi 上的 Lido V3 测试网 3 进行修订
2026-1-6: 软发布后的微小更正
StakingVault 中的暂存余额 (PDG 全证明流程)
Dashboard 中的高水位线运营商费用核算
growth = totalValue – inOutDelta,unsettled = max(growth – settledGrowth, 0),fee = unsettled \times feeRate。settledGrowth(例如,侧面/无担保存款、整合)。Dashboard 中的 PDG 策略
VaultHub 锁定计算中的最小准备金下限得到完善
locked = liability + max(reserveFromRR, max(connectDeposit, slashingReserve))。OperatorGrid 惩戒(阻止新的 $stETH$ 铸币)
VaultFactory 部署的 Vault(代码/存储来源保护)。Dashboard 费用模型变更
settledGrowth 加明确豁免取代;费用支付和安全检查已更改。VaultFactory)将不再被 VaultHub 接受。VaultFactory 用于所有新 Vault。StakingVault 和 OperatorGrid 之间运营商地址的明确耦合。settledGrowth 高水位线加明确豁免取代。settledGrowth 的豁免。VaultHub 接受。// 修复 1-eth 恶意攻击
// [VAULTS] 1 eth 恶意攻击修复 #1432
// 更多检查新鲜报告和暂停存款的地方
// 铸造外部份额的质押限制
// stVaults 的 ERC20 恢复
// [功能请求]:StakingVault recoverERC20/recoverERC721 #1253
// 恢复赎回优先级高于费用
// 更好的整合辅助函数
// PDG 的明确激活流程
// renounceOwnership 阻塞
// 节点运营商费用重做
// ERC7201 的存储位置统一
// VaultHub 中更好的暂停状态
// 添加 obligationShortfallValue 视图
// Vault 只能由其所有者连接
// 断开连接时妥善结算 Lido 费用
// 外部份额更好的质押限制
// 使 Lido 中的 pause/resumeStaking 在已暂停/已恢复时回滚
// 修复来自 NO 端的基于溢出的 DoS
// 修复 [Bug]:RoleMemberConfirmed:命名不一致 — 成员/角色字段实际上是地址/地址(256)
// 修复了许多注释
// 已向 OperatorGrid 添加 setConfirmExpiry()
// 已在 OperatorGrid 中添加参数验证
// PDG 的几项改进(输入验证、proveWCActivateAndTopUp 中的可选 topUp 和修复事件)
// Dashboard.transferVaultOwnership 现在返回布尔值,与其他确认方法一样
- 原文链接: hackmd.io/@lido/stVaults...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!