@@ -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