自动做市商介绍

最近区块链上DeFi很火,我就去了解一下,和以前玩法有什么不一样。看下来发现除了以前就有的借贷和交易所,还有四个比较有趣的东西是以前没有的。

  1. 自动做市商(Uniswap)
  2. 智能合约理财 (yearn)
  3. 闪电贷 (Aave)
  4. 有抵押稳定币 (MakerDao)

自动做市商和闪电贷这两个技术让我惊叹。今天先介绍一下自动做市商的机制。

传统的交易所会维护一个订单簿,记录了所有买的价格和卖的价格。交易所会撮合同一价格的买卖双方成交。我之前在eos上写过一个这样的交易所。但是撮合的逻辑非常重,经常在撮合大单的时候跑完cpu。本来打算写第二个版本,把撮合交给别人来做,并且支付手续费作为奖励(如果做成了现在就是撮合挖矿了。。。)。结果eos价格一落千丈我也没有信心继续完成这个版本。

而自动做市商没有订单簿,取而代之的是一个包含交易对双方币种的资金池,这两个币种的总价值是1:1。比如总价值1000美元的ETH-DAI交易对的资金池中有1个ETH和500个DAI(DAI是一种等价美元的稳定币,1 usd = 1 dai)。这时候就可以得出一个ETH的价格就是500美元。任何时候我们都可以向资金池中以1:1的价值放入两种代币,而我们就会一定比例的占有这个资金池,合约会给我们LP token作为拥有部分资金池的证明。当交易发生的时候,合约会收取一定的手续费,存入资金池。资金池的价值就会升高,我们拥有的价值也会升高。

当我想要进行交易的时候合约又是如何判断价格的呢?Uniswap用了一种开创式的算法:设我们有Y个ETH,X个DAI。合约保证X * Y在交易前后不变。也就是当我们需要用x个DAI购买ETH的时候,合约会给我们y个ETH使得

X * Y = (X - b) * (Y + a)

为什么是乘积保持不变,而不是某种类似X/Y之类的公式来代表价格?这就要从价格说起。

在Uniswap中价格是由资金池中两种货币的数量比例决定的。当交易发生的时候,必定会导致比例变化并且造成价格变动。交易需要一个价格,而价格又被交易改变。我们可以用一个微分方程来表示一笔交易:

假设我们用x个DAI能够购买ETH的数量为y(x),当前有Y个ETH和X个DAI。当x趋向于无穷小的时候,可以假定币的数量比例在交易前后不发生变化则成交价格就是X/Y得出公式

dy / dx = Y / X

在已经交易了x个DAI的情况下,公式为

dy / dx = (Y - y(x)) / (X + x)
=> dy = (Y - y(x)) * dx / (X + x)

我们把dy从0到n积分的结果就等于y(n)

S dy = S (Y - y(x)) * dx / (X + x)
=> y(n) = S (Y - y(x)) * dx / (X + x)

而这个微分方程的解为

y(x) = xY / (X + x)
=> XY = (X + x) * (Y - y(x))

这个简单的规则完美的计算出了价格。

资金池中的价值并不是一直不变的,他会随着币价的变化而变化。这里我们仅考虑一边为稳定币的情况,如果我们持有ETH-DAI的LP Token,我们的风险是持有ETH的人的平方根。(当然手续费会让LP Token的价值稳定上涨)

假设资金池中有Y个ETH,X个DAI。当前的ETH价格为X/Y。这个时候我们引入一个交易,使得资金池中产生了一些变化使得X变成a*X,Y变成Y/a(使用比例来表示变化更加简洁易懂)。这时资金池还是维持了X * Y = (a * X * Y / a) = k。而我们的价格变成了a^2 * X / Y。我们分别对比全部持有DAI,全部持有ETH和全部注入资金池三个情况下美元结算的结果:

  全部持有DAI 全部持有ETH 资金池 价格
之前 (2 * X) DAI (2 * Y) ETH = (2 * X) DAI X DAI, Y ETH = 2 * X DAI X / Y
之后 (2 * X) DAI (2 * Y) ETH = (2 * a^2 * X) DAI a * X DAI, Y / a ETH = 2 * a * X DAI a ^ 2 * X / Y
价值变化比例 1 a^2 a a^2

提供流动性也需要承担一定的ETH价格变动的风险,但是会比单纯持有ETH的风险降低为平方根倍。这些就是自动做市商的巧妙设计。