From 2c94c11cf5aad3e6ae779d9d03489bc4a232b7ae Mon Sep 17 00:00:00 2001 From: PeterParker Date: Thu, 7 Nov 2024 00:36:00 +0800 Subject: [PATCH] feat: add stETH analyze --- defi/Lido/Read.md | 8 --- defi/Lido/stEth.md | 122 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 8 deletions(-) delete mode 100644 defi/Lido/Read.md create mode 100644 defi/Lido/stEth.md diff --git a/defi/Lido/Read.md b/defi/Lido/Read.md deleted file mode 100644 index 07d390a08..000000000 --- a/defi/Lido/Read.md +++ /dev/null @@ -1,8 +0,0 @@ -# Lido - -Lido 作为以太坊LSD (ETH Liquid Staking Derivatives)的龙头项目,对于以太坊的POS机制有重要的影响,因此值得好好研究。 - - -References: -- DefiLlama dashboard https://defillama.com/lsd -- contracts repo: https://github.com/lidofinance/lido-dao \ No newline at end of file diff --git a/defi/Lido/stEth.md b/defi/Lido/stEth.md new file mode 100644 index 000000000..ff461bb8b --- /dev/null +++ b/defi/Lido/stEth.md @@ -0,0 +1,122 @@ +### **Lido stETH 合约分析** + +`stETH` 是 Lido 协议中的核心代币,代表用户质押的 ETH 以及累积的质押奖励。用户通过持有 `stETH` 可以继续获得以太坊质押收益,同时 `stETH` 可用于参与 DeFi 生态。 + +## **核心功能** + +### 1. **铸造与销毁** + +当用户质押 ETH 时,Lido 合约会根据质押金额按 1:1 的比例铸造 `stETH`。在用户提取 ETH 时,`stETH` 会被销毁以保持代币供应与质押金额的对应关系。 + +#### 核心代码 + +```solidity +function submit(address _referral) external payable returns (uint256) { + uint256 shares = _submit(msg.value, _referral); + return shares; +} + +function _submit(uint256 _amount, address _referral) internal returns (uint256) { + uint256 shares = getSharesByPooledEth(_amount); + _mintShares(msg.sender, shares); + emit Submitted(msg.sender, _amount, _referral); + return shares; +} +``` + +上述代码展示了 `submit` 函数如何根据用户的质押金额铸造 `stETH`。 `_submit` 方法计算用户的 `stETH` 份额(Shares),并将其分配给用户。 + + +### 2. **收益自动分配** + +Lido 协议使用 `rebase` 机制,每天更新用户持有的 `stETH` 数量,将质押奖励以份额形式分配到 `stETH` 持有者账户中。用户无需手动操作即可获得质押奖励。 + +#### 代码实现 + +```solidity +function handleOracleReport(uint256 _postTotalPooledEther) external onlyOracle { + uint256 totalShares = _getTotalShares(); + uint256 newShares = totalShares * _postTotalPooledEther / _getTotalPooledEther(); + _setTotalPooledEther(_postTotalPooledEther); + emit Rebase(totalShares, newShares); +} +``` + +`handleOracleReport` 函数根据最新的质押总量调整 `stETH` 的份额,这样用户的 `stETH` 持有量就会根据质押奖励自动增加。 + + +### 3. **与 ETH 的转换逻辑** + +`stETH` 与 ETH 的转换通过份额机制进行管理。每个 `stETH` 持有者拥有一定数量的份额,份额代表其在总质押池中的比例。 + +#### 转换函数 + +```solidity +function getPooledEthByShares(uint256 _shares) public view returns (uint256) { + return _shares * _getTotalPooledEther() / _getTotalShares(); +} + +function getSharesByPooledEth(uint256 _amount) public view returns (uint256) { + return _amount * _getTotalShares() / _getTotalPooledEther(); +} +``` + +`getPooledEthByShares` 和 `getSharesByPooledEth` 函数用于计算 `stETH` 和 ETH 之间的转换比例。 + +- **`getPooledEthByShares`**:根据用户的份额计算其对应的 ETH 数量。 +- **`getSharesByPooledEth`**:根据用户提供的 ETH 数量计算其应获得的份额。 + + +### 4. **核心组件分析** + +#### a. **Oracle(预言机)** + +Lido 使用预言机来报告以太坊质押总量的变化。预言机的报告触发 `rebase`,更新用户的质押奖励。 + +```solidity +modifier onlyOracle() { + require(msg.sender == ORACLE, "Caller is not the oracle"); + _; +} +``` + +#### b. **Node Operators Registry(节点运营商注册表)** + +Lido 的节点运营商负责管理和验证质押的 ETH。注册表维护了所有节点的状态及其质押情况。 + + +### 5. **stETH 在 DeFi 生态的应用** + +`stETH` 兼容 ERC20 标准,可用于 DeFi 协议,例如: +- **Curve Finance**:提供 `stETH/ETH` 流动性池,方便用户进行稳定交换。 +- **Aave**:用户可以使用 `stETH` 作为抵押物借贷。 +- **Balancer**:通过流动性池优化资本效率。 + + +## **深入分析** + +### **价格偏差与市场波动** + +由于 `stETH` 在二级市场交易,其价格可能与 ETH 存在轻微偏差。这种偏差通常由市场流动性和供需变化引起,Lido 通过与 Curve 等流动性池的合作来缓解此问题,提供低滑点的交易体验。 + +### **系统风险** + +1. **智能合约风险**: + 作为 DeFi 协议,Lido 依赖智能合约的安全性,一旦合约出现漏洞,可能导致用户资金损失。 + +2. **预言机风险**: + 预言机数据的准确性至关重要,若预言机提供错误数据,可能影响质押奖励分配或引发用户损失。 + +3. **中心化风险**: + 虽然 Lido 正在逐步去中心化,但目前仍存在节点集中化问题,可能影响协议的稳定性。 + + +## **总结** + +Lido 的 `stETH` 合约通过创新的流动性质押机制,为用户提供了灵活、安全的质押体验。 +不仅降低了以太坊质押门槛,还通过 DeFi 生态扩大了用户的收益来源。 + +**关键点总结:** +- **流动性质押**:`stETH` 为用户提供了质押奖励和流动性。 +- **自动收益分配**:通过 `rebase` 机制,无需手动操作即可获得质押收益。 +- **多样化应用**:`stETH` 被广泛应用于 DeFi 借贷、流动性挖矿等场景。