Uniswap基础知识

Catalogue
  1. 1. Uniswap 的流动性
  2. 2. ETH ⇄ ERC20 交易
  3. 3. ERC20 ⇄ ERC20 交易
  4. 4. 交易费用构成
  5. 5. 套利交易
  6. 6. 参考资料

Uniswap 是一个基于以太坊的协议,旨在实现 ETH 和 ERC20 代币数字资产之间的自动兑换,即去中心化的交易所。Uniswap 也可以被认为是一个 DeFi(去中心化金融)项目,因为它寻求利用其去中心化协议,消除参与数字资产交易流程的中间人。

官网:https://uniswap.org/
Github: https://github.com/Uniswap

Uniswap 由两种类型的智能合约组成:

  • 一个交易合约 (exchange contract)
  • 一个工厂合约 (factory contract)

这些合约都由 Vyper 智能合约编程语言所编写,而且它们是 Uniswap 协议功能的核心。一个交易合约只支持一种 ERC20 代币,而且每个交易合约都储备了 ETH 和所支持的 ERC20 代币。这意味着在一个特定交易合约上执行的交易,是基于合约中存储的 ETH 和 ERC20 代币的相对供应量。在交易合约中执行的交易,也可以是通过将 ETH 作为中介来实现 ERC20 与 ERC20 之间的直接交易。

工厂合约可用于部署一个新的交易合约,因此,尚未拥有交易合约的 ERC20 代币都可以通过工厂合约来创建一个交易合约。createExchange() 函数允许任何以太坊用户利用工厂合约部署一个交易合约。还需要注意的是,工厂合约被用作 Uniswap 交易合约的注册表,这意味着工厂合约可用于查询被添加进系统中的所有代币和交易地址。当一个交易合约发布时,工厂合约不会对代币进行检查(除了需要检查每个交易合约只支持一种代币的约束意外),因此,用户应该只与他们完全信任的交易合约进行交互。

Uniswap 的流动性

Uniswap 协议的设计架构不同于传统数字资产交易所中的模型。大多数传统交易所会维护一个订单簿并用于匹配特定资产的买家和卖家。而 Uniswap 利用**流动性储备 (liquidity reserves) **来在协议中实现数字资产的交易。

交易合约的流动性储备由网络中的流动性提供者 (liquidity providers) 提供。这些流动性提供者将等价的 ETH 和 ERC20 代币存入特定的 ERC20 代币交易合约之中。第一个向某个交易合约提供流动性的流动性提供者将首先设定 ETH 和该交易合约中相应的 ERC20 代币之间的兑换率。流动性提供者通过存入他们认为等价的 ETH 和该合约支持的 ERC20 代币来设定这个兑换率的。如果流动性提供者设定的兑换率与更广泛的加密货币交易市场不一致,那么套利的交易者会把 ETH 和 ERC20 代币间的兑换率引向市场上所认为的正确兑换率上。因此,所有后续的流动性提供者将会使用自己存入资产时的兑换率来存入流动性。

Uniswap 还使用所谓的“流动性代币” (liquidity tokens),这些代币本身符合 ERC20 标准。这些代币可以视为流动性提供者对交易合约贡献的一种表示。Uniswap 限制每个交易合约只能支持一种 ERC20 代币的背后原理是为了鼓励流动性提供者将他们的流动性资产集中到单一的储备中。Uniswap 通过铸造流动性代币来追踪每个流动性提供者贡献给总储备的相对比例。流动性提供者能够在他们选择的时间对他们的流动性代币进行销毁,从而他们可以从交易合约中取出他们的 ETH 和 ERC20 代币的比例份额。

流动性提供者可以选择出售或者转让其流动性代币,而不必从交易合约中移除流动性。然而,Uniswap 的流动性代币被严格地指定于一个交易合约。与 Uniswap 协议相关联的单一原生数字资产是不存在的。流动性提供者还可以通过调用 addLiquidity() 函数往交易合约存入流动性。作为提供流动性的奖励,流动性提供者在交易执行时会获得一定比例的交易手续费。

ETH ⇄ ERC20 交易

能在 Uniswap 协议中执行的其中一类交易是将 ETH 与任何特定的 ERC20 代币进行兑换。如前文所述,ETH 和某种 ERC20 代币之间的兑换率基于交易合约中各资产流动性池的相对大小。兑换率是建立这个在 Uniswap 的不变式之上:ETH pool * token pool = invariant (不变量)。在执行 Uniswap 协议上的任何交易期间,invariant (不变量)会保持不变。此外,只有当交易合约中的流动性增加或减少时,不变量才会发生变化。

例如:Bob 希望发起一笔交易,用于把 1 ETH 兑换为 ERC20 代币 BAT。Bob 将使用一个 Uniswap 协议上现有的交易合约来执行此交易。流动性提供者已将一定数量的 ETH 和 BAT 存入该交易合约,就本例而言,假设为 10 ETH 和 500 BAT。底层的不变式被设置为:ETH pool * BAT pool = invariant (不变量),也即:

1
2
3
ETH pool = 10
BAT pool = 500
Invariant = 10 * 500 = 5,000

Bob 通过发送 1 ETH 到交易合约的 ETH 池中来发起他交易,在此基础上扣除 0.3% 作为给流动性提供者的费用。剩下的 0.997 ETH 被添加到 ETH 池子中。然后,用不变量除以新的 ETH 总量以确定 BAT 池子的最新大小。然后,剩余的 BAT 代币会被发送给买家,在本例中买家为 Bob。也即:

1
2
3
4
5
6
7
Bob 发送:1 ETH
手续费:0.003 ETH

ETH pool = 10 + (1 – 0.003) = 10.997
BAT pool = 5000/10.997 = 454.67

Bob 收到:500 – 454.67 = 45.33 BAT

支付给流动性提供者的手续费在先前 Bob 发起交易时被扣除,现在这笔手续费又被加入到流动性池子中 (这意味着不变量会增加)。这起到了向流动性提供者支付费用的作用,当这些提供者从市场中移除他们的流动性贡献时,他们就可以获取这些费用。由于这笔费用在价格计算后重新被加入,随着在交易合约上的每笔交易被执行,不变量逐渐增大,使得把流动性存入一个交易合约的行为对于流动性提供者来说是一种有利可图的行为。此时:

1
2
3
4
ETH pool = 10.997 + 0.003 = 11
BAT pool = 454.67

新的不变量 (invariant) = 5,001.37

在这次交易中,Bob 获取 BAT 的兑换率为 45.33 BAT/ETH。

  • 输入:1 ETH
  • 输出:45.33 BAT
  • 兑换率 = 45.33 BAT/ETH

ERC20 ⇄ ERC20 交易

能在 Uniswap 协议中执行的另一类交易是将某种 ERC20 代币与另一种 ERC20 代币进行兑换。由于 ETH 用作所有 ERC20 代币的公共交易对,Uniswap 将 ETH 用作 ERC20 和 ERC20 之间直接交易的中介资产。比如,Uniswap 可以在某个交易合约中将 BAT 代币兑换成 ETH,然后在另一个交易合约中将这部分 ETH 兑换成 OMG,所有这些都是在一笔交易种完成的,从而使得任何两种 ERC20 代币之间得兑换成为可能。

交易费用构成

在协议上执行交易的 Uniswap 费用的构成如下:

  • ETH 兑换为 ERC20:支付 0.3% 的 ETH。
  • ERC20 兑换为 ETH:支付 0.3% 的 ERC20 代币。
  • ERC20 兑换为 ERC20:支付 0.3% 的 ERC20 代币 (针对将某种 ERC20 代币兑换为 ETH) 和 0.3% 的 ETH (针对将 ETH 再兑换为另一种 ERC20 代币)。

套利交易

值得主要的是,虽然 Uniswap 是一个去中心化的链上数字资产交易所,但是它不是为了替代中心化交易所而存在的。当 Uniswap 上的交易机制出现偏差时,这里的意思是 Uniswap 上兑换率偏高或偏低,那么必须存在一个纠正错误的机制。这个机制以套利交易的形式存在。

套利交易 (arbitrage trading) 可以被很好地理解为交易者利用两个市场之间存在的价格差进行交易获利的策略。在加密货币的情况下,这种价格差可以在加密货币交易所之间的数字资产价格差异中找到。如果交易者发现了套利的机会,那么他们会在一个交易所中购买数字资产,然后在另一个加密货币交易所中出售。套利交易对于 Uniswap 的运作至关重要,这是因为交易者可以利用其他加密货币交易所的兑换率来纠正 Uniswap 上可能出现的价格偏差。

参考资料