curve,uniswap 是 Defi Developer 的必学协定。在亮神的领导下我把白皮书和源码都过了一遍,但私底下还是要把最重要的局部整顿一下。
背景
Curve V1 要解决的问题就是稳固兑换问题。Uniswap V2 的 AMM 公式 x y= k 的滑点太高了。Curve V1 其实心愿能够没有滑点 1:1 兑换。然而这个显著不太事实。如下图,红色虚线的 Constant Price 是 x + y = const。紫色虚线就是 uniswap 的 AMM 公式,xy=const。 咱们能够看到,红色线的兑换的价格滑点比紫色的小得多。所以,curve 心愿构建一个蓝色的曲线,“尽可能贴合”红色虚线。这就是 curve 的最外围的思维。
公式推导
假如在有 n 个组合的交易池中进行交易,思考极其无滑点状况即永远 1:1 兑换, 即存在守恒量
$$ \sum{x_i} = D $$
其中 xi 为第 i 个代币数量,所有代币数量和为常量。不便起见假如 xi = D/n,思考 uniswap 中存在滑点的常量积公式为
$$\prod{x_i} = (\frac{D}{n})^n$$
公式 1 是一种思考极其无滑点的状况,能够了解为无穷杠杠;公式 2 是一种思考了滑点的状况,等价于 0 杠杠。咱们要去思考在两种极其的状况下取均衡。所以,设置了杠杠率 X,让公式 1 和公式 2 进行线性加权。将以上两个极其状况进行线性组合成为适宜稳固币的报价函数,组合系数选取为 $$\chi{D^{n-1}}$$ 以满足量纲要求。最终失去
$$\chi{D^{n-1}}\sum{x_i} + \prod{x_i} = \chi{D^n} + (\frac{D}{n})^n$$
同时,如果上式始终成立,公式会依赖参数杠杠率 X 进行交易。然而,参数 X 不反对远离现实价格 1.0 的价格。(下面的公式只反对当价格为 $1 的流动性反对)为了保障在任意价格都能提供流动性,这里取组合系数为变量,适当减少了交易数量对价格的影响。curve 工程师们对参数 X 进行了函数定义:
$$ \chi = \frac{A\prod{x_i}}{{(D/n)}^n} $$
这里 A 为常数。由公式可知当每个代币数量均相等时 $$\chi=A$$ 为常数,当不相等时 $$\chi$$ 变小产生更多滑点,公式趋势 amm 模式。最终失去
$$ An^n\sum{x_i} + D = ADn^n + \frac{D^{n+1}}{n^n\prod{x_i}} $$
把下面的公式移我的项目就能够失去 AMM 的最终求根公式:
$$ y^{2}+\left(\frac{D}{A n^{n}}+\sum_{j \neq \text { out}} x_{j}^{\prime}-D\right) y-\frac{D^{n+1}}{A n^{2 n} \prod_{j \neq \text { out}} x_{j}^{\prime}}=0 $$
求解办法
尽管咱们失去了下面的求根公式,然而理论代码里是用牛顿法来求解的:
如图所示,一直在 xi 点做切线,其与横轴交点横坐标得 x{i+1}, 通过这种一直迭代的形式迫近函数零点。迭代公式为
$$x_{i+1} = x_i-\frac{f(x_i)}{f'(x_i)}$$
最初
vyper 这个语言跟 python 如同~~~