Rocket Pool rETH 集成 第 2 章:理解 rETH
集成 rETH 之前,必须吃透它本身:汇率怎么算、怎么铸造和赎回、为什么有时要去二级市场买、以及它的风险。这一章把 rETH 这个”积木”研究透,后面的集成才不会踩坑。
目录
- 1. rETH 的汇率机制
- 2. 案例:汇率如何体现收益
- 3. 一级市场:通过 Rocket Pool 铸造与赎回
- 4. deposit pool 的容量限制
- 5. 二级市场:在 DEX 上买卖 rETH
- 6. 溢价与折价
- 7. 集成 rETH 的风险清单
- 8. 本章小结
- 9. 动手练习
1. rETH 的汇率机制
rETH 是增值型代币。核心就一个量:exchange rate(兑换率)
exchange rate = 总质押 ETH 价值 / rETH 总供应量
1 rETH = exchange_rate 个 ETH
- 刚上线时 1 rETH = 1 ETH(exchange rate = 1e18)。
- 随着验证节点赚取质押收益,“总质押 ETH 价值”增长,而 rETH 总量不变 → exchange rate 单调上升。
- 合约函数:
getExchangeRate()返回当前汇率;getEthValue(rethAmount)和getRethValue(ethAmount)做双向换算。
关键:rETH 的数量不变,价值靠汇率体现。 你钱包里的 rETH 余额永远不变,但它越来越值钱。这对集成极友好——你不用处理”余额突然变化”(这是 rebase 型代币如 stETH 的麻烦)。
2. 案例:汇率如何体现收益
假设你今天用 10 ETH 铸造 rETH,此刻 exchange rate = 1.10:
得到的 rETH = 10 ETH × getRethValue = 10 / 1.10 ≈ 9.09 rETH
半年后,质押收益累积,exchange rate 涨到 1.15:
你的 9.09 rETH 现在值 = 9.09 × 1.15 ≈ 10.45 ETH
你的 rETH 余额还是 9.09(没变),但它从值 10 ETH 涨到值 10.45 ETH——0.45 ETH 就是这半年的质押收益(约 4.5%)。汇率从 1.10 涨到 1.15,正好反映了收益。
3. 一级市场:通过 Rocket Pool 铸造与赎回
铸造(deposit):调用 Rocket Pool 的 deposit 合约,存入 ETH,按当前汇率铸造 rETH。
// 通过 RocketDepositPool
rocketDepositPool.deposit{value: ethAmount}();
// 你的地址收到 rethAmount = getRethValue(ethAmount)
赎回(burn):调用 rETH.burn(rethAmount),销毁 rETH,按汇率取回 ETH。
reth.burn(rethAmount); // 取回 getEthValue(rethAmount) 个 ETH
⚠️ 赎回有条件:rETH 合约里要有足够的 ETH 余额才能赎回。如果质押的 ETH 都在验证节点里、合约里现金不够,赎回会失败——这时只能走二级市场卖出。
4. deposit pool 的容量限制
Rocket Pool 的 deposit pool(存款池)有一个最大容量。如果存款池已满(积压的 ETH 还没被分配到验证节点),新的 deposit 会被拒绝。
集成时要注意:
- 铸造 rETH 前,先检查
getMaximumDepositPoolSize()和当前getBalance(),确认还有空间。 - 如果一级市场铸造受限,就改用二级市场(DEX)买入 rETH。
这是集成开发的典型”现实约束”:理论上能 deposit,实际可能因容量满而失败,代码要优雅处理。
5. 二级市场:在 DEX 上买卖 rETH
因为一级市场有容量/赎回限制,**二级市场(DEX)**常是更实用的 rETH 进出通道:
- Balancer:rETH/WETH 的 ComposableStablePool 是 rETH 最大的流动性场所。
- Uniswap V3:也有 rETH/WETH 池。
- Curve:有 rETH 相关池。
集成合约里要获取 rETH,常见做法是用 WETH 在 Balancer/Uniswap 上换 rETH(而不是走一级市场 deposit),因为二级市场即时、无容量限制。
6. 溢价与折价
二级市场的 rETH 价格不一定等于一级市场汇率:
- 折价(discount):市场价 < 公允汇率(getEthValue)。比如大量人想退出、二级市场抛压大时。这时在 DEX 买 rETH 比一级铸造更便宜。
- 溢价(premium):市场价 > 公允汇率。比如一级市场 deposit 受限、大家只能在二级抢购时。
集成策略上:
- 进场(买 rETH)时,比较”一级铸造汇率”和”二级市场价”,选便宜的。
- 这个折溢价本身也可能是套利机会(当能在两个市场间无风险搬运时)。
7. 集成 rETH 的风险清单
把 rETH 接进你的协议前,要评估这些风险:
| 风险 | 说明 |
|---|---|
| 汇率脱锚 | 二级市场价偏离公允汇率,影响清算/估值 |
| 赎回流动性 | 一级赎回可能因合约 ETH 不足而失败 |
| deposit 容量 | 一级铸造可能因存款池满而失败 |
| 预言机风险 | 用错价格源(二级现货价 vs 公允汇率)会被操纵 |
| 质押层风险 | 验证节点被罚没(slashing)会让汇率增长放缓甚至下降(极端) |
| 智能合约风险 | Rocket Pool 本身的合约风险 |
经验法则:估值/清算用公允汇率 getExchangeRate(不易操纵),交易/进出用二级市场(看实际成交),两者别混用。
8. 本章小结
- rETH 是增值型 LST:数量不变,exchange rate 随质押收益单调上升;
getEthValue/getRethValue双向换算。 - 收益体现在汇率上:余额不变但越来越值钱(对集成友好,无 rebase)。
- 一级市场:deposit 铸造、burn 赎回;但受 deposit pool 容量 和 赎回 ETH 余额 限制。
- 二级市场(Balancer/Uniswap/Curve)是更实用的进出通道,无容量限制。
- 二级市场有溢价/折价,进场时比较一级汇率与二级价,选便宜的。
- 估值用公允汇率(抗操纵),交易用二级市场;注意脱锚、赎回、容量、slashing 等风险。
9. 动手练习
目标:实现”获取 rETH”的两条路径,并比较成本。
练习:一级铸造 vs 二级买入
主网分叉:
interface IRETH {
function getEthValue(uint256 rethAmount) external view returns (uint256);
function getRethValue(uint256 ethAmount) external view returns (uint256);
function getExchangeRate() external view returns (uint256);
}
// rETH: 0xae78736Cd615f374D3085123A210448E74Fc6393
思路:
- 公允汇率:读
getExchangeRate(),算”1 ETH 公允能换多少 rETH” =getRethValue(1e18)。 - 二级市场报价:用 Uniswap V3 或 Balancer,报价”1 WETH 能换多少 rETH”(用 Quoter 或池子 swap 模拟)。
- 比较:二级换到的 rETH 比公允值多还是少?多 = 折价(DEX 更划算买入),少 = 溢价。
- (进阶)实现一个
getReth(uint ethAmount)函数:比较两条路径,自动选更划算的方式获取 rETH(注意一级 deposit 的容量检查)。
运行
forge test --evm-version cancun --fork-url $FORK_URL \
--match-path test/UnderstandReth.t.sol -vvv
下一章(第 3 章 Aave 闪电贷杠杆)进入第一个实战项目:用 Aave 闪电贷把 rETH 敞口循环放大,杠杆化质押收益。