Uniswap 是一个基于以太坊的协议,旨在实现 ETH 和 ERC20 代币数字资产之间的自动兑换。Uniswap 是一个完全的链上协议,个人只要安装了 MetaMask 就可以使用该协议。Uniswap 也可以被认为是一个 DeFi(去中心化金融)项目,因为它寻求利用其去中心化协议,消除参与数字资产交易流程的中间人。
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() 函数往交易合约存入流动性。作为提供流动性的奖励,流动性提供者在交易执行时会获得一定比例的交易手续费。
在 Uniswap 进行交易:ETH ⇄ ERC20 交易
能在 Uniswap 协议中执行的其中一类交易是将 ETH 与任何特定的 ERC20 代币进行兑换。如前文所述,ETH 和某种 ERC20 代币之间的兑换率基于交易合约中各资产流动性池的相对大小。兑换率是建立这个在 Uniswap 的不变式之上:ETH pool * token pool = invariant (不变量)。在执行 Uniswap 协议上的任何交易期间,invariant (不变量)会保持不变。此外,只有当交易合约中的流动性增加或减少时,不变量才会发生变化。
例子 ETH ⇄ BAT:Bob 希望发起一笔交易,用于把 1 ETH 兑换为 ERC20 代币 BAT。Bob 将使用一个 Uniswap 协议上现有的交易合约来执行此交易。流动性提供者已将一定数量的 ETH 和 BAT 存入该交易合约,就本例而言,假设为 10 ETH 和 500 BAT。底层的不变式被设置为:ETH pool * BAT pool = invariant (不变量),也即:
- 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。也即:
- 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 发起交易时被扣除,现在这笔手续费又被加入到流动性池子中 (这意味着不变量会增加)。这起到了向流动性提供者支付费用的作用,当这些提供者从市场中移除他们的流动性贡献时,他们就可以获取这些费用。由于这笔费用在价格计算后重新被加入,随着在交易合约上的每笔交易被执行,不变量逐渐增大,使得把流动性存入一个交易合约的行为对于流动性提供者来说是一种有利可图的行为。此时:
- 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
在 Uniswap 进行交易: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 采用的用于确定代币间兑换率的不变式取自于 Vitalik Buterin 在2018年3月发表的一篇文章。在该文章中,ERC20 代币的兑换率按照一下公式计算:
x * y = k
k 是一个不变的常量,x和y表示在特定的交易中可用的 ETH 和 ERC20 代币的数量,在 Uniswap 的情况下,x 和 y 就是在特定交易合约中可用的 ETH 和 ERC20 代币的数量。利用这个公式,代币的兑换率将始终是上述公式产生的曲线上的某个点。见下图。
x*y=k 公式是 Uniswap 协议中不可分割的一部分,而且 Vitalik Buterin 使用下面所示的图,以如下方式进行描述:
根据该公式,一个合约 (在本例中为 Uniswap 的交易合约) 将会持有x个代币A和y个代币B。这个合约将维持不变量使得 x * y = k 始终成立。任何个人都可以通过有效地改变做市商在 x * y 曲线上的头寸 (position) 来买卖该合约中的代币。将做市商的头寸向右移动意味着,一笔交易向右移动的金额就是交易员必须输入的代币A的量 (即通过输入代币A来兑换代币B)。相应地,做市商的头寸向下移动的量是交易者应该买入多少代币B。
假设代币B是 ETH,代币A是任何特定的 ERC20 代币,我们可以看到它们是如何利用公式x * y = k进行运转的。如果 Alice 决定购买一大批特定的 ERC20 代币,这将使得交易合约中的 ERC20 代币的短缺以及 ETH 的增加。Alice 的购买结果是把兑换率移动到 x * y = k 曲线上的一个不同的点。也即红点将会向左移动,这意味着购买更多 ERC20 代币会变得更加昂贵。ETH 和 ERC20 代币的相对供应量可以被认为是 ERC20 代币供需的反映,这最终会决定兑换率价值。
如前文所述,流动性往交易合约的首次存入并非由兑换率所决定。相反,流动性提供者将会存入一定数量的 ETH 和 ERC20 代币,这反映了他们心中 ETH 和 ERC20 代币间的兑换率值。如果 ETH 和 ERC20 代币被认为是太便宜或者太贵,那么套利交易者就会受到激励去把价格带到市场认为正确的价格上。
Uniswap 和套利交易
值得主要的是,虽然 Uniswap 是一个去中心化的链上数字资产交易所,但是它不是为了替代中心化交易所而存在的。当 Uniswap 上的交易机制出现偏差时(笔者注:这里的意思是 Uniswap 上兑换率偏高或偏低),那么必须存在一个纠正错误的机制。这个机制以套利交易的形式存在。
套利交易 (arbitrage trading) 可以被很好地理解为交易者利用两个市场之间存在的价格差进行交易获利的策略。在加密货币的情况下,这种价格差可以在加密货币交易所之间的数字资产价格差异中找到。如果交易者发现了套利的机会,那么他们会在一个交易所中购买数字资产,然后在另一个加密货币交易所中出售。套利交易对于 Uniswap 的运作至关重要,这是因为交易者可以利用其他加密货币交易所的兑换率来纠正 Uniswap 上可能出现的价格偏差。
Uniswap 和 Gas
使用 Uniswap 协议进行数字资产兑换的其中一个优点是它十分节约 gas。在 Uniswap 上进行交易时所产生的 gas 成本相对来说比其他去中心化交易所更加便宜。正如下面展示的 gas 基准:ETH 至 ERC20,ERC20 至 ETH 以及 ERC20 至 ERC20 的转换明显比 Bancor,EtherDelta 等交易所更加便宜。****
*节约 gas 只是 Uniswap 协议的其中一个优点,更多的优点*包括:
- Uniswap 是去中心化的,因此它的运作不依赖于第三方。此外,希望连接到该协议的任何人都可以自由访问 Uniswap。
- 与其他数字资产交易所相比,在 Uniswap 上进行交易的成本相对较低。
- Uniswap 允许任何用户为任何特定的 ERC20 代币创建交易合约。
然而,Uniswap 确实有它的局限性:
- Uniswap 确实依靠套利交易来控制协议中代币的交易价格。这意味着 Uniswap 依靠其他数字资产交易所的存在来保持兑换率的平衡。
- Uniswap 仍处于试验阶段,仍需要对协议进行更多的改进以了解它在促进数字资产交易方面的有效性。
结论
总之,Uniswap 代表了以太坊生态内支持数字资产交易的重要一步,正因它使得资产交易得的流程变得更加有效。Uniswap 仍然处于初期阶段,但是,看着这一创新的协议在未来如何发展将是一件有趣的事情。
版权归原作者 EVAyyds 所有, 如有侵权,请联系我们删除。