Uniswap 是最近几年很火的代币交易协议。和币安,Coinbase 这种中心化交易所不同,Uniswap 提供了一种去中心化的代币间交易方式,背后有着简单但又非常有趣的数学原理。

中心化交易所如何运作

首先,我们来想象一下,一场交易是如何达成的。比如说,A 想用 100 元价格买一袋大米。他把这个意愿告诉了想要卖大米的人。这个时候,如果有另一个人也愿意把自己的大米用 100 元卖出去,那么交易就可以成立了。为了让交易更加容易达成,我们需要创造一个平台,让想要买卖大米的人把他们能接受的价格广播出去。现实中就有这样的平台,比如咸鱼,淘宝等等。

买卖大米之类的物品,淘宝咸鱼就可以了。但是如果要买卖股票,加密货币这种类型的资产,我们就需要更加高效的方式。这主要是因为两个原因:

  1. 同一种资产,在同一个时间点,每一份是同质的。比如都是比特币,对于交易者来说,只要价格一样,A 的和 B 的没有区别。
  2. 这种类型的资产价格变化很快,不能再用这种人工的匹配方式。

为了解决这个问题,就有了现在常见的*中心化交易所 (Centralized Exchange or CEX)*。所有想要买卖某种资产的人把自己想要的价格发布到交易所,交易所自动把买卖双方按照价格匹配起来。比如下图在交易平台非常常见。绿色表示买方的出价,红色表示卖房的要价。红绿两遍是不会有重合的,因为一旦有重合,系统就会匹配买方卖方达成交易,从图上移除。
order_book_depth_chart

这种将买卖双发匹配起来的系统,也叫做 Market Maker

如何提高 Liquidity

Liquidity 表示市场的流动性。具体来说,就是匹配买卖双方的难易程度。如果一个市场的 liquidity 很低,交易就很难达成。如果交易一直很难达成,交易者就不愿意来到这个市场交易,liquidity 就会更低。这样就成了一个负反馈。

因此,交易所会努力地提高自己的 liquidity。对于中心化交易所,它们增加 liquidity 的方式,就是依赖于职业交易者或者金融机构。这些人通过给出各种不同报价的方式与市场上的其他交易者交易,通过差价赚取收益,同时也增加了交易所的 liquidity。

Uniswap 如何运作

上面介绍了传统中心化交易所的简单原理,接下来我们来看看 Uniswap 是如何工作的。Uniswap 经历了三个版本。虽然每个版本相对于之前都有一些新特性,但是它的核心思路在 V1 就奠定了。接下来,我们先介绍一下去中性化交易所的基本逻辑,然后再着重介绍 Uniswap 的工作原理。

去中心化交易所的要素

去中心化交易所 (Decentralized Exchange or DEX) 和传统的中心化交易所不同,不存在一个 owner,任何人都可以进入进行交易。我感觉这也是它为什么会收到加密货币狂热者的拥护。然而作为一个交易所,它还是需要保证两部分功能:

  1. Market Maker: 由于是去中心化的,我们不再有一个平台来做 market maker。DEX 需要实现某种 *Automated Market Maker (AMM)*。
  2. Liquidity: 要让交易顺利进行,DEX 也需要保证有充足的 liquidity。

一般来说,DEX 会通过经济收益(一般是交易费用)来吸引人们将自己持有的资产 deposit 到 DEX 中作为 liquidity pool。AMM 让交易者可以和 liquidity pool 直接并且随时做交易。

Uniswap: x * y = k 模型

$x * y = k$ 模型可以说是 Uniswap 的核心逻辑,从 V1 就开始使用了。之后的版本也都基于这个模型。这个模型的逻辑很简单,就是要保证 liquidity pool 中两种资产的数量乘积是一个常数。我们接下来用 ETH 和 USDT 这两种币之间的交易作为例子。为了理解起来更容易,以下都假设没有交易费用。

首先,需要有人愿意把自己持有的 ETH 和 USDT 按照特定的比例存到 Uniswap 的 liquidity pool 中(这个特定的比例就是 liquidiy pool 中当前 ETH 和 USDT 的比例)。每一个存入资产到 liquidity pool 的人,都可以获得 liquidity token。拥有 token 的数量占总数的比重决定了这个人能获得百分之多少的交易费用。

一旦我们有了这个 liquidity pool,交易者就可以进行交易了。比如说现在 pool 中有 100 个 ETH 和 200K 个 USDT,两者数额的乘积是 20M。我想用把 1 ETH 换成 USDT,那么首先我的这个 ETH 会进入这个 pool 中。此时 pool 里就会有 101 个 ETH,为了满足乘积为常数的条件,USDT 的数额应该约等于 198019.8。那么原本 200K 个 USDT 多出来的那部分(1980.2 USDT)就会成为我买到的 USDT。

可以看到,ETH 和 USDT 的交易价格和 liquidity pool 中两种资产数额的比值有关。
$$Price = \frac{\Delta USDT}{\Delta ETH} = \frac{USDT}{ETH + \Delta ETH}$$

FAQ 1: 交易之后比例不是变了吗

确实,交易之后两种资产的数额比例发生了变化,价格当然也变了。就拿上面的例子来说,交易完之后,ETH 和 USDT 的比值变大了。这个时候如果有人再用 1 个 ETH 买 USDT,获得的 USDT 的数额就会变小。这个问题有个专门的词叫 slippage

这个价格的“不正确”虽然是个问题,但是在实际交易中几乎不会出现。还是拿上面这个例子来说,在我交易完之后,虽然 ETH 买 USDT 亏了,但是反过来却可以用更少的 USDT 去买 ETH。 因此一定会人来套利,因此价格会一直不断的围绕着市价波动。

另外,如果 liquidity pool 很大,其实小额的交易对价格的影响也很小。

FAQ 2: 如果有人存入或者提取 liquidity,x * y 不就不是常数了吗

是的。$x * y$ 这个不变量在存入和提取 liquidity 的时候不需要保持不变。

FAQ 3: 为什么存入或提取 liquidity 要按照比例存入两种资产

这是因为我们要保证这两种操作不会影响资产的价格。

FAQ 4: 第一次存入 liquidity 怎么决定比例

Uniswap 使用了一种非常巧妙的方式。它不强求第一次存入的比例,只是定义了第一次存入能获得的 liquidity token 是两种资产数额乘积的根号值。这样,如果存入者想要用最少的资金获得最多的 token,就需要按照市价对应的比例存入,我们来简单证明一下。比如说 1 个 ETH 值 400 USDT,那么为了获得 20 个 token,需要存入 $x(ETH) + \frac{400}{x}(USDT)$。把 ETH 代换成 400 USDT 就可以得到,为了获得 20 个 token,需要付出等价于 $400x + \frac{400}{x}$ USDT 的资产。显然当 $x = 1$ 时,这个值最小。也就是说,liquidity provider 会收到利益的驱使,用合适的比例存入。

当然,如果有人非要瞎鸡儿存,也会有套利的人让这个比例恢复正确。

总结

Uniswap 的基本原理大概就是这样。一个简单的公式,再加上一点基本的博弈论,就能构建出一个非常实用的交易所。不过吧,我还是很难理解为什么不使用中心化交易所来兑换。在写这篇博客的时候,Uniswap 的平均 gas 数量大约是 140K,一个 gas 算 90 Gwei 的话,一次 swap 单是 gas fee 就要 0.013 ETH。即使在币圈大跌的今天,也要 30 多美金。这还没有算上千分之三的 fee。如果从自己的钱包转到交易所,兑换之后再转回来,总共费用可能也就几美金。这么对比下来,还是 CEX 真香警告吧?你觉得呢?