“Puffer 是一个构建在 EigenLayer 之上的去中心化原生流动性再质押协议 (nLRP)”。它在短短几天内就吸引了超过 6 亿美元的 TVL(总锁仓价值)。访问控制是防止协议遭受恶意操作的一项重要安全考量。
在本篇博文中,我们将回顾 Puffer 协议中访问控制机制的整体架构及其当前配置。这有助于社区更好地理解该协议。请注意,分析结果基于以太坊当前的状况(区块 19177155,2024 年 2 月 7 日,下午 03:17:35 UTC)。
合约地址
下表列出了本博文中使用的智能合约。
| 地址 | 实现合约 | |
|---|---|---|
| PufferDepositor | 0x4aa799c5dfc01ee7d7 90e3bf1a7c2257ce1dceff | 0x7276925e42f9c4054af a2fad80fa79520c453d6a |
| PufferVault | 0xD9A442856C234a39a81 a089C06451EBAa4306a72 | 0x39ca0a6438b6050ea2a c909ba65920c7451305c1 |
| AccessManager | 0x8c1686069474410E624 3425f4a10177a94EBEE11 | - |
| TimeLock | 0x3c28b7c7ba1a1f55c9c e66b263b33b204f2126ea | - |
| Operation SafeWallet | 0xC0896ab1A8cae8c2C1d 27d011eb955Cca955580d | 0xd9db270c1b5e3bd161e 8c8503c55ceabee709552 |
| Community SafeWallet | 0x446d4d6b26815f9bA78 B5D454E303315D586Cb2a | 0xd9db270c1b5e3bd161e 8c8503c55ceabee709552 |
| Pausing SafeWallet | 0x1ba8e3aA853F73ae809 3E26B7B8F2520c3620Df4 | 0xd9db270c1b5e3bd161e 8c8503c55ceabee709552 |
架构
整个协议主要包含两个与用户资产相关的智能合约。第一个是 PufferDepositor,第二个是 PufferVault。

PufferDepositor 的主要功能是接收用户的资产,然后将它们存入 PufferVault。如果用户存入的资产不是 stETH,协议会自动在 DEX 中执行兑换操作。
PufferVault 是持有用户资产的主要合约。它也是向 EigenLayer 存款的入口点。整个协议的主要访问控制都在这个智能合约中实现。
访问控制机制
整个访问控制是通过利用 OpenZeppelin 的 AccessManager 模块实现的。AccessManager 智能合约管理着 PufferDepositor 和 PufferVault 合约的权限。
AccessManager 定义了不同的“角色”(Roles),其中包含不同的地址。每个角色可以被分配调用 AccessManaged 合约(即 PufferDepositor 和 PufferVault)内部不同函数的权限。AccessManager 支持特定函数的延迟执行。也就是说,在为地址授予角色时,可以指定通过该地址在该角色下发出的操作是立即执行还是延迟执行。
当前访问控制配置
然而,访问控制的有效性取决于其配置。我们观察到大量因 ACL(访问控制列表)规则配置错误而导致安全漏洞的案例。
为了解决这个问题,我们审查了 Puffer 协议的当前配置,并将结果呈现在下面。请注意,这些结果仅反映了截至区块 19177155(2024 年 2 月 7 日,下午 03:17:35 UTC)的状态。
角色
下表概述了系统中的当前角色及其关联地址。
| 角色 ID | 拥有此角色的地址 | 延迟执行 | 说明 |
|---|---|---|---|
| 0 | TimeLock 0x3c28b7c7ba1a1f55c9ce66b263b33b204f2126ea | 否 | 管理员 (ADMIN) 角色 |
| 1 | Operation SafeWallet 0xc0896ab1a8cae8c2c1d27d011eb955cca955580d | 是(604800 秒 / 7 天) | 升级目标合约 (PufferDepositor 和 PufferVault) |
| 1 | Community SafeWallet 0x446d4d6b26815f9ba78b5d454e303315d586cb2a | 否 | 升级目标合约 (PufferDepositor 和 PufferVault) |
| 22 | Operation SafeWallet 0xc0896ab1a8cae8c2c1d27d011eb955cca955580d | 否 | 将资产转移到 EigenLayer 并发起从 EigenLayer 的提款请求 |
在 PufferVault 合约中执行函数有不同的路径。一条路径涉及 TimeLock 合约(拥有 ADMIN 角色——如图 1 中的路径 1 所示),另一条路径允许直接调用 Vault 内部的函数,并赋予调用者相应的角色。在这两种情况下,调用都必须通过 AccessManager。

类型 I:从 TimeLock 合约调用
请注意,当从 TimeLock 合约调用函数时,分配的角色是 ADMIN。这种指定是因为从 Vault 的角度来看,调用者是拥有 ADMIN 角色的 TimeLock 合约。因此,TimeLock 合约加入了额外的一层延迟执行机制。
- Operation SafeWallet:该组件可在 604,800 秒(约 7 天)的延迟后调用目标合约内的函数。
- Community SafeWallet:该组件能够立即调用目标合约内的函数。它还拥有取消由 Operation SafeWallet 提交到队列中的任何待处理执行的权限。
- Pausing SafeWallet:该组件仅限于暂停目标合约,无权执行任何其他功能。
类型 II:直接调用 Vault 合约
接下来的方法是直接调用 Vault 合约内部的函数。需要注意的是,AccessManager 规定了哪些函数可以由与每个角色关联的地址调用。
| 角色 ID | 目标合约 | 目标函数 |
| 1 | PufferVault | upgradeToAndCall(address,bytes)
0x4f1ef286 |
| 22 | PufferVault | depositToEigenLayer (0x008e0590)
initiateETHWithdrawalsFromLido (0x593961de) initiateStETHWithdrawalFromEigenLayer (0x402064a7) |
Operation SafeWallet 和 Community SafeWallet 都有能力直接调用 upgradeToAndCall 函数来升级目标合约。关键区别在于时机:Community SafeWallet 立即执行此操作且没有任何延迟,而 Operation SafeWallet 则受延迟限制。
此外,Operation SafeWallet 有权立即执行将资产转移到 EigenLayer 并发起提款请求的函数。
更新于 [2024 年 2 月 8 日 上午 10:02:59 UTC]
一项旨在将 Operation SafeWallet 从角色 1 中移除的操作已被排定。该操作计划在区块 1707940908 之后执行,对应约 7 天的预计延迟。这些排队交易的模拟是使用 BlockSec Phalcon 进行的。

- 在 Phalcon Fork 中的模拟交易,将于 10 天后的 2024-02-18 17:59:07 (UTC) 执行排队的操作。
- 查询 Operation SafeWallet 是否仍具有角色 1 的模拟交易(返回 false)。
更新于 [2024 年 2 月 16 日 上午 20:10:23 UTC]:

Safe Wallet 配置
安全钱包(Safe Wallet)的配置也会影响协议的安全性。
| 钱包 | 所有者 | 阈值 |
|---|---|---|
| 0xC0896ab1A8cae8c2C1d 27d011eb955Cca955580d | [0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76] [0xD6475ce37d964d4816715FdafFEeAAf2958948bE] [0xD70aa9d7280E6FEe89B86f53c0B2A363478D5e94] [0xa5F84b556d5FD8959165Eff0324DCFEa164fA089] [0xf061f1FceFa32b3bbD5d18c5A623DB64bfBc107D] [0x206846dE1F372A9a603e672ba97A5238cC89aeAA] | 3 |
| 0x446d4d6b26815f9bA78 B5D454E303315D586Cb2a | [0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76] [0x3B16821A5dBBFF86E4a88eA0621EC6be016cd79A] [0x648aA14e4424e0825A5cE739C8C68610e143FB79] [0x27c7CEd729280060577A68A54A94075D18614D19] [0xa9aE3B8FC1CBaAed74fE5889260f7cD743c50363] [0x161f479021044cB1C9e3DEF98aF945A8D972D3B2] | 3 |
| 0x1ba8e3aA853F73ae809 3E26B7B8F2520c3620Df4 | [0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76] [0x3B16821A5dBBFF86E4a88eA0621EC6be016cd79A] [0x648aA14e4424e0825A5cE739C8C68610e143FB79] [0x27c7CEd729280060577A68A54A94075D18614D19] [0xa9aE3B8FC1CBaAed74fE5889260f7cD743c50363] [0x161f479021044cB1C9e3DEF98aF945A8D972D3B2] [0xD6475ce37d964d4816715FdafFEeAAf2958948bE] [0xD70aa9d7280E6FEe89B86f53c0B2A363478D5e94] [0xa5F84b556d5FD8959165Eff0324DCFEa164fA089] [0xf061f1FceFa32b3bbD5d18c5A623DB64bfBc107D] [0x206846dE1F372A9a603e672ba97A5238cC89aeAA] [0xaACA1eDbb656206Ce2a82Da7d7BD3e1Bb8138F22] | 1 |
更新于 [2024 年 2 月 8 日 上午 10:02:59 UTC]:
- 地址 0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76 已从 Operation SafeWallet 中移除,将其授权调整为 3/5。
- 一项将 0xb7d83623906AC3fa577F45B7D2b9D4BD26BC5d76 从 Community SafeWallet 中移除的交易 已经发起,目前正在等待社区的多签批准。
- 三个钱包已从 Pausing SafeWallet 中移除,现在将其配置调整为 1/9。
总结
在本篇博文中,我们回顾了 Puffer 协议所使用的安全机制。总的来说,其整个权限系统的设计非常全面。
社区应积极监测潜在风险:
- Community SafeWallet 所有者的私钥安全性至关重要。如果三个私钥被盗,攻击者可能会升级该金库(Vault)。
- 像 EigenLayer 这样依赖协议的安全性也应当被积极监测。



