-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
988e1fa
commit 2c94c11
Showing
2 changed files
with
122 additions
and
8 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 借贷、流动性挖矿等场景。 |