Skip to content

Commit

Permalink
feat: add stETH analyze
Browse files Browse the repository at this point in the history
  • Loading branch information
decentraldev1 committed Nov 6, 2024
1 parent 988e1fa commit 2c94c11
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 8 deletions.
8 changes: 0 additions & 8 deletions defi/Lido/Read.md

This file was deleted.

122 changes: 122 additions & 0 deletions defi/Lido/stEth.md
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 借贷、流动性挖矿等场景。

0 comments on commit 2c94c11

Please sign in to comment.