Price Curve Slippage Point and Constant Product (k) Line
基于下面的例子, 我们会画一个完整的「Uniswap V2 交易曲线」示意图:
初始池:1000 A + 2000 B
用户:用 100 A 兑换 B
手续费:0.3%
实际输出:≈ 181.64 B
恒定积 ( k = 2{,}000{,}000 )
🧮 一、恒定积模型原理
Uniswap V2 的价格机制遵循:
[
x \times y = k
]
在坐标平面上:
- x 轴 = Token A 储备
- y 轴 = Token B 储备
- 曲线 ( y = \frac{k}{x} ) 是一条双曲线(即恒定积曲线)
📈 二、交易前后的储备与价格变化示意图
1 | y轴: Token B 储备 |
🟢 点 P₀:初始状态
- ( reserveA = 1000 )
- ( reserveB = 2000 )
- ( P_A = reserveB / reserveA = 2.0 )
🔵 点 P₁:交易后状态
- ( reserveA’ = 1099.7 )
- ( reserveB’ = 1818.36 )
- ( P_A’ = 1818.36 / 1099.7 = 1.653 )
- 实际成交均价约 1.8164(中间价格)
📉 三、滑点(Slippage)展示
| 项目 | 含义 | 数值 |
|---|---|---|
| 初始价格 | ( 1A = 2B ) | 2.000 |
| 交易后瞬时价格 | ( 1A = 1.653B ) | 1.653 |
| 实际成交均价 | 平均约 1.816B | 1.816 |
| 滑点比例 | ( (2 - 1.816) / 2 ) | 9.2% |
🧠 解释:
用户预期 1A=2B,但由于交易影响价格曲线,使池内的 A 增多、B 减少,价格被推低,
因此最终实际获得的平均兑换比例变差。
🔄 四、k 恒定线变化对比
| 状态 | reserveA | reserveB | A×B = k | 备注 |
|---|---|---|---|---|
| 交易前 | 1000 | 2000 | 2,000,000 | 初始状态 |
| 交易后(理论恒定) | 1099.7 | 1818.36 | ≈2,000,000 | 恒定积保持 |
| 实际变化(含手续费) | 部分 k 增加 | → 手续费流入池中,k 略增大 |
手续费 0.3% 进入池子,使得流动性提供者 (LP) 的 k 略上升,
相当于 LP 赚取了一点手续费收入。
🪙 五、交易动态路径说明
1 | 交易过程(从 P₀ 到 P₁): |
在曲线上移动的轨迹表示价格逐渐变化的路径,
价格不是跳变,而是沿曲线连续变化的。
🧭 六、图像总结(文字版思维导图)
1 | 恒定积公式: x * y = k |
🧩 七、关键理解总结
| 概念 | 解释 |
|---|---|
| k 恒定曲线 | 确保交易自动计算价格,不需要订单簿 |
| 滑点 | 交易越大,占池子越多,价格偏离越明显 |
| 手续费 | 每笔 0.3% 计入流动性池,增强 LP 收益 |
| 价格动态性 | 交易沿曲线移动,而非线性固定价格 |
| k 的微增 | 因手续费注入,流动性略微提升 |
好——下面我把之前的恒积曲线 (y=\dfrac{k}{x}) 用两种形式画出来:
- 一份 ASCII 文字图(便于在终端或纯文本环境查看),
- 一份 SVG 矢量图源码(可直接复制到
.svg查看器 / 浏览器中,或嵌入 HTML,用于精确展示)。
我会在图上明确标出:初始点 (P_0(1000,2000))、交易后点 (P_1(1099.7,;1818.6778))、滑点范围、以及曲线方向箭头。
下面先给出关键数值(逐位计算,便于复核):
- 初始储备:
reserveA = 1000,reserveB = 2000。 - 恒定积:(k = 1000 \times 2000 = 2{,}000{,}000)。
- 用户输入:
amountIn = 100(Token A)。 - 手续费 0.3%,因此
amountInWithFee = 100 × 0.997 = 99.7。 - 交易后 A 储备:(x’ = 1000 + 99.7 = 1099.7)。
- 交易后 B 储备:(y’ = k / x’ = 2{,}000{,}000 / 1099.7 \approx 1818.67782122397)。
- 用户获得 B:
amountOut = 2000 - y' ≈ 181.32217877603。 - 说明:交易使价格由 1A=2B 降到瞬时价格约 (1A \approx 1.653B)(池内瞬时比值),而用户成交的平均价格约 (1.816B)(见前述推导)。
一、ASCII 版本(文字示意图)
说明:ASCII 用字符网格近似表示曲线位置、P₀、P₁ 与滑点区域(非精确图形,但能直观看出移动方向与相对位置)。
1 | Token B 储备 (y) |
二、SVG 版本(可复制为 .svg 文件并在浏览器打开)
下面是一个完整的 SVG 文本(宽 900px × 高 600px),它绘制了 (y=k/x) 的曲线(在 x 范围 600…1600),并标注了 P₀、P₁、滑点箭头与说明文字。你可直接把下列内容保存为 uniswap_curve.svg 然后在浏览器打开,或在 README/网页中嵌入 <svg>...</svg>。
1 |
|
说明(关于 SVG 中的映射与精度):
- 为了把数学坐标映射到 SVG 像素,我对 x,y 做了线性缩放(在注释处给出公式);
- 曲线路径做了近似采样与手工平滑绘制以保证视觉美观;关键点 P₀、P₁ 的像素位置按精确数值计算并标注(你可按需用更高采样密度替换曲线路径以提高精确度)。
✅ 这里是完整的结果,包括两种可视化形式:
1️⃣ 数学真实曲线 (SVG/图形版)
上面的图展示了 Uniswap v2 的恒定乘积曲线 ( y = \frac{k}{x} ),其中:
-
P₀ (绿色点):交易前储备状态
- ReserveA = 1000
- ReserveB = 2000
- ( P₀ = \frac{2000}{1000} = 2 )
-
P₁ (红色点):交易后储备状态
- ReserveA = 1100
- ReserveB ≈ 1818.18
- ( P₁ = \frac{1818.18}{1100} ≈ 1.653 )
-
蓝色箭头表示交易方向(用户加入 A → 储备A上升 → 储备B下降)
-
曲线向右下弯曲说明:随着 A 储备增加,B 储备减少,价格曲线非线性,滑点出现。
2️⃣ ASCII 文字版示意图
1 | Token B Reserve (y) |
解释总结:
| 项目 | 说明 |
|---|---|
| k = x × y | 恒定乘积不变,曲线满足 y = k/x |
| 滑点产生 | 因为曲线非线性,加入 100 A 不会线性换出 200 B,而是少于 200 |
| 价格变化 | 交易前 1A = 2B,交易后 1A ≈ 1.653B |
| k 恒定线 | 图中曲线即为 “k 恒定线”,任何交易都在曲线上移动,但不离开它 |
| 视觉方向 | 从左上到右下,表示 “买入 A 会导致 B 价格上涨(A 贬值)” |