DTeam 技术日志

Doer、Delivery、Dream

Uniswap 非权威开发指南(v1 版)

胡键 Posted at — Aug 4, 2020 阅读

作为 defi 系列的第一篇(同时也是微信公众号付费文章的第一篇),我想写写 uniswap,并且从 v1 开始写起。这里面的原因很简单:

这是一篇面向开发者的文章,从中你可以学到:

关于 uniswap 的好处和优点,外面的文章已经说的很多了,我就不在这里浪费口舌,直接进入正题,从协议说起吧。

uniswap 协议(v1)

uniswap v1 的协议并不复杂,这里有篇图解可以帮助开发很快了解它。简单来讲,这里涉及到三个对象:工厂合约、交易所合约和 ERC20 合约。主要的过程如下:

  1. 为要实现兑换的 ERC20 合约创建交易所合约
    • 这是一次性操作。
  2. 增加流动性,第一次放入的流动性决定了交易所的兑换比率。
    • 任何人都提供流动性,成为 provider,但需按同样比例
  3. 兑换,分两种:
    • 直接兑换:进自己的账户
    • 兑换并转账:进第三方账户
  4. 当 provider 希望撤出时,可以移除流动性。

这几个合约之间的关系:

由此可知,在前面的步骤中,除了第一步是与工厂合约交互之外,其余的操作都是与新创建出来的交易所合约进行交互。

流动性挖矿

合约的接口可以看出:交易所合约本身也是 ERC20 合约,这是起什么作用呢?这涉及到一个概念:流动性挖矿。名字虽然起得高大上,但其实说白了就是:作为流动性提供者,可以收取交易过程的手续费。关于手续费:

前面说过:任何人都可以成为流动性提供者,这时就需要一种技术手段来决定每次交易的手续费如何在这些流动性提供者中进行分配。将交易所合约实现为 ERC20 合约则是在这样一个背景下得出的技术选择:

每次兑换的手续费并不会实时反映在 provider 的钱包中,而是记录在交易所合约中(以输入 * 997 bp 的形式体现,剩下的 3bp 就是交易费)。只有在 provider 移除流动性时,合约才会兑现这部分收益,退回等比例的(amount/totalSupply)ETH 和对应的 ERC20

看起来流动性挖矿是一门不错的生意,只要投入本金,接下来就可以坐地分成,有百利而无一害。

可事实是如此吗?这里面需要讲一讲 uniswap 的定价模型。

定价模型和 provider 的风险

uniswap 采用恒定乘积模型来确定兑换价格,对于每一个接触 uniswap 的来讲估计都已经听滥了。但这只是针对 uniswap 自身而言。在开放的市场,一般来讲不会只有一家交易所。虽然 uniswap 工厂合约限定了每个 ERC20 只能对应一个交易所合约,但是脱离于 uniswap 体系,还有其他交易所存在(不论去中心化的,还是中心化的)。

多个交易所存在的事实决定了价格存在差异,而这种差异则为投机者提供了套利空间,它们则是 provider 必须面对的风险。看一下例子演示。

为了简单起见,这里设定一些假设:

假定一个 provider 向 uniswap 交易所合约(ETH <-> A)内注入的流动性是:100 ETH : 100 A。此时,交易所 B 中,1 ETH = 10 A。显然,按照下面的方式进行操作就存在套利空间:

具体演示计算:

两轮下来,即便 provider 是 100% 获得交易的手续费,但其是以损失投入的本金为代价的。以上为例,provider 前后资产的变化,为了方便比较,全部按交易所 B 的价格换算成 A 计:

其损失是显然的。

从另一个方面来讲,这也说明放在 uniswap 交易所合约中的流动性有必要尽可能与公认的价格保持一致。

协议小结

那么最后小节一下,总的来讲,uniswap v1 协议涉及:

本文是付费文章,剩余内容请访问以下链接支付之后继续阅读:

付费链接 (已付费:24)

相关文章