Uniswap 是一个运行在以太坊区块链上的流动性协议,支持免信任的代币互换,也即是说,该交易所上的所有交易都是由智能合约自动执行的,用户无需依靠某个中介也无需信任某个第三方。这种去中心化的代币互换方案已经证实在 ERC20 代币的持有者群体中很吃香,他们愿意使用 Uniswap 来交易代币并为不同的交易对提供流动性。
Uniswap 在 2020 年 3 月 19 日在以太坊主网上推出了一个新版本,还配合着公开了核心合约的 1.0.1 版;在发行之前,该版本已经在 Rinkeby 测试网上测试过一段时间了。截至撰文之时,这个新版本在以太坊主网上已经使用超过了两个月时间,而且迄今为止,没有出现任何损坏智能合约完整性的问题。
不论你是持有还是在交易密码学货币,是在搞以太坊开发还是做宽泛的金融科技业务,都有必要了解一下 Uniswap,它在 2020 年的第三季度随着 DeFi 概念的崛起迎来了快速的增长。所谓一项独立的服务,Uniswap 也可以集成到第三方的数字钱包和 dApp 中。此外,其它智能合约也可以拿 Uniswap 作为基础来开展服务。
本文旨在向读者介绍 Uniswap V2 带来的增强功能,并详细介绍其主要特性。
Uniswap V1 为链上代币互换和去中心化流动性池定下了基调,就是向交易代币的用户收取少量手续费、以此给提供流动性用户以奖励。
Uniswap V1 使用的不是链上订单簿,正相反,代币的交换比率是用一个叫做 “恒定乘积公式” 的算法来确定的,相当于提供了一种机制来保持一种代币的体量在所在交易对中的平衡。这个我们后面会进一步介绍。
底层的代币交易对(例如 DAI 对 ETH,或者 DAI 对 USDC)各有各的流动性池,用户可以通过同时存入两种相应的代币来提供流动性。流动性提供者可以得到所在流动性池中代币交易的手续费作为奖励,手续费率为 0.3%,流动性提供者之间按份额分配 —— 份额的大小,端看你注入流动性池的代币数量占整个流动性池数量的比重。
要是读者不太了解 Uniswap,我曾写过的一篇基于 Uniswap V1 的解释性文章肯定有所帮助 —— 在那篇文章中我解释了协议的整个机制、交易比例是如何计算出来的、流动性提供者如何能赚到佣金、使用 Uniswap 的好处和缺点,等等。见此处。
(编者注:想了解更多关于 Uniswap 的细节,可见文末超链接)
Uniswap V2 给协议带来了一系列的升级和增强功能。主要的更新包括:
ERC20 对 ERC20 代币的交易对。即,不再需要 ETH 作为中介代币来协助两种 ERC2O 代币的互换过程。移除这个硬性要求可以减少一半的交易数量,也能节约交易的 Gas 费。也因此,dApp 可以在缺乏直接的代币互换池子的时候,更高效地发现从一种代币到另一种代币的 “路由”。这一部分我们后文还会详细讲。
价格信息传输功能,每个区块都能基于按时间加权平均的定价方式为交易对刷新价格。这一部分我们后文也会详细讲解。
闪电互换,或者说你可以从 Uniswap 流动性池中 “借出” 代币、用于与任意的外部服务交互、然后 还清 你的初始贷款,所有操作都要放在一笔交易内。这样的交易是原子化的,意思是说,交易中的任何一个操作失败,都是导致整笔交易失败、被改动的状态完全回复。这种功能的一个显而易见的用途就是利用流动性来做套利交易,但也有别的用途,比如为特定的 DeFi 操作节约 Gas 费,例如关闭 Maker 金库。(编者注:想进一步理解闪电互换的原理,可见文末超链接《一笔交易能做什么》)
支持不标准的 ERC20 代币。办法是将返回 void 类型的 transfer() 和 transferFrom() 的函数调用也视作成功的 transfer (转移)操作。这个功能看起来毫不起眼,但其实,许多主流代币比如 USDT(Tether)和 BNB(币安币)的 transfer 方法都会产生这样的返回值。支持这些广泛接受、但不完全遵守 ERC20 标准的代币,增强了 Uniswap 在链上交易所中的优势。
额外的功能性方法,用于防止用户所转移的代币数量超过 Solidity 编程语言所能支持的最大数量时出现溢出错误(overflow)
注意:不标准的 ERC20 代币即支持正式的 EIP 详述所指定的方法,但返回值的类型(以及相应地,方法的签名)迥异于详述的代币(合约)。这种缺陷会让一种代币变成不标准的代币。类似的,重命名或者移除了详述所指定的方法也会让代币变成不标准的,但这种情况在实践中很少见,如果像 Uniswap 这样的协议希望支持这样的变种,还需要大量的开发工作才能解决。
Uniswap V2 还引入了一个可启用的 0.05% 的协议层收费,就是从流动性提供者的 0.3% 的手续费中分一杯羹。不过,现在这个机制是关闭的 —— 而且只能够通过一个去中心化的治理机制来触发。我们后文还会再说。
智能合约一经部署就不可改变的特性所带来的风险(代码问题可能导致 资产损失/冻结),已经是老生常谈了。如果一个合约包含了会导致资产锁定的错误,那是没有办法让这些发送资产的交易都撤销的(除非对整条区块链实施一次硬分叉 —— 按以太坊当前的体量和复杂的依赖关系,几乎是不可能这样做的)。
Uniswap 团队遵照了行业的标准实践以尽可能地消除 bug 风险和逻辑错误。值得称赞!
从 V1 转成 V2,团队也用 Solidity 语言重写了他们的智能合约(第一版的智能合约是用 Vyper 语言写的)。Uniswap 的开发者因此得以跨越 Vyper 语言的局限性、利用最新版本的 Solidity 语言中的更新的操作码,进一步优化了合约执行的 CPU 消耗(因此也节约了 Gas 费)。
Uniswap V2 由多个智能合约组成,包括 Factory 、Router V2、Pair 和 Pari ERC20,还有一个负责功能的 Library。
驱动 Uniswap 工作的几个主要的合约如下图所示:
Router 2 是 Router 1 优化之后的版本,不过它们的功能是一样的。Uniswap 建议所有的开发者都切换去用 Router 2 合约。
重写后的所有合约都得到了行内值得尊敬的开发团队的审核,也在模拟现实运行场景的测试网上做了广泛的测试。Consensys Diligence 联合多方撰写了对 Uniswap V2 源代码的完整报告。完整的审核报告可见此处。
显然的是,Uniswap V2 在上线主网之前经过了充分的测试和审核。贯彻对源代码的尽职审核 很有可能 保证了未来不会发现任何重大的问题,虽然 Uniswap 还是发布了一个 Bug 悬赏,任何人发现了重大漏洞都可以获得奖金。
安全是区块链生态永不可能绕开的一个话题,而且这种担心也是可以理解的,毕竟有这么大的资金体量在这里交易。对底层区块链的攻击(与共识、区块生产和交易验证有关的攻击)已经出现了大量的学术研究,但智能合约的完整性似乎仅仅在以太坊生态中才被人重视,因为被锁在合约中的资产仰赖于智能合约的逻辑来保证其安全性和可触达性。
好的,接下来我们就深入了解下 Uniswap V2 的机制,感受一下这个协议的潜力。
每个代币交易对都要通过工厂合约(factory contract)建立自己的流动性池。建立流动性池时,需在其中存入初始资金,以提供流动性。
流动性池中代币对的汇率是基于供需量计算得出的,即所谓的 恒定乘积公式(constant product formula) 。配合恒定乘积公式,一个交易对(也即一个流动性池)中的一种代币的价格,根据池中的供给量和交易者的需求量得出。因此,价格会在根据该公式画出的一条曲线上变动:
Uniswap V2 上的汇率取决于恒定乘积公式
汇率是基于一个简单的公式 x * y = k (其中x 和 y 分别代表交易池中两种代币的可用数量)自动计算的。对应的曲线代表所有可能的汇率。每个交易对都有自己的曲线,用来调节当前汇率。
如果 代币 B 的需求量很大,以至于流动性干涸,其价格将成倍增长,导致 k 点向曲线左侧上移(如上图所示)(译者注:即更多的 A 只能换来更少的 B)。如果 代币 B 的供应量很大,需求比 代币 A 少得多,k 点就会向曲线右侧下移(译者注:即更少的 A 就可换来更多的 B)。要注意的是,这种供需平衡仅限于代币 A 与代币 B 的流动性池。如果是代币 B 与代币 C 的流动性池,会形成自己的供需平衡,汇率也会不同。
(译者注:简而言之,Uniswap 并不使用订单簿模式来决定代币的价格,相反,代币的价格会在用户交易的过程中连续且自动地根据公式来变动,让交易者的行为,包括注入流动性和套利交易,来找出没有套利空间的价格,即市价。)
受到这些机制的影响,Uniswap(以及其它使用恒定乘积公式的去中心化交易所)依赖套利交易来让流动性池中的代币价格与市场价格保持一致。从本质上来说,这些协议依然需要通过外部交易系统来调控流动性池中代币的价格。每个代币对的汇率将根据市场价格不断波动,为交易者带来巨大的套利机会。
当用户在 Uniswap.exchange 的代币对流动性池中进行交易时,使用的是实时汇率。JavaScript SDK(会在下文作进一步介绍)会为其它应用提供 API ,再由这些应用提供自己的界面来访问不同的代币对及其汇率。这些汇率应用于 ETH 和 ERC20 代币:
- Uniswap V2 用户界面上 ETH/DAI 交易对的汇率 -
现在,让我们深入探究可在 Uniswap V2 上执行的交易类型。Uniswap V2 提供了更多交易选择,因为它不再像 Uniswap V1 那样使用 ETH 作为中介代币来实现 “ETH 搭桥”。
原文链接:
https://medium.com/@rossbulat/uniswap-v2-everything-new-with-the-decentralised-exchange-52b4bb2093ab
作者: Ross Bulat
翻译&校对: 闵敏 & 阿剑