老胡茶室
老胡茶室
Beta

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

胡键

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

  • uiniswap 的名气足够大。
  • 虽然 v2 版已经发布,但并不影响 v1 版的运行。并且,相对于 v2 来讲,v1 要简单很多,作为系列开篇是一个不错的选择。
  • 关于 uniswap 的文章并不少,但真正对开发有价值的文章并不多。有感于自己在近期开发过程中的各种抓瞎,觉得有必要将一些经验和解决办法分享出来。

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

  • uiniswap 的协议
  • sdk 接入指南和关键代码
  • 基于 ganache 的自动化测试
  • 相关公式

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

uniswap 协议(v1)

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

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

这几个合约之间的关系:

  • 工厂合约负责创建交易所合约。
  • 交易所合约与 ERC20 合约一一对应,其作用有两个:
    • 兑换 ETH 和 ERC20
    • 管理流动性

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

流动性挖矿

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

  • ETH <-> ERC20,3bp(1bp = 1‰)
  • ERC20 <-> ERC20,6bp
    • 在 v1 中,这种兑换形式借助 ETH 来完成,相当于两次交易所合约调用。即 ERC20 <-> ETH <-> ERC20。

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

  • 合约会在每位 provider 提供流动性时为他们分配一定份额的 token(具体分配公式没有必要了解,详见合约代码),这个 token 代表了未来能参与利益分配的权益。
  • provider 持有的 token 数与合约的总发行量之比则为其预期可得的利益(ETH 和合约负责兑换的 ERC20)

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

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

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

定价模型和 provider 的风险

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

...
付费内容

本文是付费文章

以上是此文章的预览内容

数字产品一经出售,概不退款