Skip to content

Commit c2379eb

Browse files
committed
Add study notes for 2025-08-21
1 parent 3ba9e13 commit c2379eb

1 file changed

Lines changed: 240 additions & 0 deletions

File tree

kaixiang-uoa.md

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,246 @@ timezone: UTC+8
1515
## Notes
1616

1717
<!-- Content_START -->
18+
# 2025-08-21
19+
20+
# AMM交换机制学习笔记
21+
22+
*从x*y=k公式到实际交换:理解自动做市商的核心算法*
23+
24+
## 核心问题
25+
26+
**问题**:当用户想要交换代币时,AMM如何自动计算交换比例和数量?
27+
28+
## x*y=k 公式的本质
29+
30+
### 数学含义
31+
```
32+
x * y = k (常数)
33+
34+
其中:
35+
- x = 池子里代币A的数量
36+
- y = 池子里代币B的数量
37+
- k = 恒定乘积,代表池子的"流动性深度"
38+
```
39+
40+
### 经济含义
41+
- **供需平衡**:某种代币越稀缺,价格越高
42+
- **自动定价**:不需要订单簿,数学公式自动计算价格
43+
- **连续性**:任何时候都能交换,只要池子有流动性
44+
45+
## 基础交换例子
46+
47+
### 初始状态
48+
```
49+
池子状态:
50+
ETH: 100个 (x)
51+
USDT: 200,000个 (y)
52+
K = 100 × 200,000 = 20,000,000
53+
54+
当前价格:
55+
1 ETH = 200,000 ÷ 100 = 2,000 USDT
56+
```
57+
58+
### 例子1:小额交换
59+
```
60+
用户Alice用 2,000 USDT 买 ETH
61+
62+
步骤1:计算交换后的池子状态
63+
- 池子USDT变成:200,000 + 2,000 = 202,000
64+
- K保持不变:x × 202,000 = 20,000,000
65+
- 新的ETH数量:x = 20,000,000 ÷ 202,000 ≈ 99.01
66+
67+
步骤2:计算用户获得的ETH
68+
- Alice获得:100 - 99.01 = 0.99 ETH
69+
- 实际价格:2,000 ÷ 0.99 ≈ 2,020 USDT/ETH
70+
71+
价格分析:
72+
- 交换前价格:2,000 USDT/ETH
73+
- 实际成交价:2,020 USDT/ETH
74+
- 滑点:(2,020 - 2,000) ÷ 2,000 = 1%
75+
```
76+
77+
**关键观察**:Alice买入ETH后,ETH价格上涨了!
78+
79+
### 例子2:大额交换
80+
```
81+
用户Bob用 20,000 USDT 买 ETH
82+
83+
步骤1:计算交换后状态
84+
- 池子USDT变成:200,000 + 20,000 = 220,000
85+
- 新的ETH数量:20,000,000 ÷ 220,000 ≈ 90.91
86+
87+
步骤2:计算Bob获得的ETH
88+
- Bob获得:100 - 90.91 = 9.09 ETH
89+
- 实际价格:20,000 ÷ 9.09 ≈ 2,200 USDT/ETH
90+
91+
价格分析:
92+
- 交换前价格:2,000 USDT/ETH
93+
- 实际成交价:2,200 USDT/ETH
94+
- 滑点:(2,200 - 2,000) ÷ 2,000 = 10%
95+
```
96+
97+
**重要发现**:交换金额越大,滑点越高!
98+
99+
## 通用计算公式
100+
101+
### 输出数量计算
102+
```solidity
103+
function getAmountOut(
104+
uint amountIn, // 输入数量
105+
uint reserveIn, // 输入代币池子储备
106+
uint reserveOut // 输出代币池子储备
107+
) pure returns (uint amountOut) {
108+
109+
// K = reserveIn * reserveOut
110+
// 交换后: (reserveIn + amountIn) * (reserveOut - amountOut) = K
111+
// 解出: amountOut = (amountIn * reserveOut) / (reserveIn + amountIn)
112+
113+
uint numerator = amountIn * reserveOut;
114+
uint denominator = reserveIn + amountIn;
115+
amountOut = numerator / denominator;
116+
}
117+
```
118+
119+
### 公式推导过程
120+
```
121+
设:
122+
- 输入代币储备:Rin
123+
- 输出代币储备:Rout
124+
- 输入数量:Ain
125+
- 输出数量:Aout
126+
127+
交换前:K = Rin × Rout
128+
交换后:K = (Rin + Ain) × (Rout - Aout)
129+
130+
因为K不变:
131+
Rin × Rout = (Rin + Ain) × (Rout - Aout)
132+
133+
展开:
134+
Rin × Rout = Rin × Rout - Rin × Aout + Ain × Rout - Ain × Aout
135+
136+
简化:
137+
0 = -Rin × Aout + Ain × Rout - Ain × Aout
138+
Rin × Aout = Ain × Rout - Ain × Aout
139+
Rin × Aout + Ain × Aout = Ain × Rout
140+
Aout × (Rin + Ain) = Ain × Rout
141+
142+
最终:
143+
Aout = (Ain × Rout) / (Rin + Ain)
144+
```
145+
146+
## 💡 深层理解:为什么有滑点?
147+
148+
### 滑点产生的原因
149+
```
150+
想象一个水池:
151+
- 水越深,舀出一桶水对水位影响越小
152+
- 水越浅,舀出同样的水对水位影响越大
153+
154+
AMM池子同理:
155+
- 流动性越深,交换对价格影响越小
156+
- 流动性越浅,交换对价格影响越大
157+
```
158+
159+
### 数学表达
160+
```
161+
边际价格变化 = ∂(y/x) / ∂x
162+
163+
对于x*y=k:
164+
y = k/x
165+
∂y/∂x = -k/x²
166+
167+
价格敏感性与 1/x² 成正比
168+
即:代币数量越少,价格越敏感
169+
```
170+
171+
## 双向交换对比
172+
173+
### ETH → USDT 交换
174+
```
175+
初始:100 ETH, 200,000 USDT
176+
177+
用户卖出 10 ETH:
178+
- 新储备:110 ETH, ? USDT
179+
- ? = 20,000,000 ÷ 110 ≈ 181,818 USDT
180+
- 用户获得:200,000 - 181,818 = 18,182 USDT
181+
- 实际价格:18,182 ÷ 10 = 1,818 USDT/ETH //跌
182+
183+
价格下跌!符合供需规律
184+
```
185+
186+
### USDT → ETH 交换
187+
```
188+
同样的池子状态
189+
190+
用户买入用 18,182 USDT:
191+
- 新储备:? ETH, 218,182 USDT
192+
- ? = 20,000,000 ÷ 218,182 ≈ 91.74 ETH
193+
- 用户获得:100 - 91.74 = 8.26 ETH
194+
- 实际价格:18,182 ÷ 8.26 ≈ 2,201 USDT/ETH //涨
195+
196+
价格上涨!也符合供需规律
197+
```
198+
199+
## 手续费的影响
200+
201+
### 现实中的公式(含0.3%手续费)
202+
```solidity
203+
function getAmountOut(
204+
uint amountIn,
205+
uint reserveIn,
206+
uint reserveOut
207+
) pure returns (uint amountOut) {
208+
209+
// 扣除手续费:实际输入 = 输入量 × 99.7%
210+
uint amountInWithFee = amountIn * 997;
211+
uint numerator = amountInWithFee * reserveOut;
212+
uint denominator = reserveIn * 1000 + amountInWithFee;
213+
amountOut = numerator / denominator;
214+
}
215+
```
216+
217+
### 手续费对滑点的影响
218+
```
219+
无手续费情况:
220+
Alice用2,000 USDT买ETH → 获得0.99 ETH
221+
222+
有0.3%手续费:
223+
实际用于交换:2,000 × 99.7% = 1,994 USDT
224+
Alice获得:约0.987 ETH (减少了0.003 ETH)
225+
226+
手续费成本:0.003 ETH ≈ 6 USDT
227+
```
228+
229+
## 📊 实际应用场景
230+
231+
### 套利机会识别
232+
```
233+
Uniswap池子:1 ETH = 2,000 USDT
234+
Binance价格:1 ETH = 2,100 USDT
235+
236+
套利策略:
237+
1. 在Uniswap用USDT买入ETH(便宜)
238+
2. 在Binance卖出ETH换回USDT(昂贵)
239+
3. 重复直到价格趋于一致
240+
241+
这就是价格发现机制!
242+
```
243+
244+
### 流动性深度分析
245+
```
246+
深池子:1000 ETH, 2,000,000 USDT
247+
浅池子:10 ETH, 20,000 USDT
248+
249+
同样买入1 ETH的滑点:
250+
深池子滑点:约0.1%
251+
浅池子滑点:约5%
252+
253+
启示:流动性越深,交换体验越好
254+
```
255+
256+
ps: 本来该开始写代码尝试实现一下这个部分的,不过今天没写,停一下。感觉理解的还不透,总感觉不太形象。明天再试着写吧。
257+
18258
# 2025-08-20
19259

20260
今天又看了V2的内容,这次感觉理解比昨天就清楚多了,还问让G(GPT)老师给举例,渐进式的理解吧。在网上也找了相关视频看了一下。

0 commit comments

Comments
 (0)