欢迎您访问科普小知识本站旨在为大家提供日常生活中常见的科普小知识,以及科普文章!
您现在的位置是:首页  > 经济金融

一文带你读懂Uniswap V2的一切

科普小知识2022-04-17 03:04:22
...

Uniswap V2 上的交易选择

如上文所述,Uniswap V1 上的每个交易对中都有 ETH 。如果要将代币 A 兑换成代币 B ,必须先用代币 A 买入 ETH ,然后再用 ETH 买入代币 B 。因此,交易者需要支付两笔交易费和 gas 费。

Uniswap 的文档将 V1 称为去中心化自动交易所的 “原型”。这有可能是因为开发人员发现了 V2 提供的更高效的交易执行方法。不再将 ETH 作为中介代币就是优化之一。

如下图所示,ETH 不再作为中介代币之后,交易对之间可以进行直接交易:

一文带你读懂Uniswap V2的一切

- 两种 ERC20 代币直接互换 -

这种方式似乎既合理又直观,或许 V1 就应该采取这种运作方式。只需调用路由合约上的 swapExactTokensForTokensswapTokensForExactTokens 方法即可交易。

上述方法名称中的 Exact 表示你希望为交换中的哪一种代币设置限额。如果你想用 DAI 买入一定数量的 ETH ,就要使用 swapTokensForExactTokens ;另一方面,如果你想用一定数量的 DAI 买入 ETH ,就要使用 swapExactTokensForTokens。Uniswap V2 的智能合约就采用了这两种方法。

除了直接交易外,用户依然可以选择使用 ETH 作为中介代币来实现两种代币之间的交易。用户无需直接在输入代币和输出代币之间创建流动性池,只要这两种代币与 ETH 之间存在流动性池即可。

例如,以 ETH 作为中介代币来实现 DAI 和 LINK 之间的交易,其流程如下图所示:

一文带你读懂Uniswap V2的一切

- 以 ETH 作为中介代币实现间接互换(类似于 Uniswp V1)-

与之对应的 Solidity 方法是 swapExactETHForTokensswapETHForExactTokens,以及 swapTokensForExactETHswapExactTokensForETH

实现代币交易的最后一种方法就是,在多个 ERC20 代币之间进行交易,直至获得你想要的输出代币为止,也就是白皮书中所说的 “任意 ERC20 交易对”。当然了,所谓的任意代币对中也可以包含 ETH 。

下图显示了如何通过一系列代币将 DAI 的价值转移到理想的输出代币 Link 中:

一文带你读懂Uniswap V2的一切

-对于没有直接交易对的代币,可以通过一系列中介代币交易来获得输出代币-

如果你的输入代币和你想获得的输出代币之间没有流动性池,就可以采取这种方法,而且不一定需要上文所述的 ETH 作为中介代币。

虽然这种交易方法是可行的,但是目前没有智能合约能自动实现这么多笔代币交易,只能手动将这个功能写入前端应用的代码中,并对 Uniswap 进行多个交易调用。

这个办法的使用频率可能不高,因为在通过一至两个中介代币转移价值后,额外的 Gas 费会让迂回交易变得很不划算。或许通过中心化交易所交易成本反而更低。尽管如此,一旦 ETH 2.0 主网上线,采用更加高效的 PoS 机制,再加上可扩展性功能,让迂回交易变得更加可行,这种方法将得到更广泛的使用。

价格信息传输机制

Uniswap 的价格信息传输机制可以让开发者基于某个代币在几个区块(也可以表示成两个时间戳之间的时间区间)内的价格波动性来计算该代币的平均价格。

这个时间区间可以是前 1 小时,前 24 小时乃至更久。

虽然 Uniswap 会提供代币价格,但是它不会在链上存储任何历史价格。需要 dApp 开发者自选基于一段时间的累积价格,来计算某个代币在这段时间的平均价格。

这些平均价格称为时间加权平均价格(Time Weighted Average Price,TWAP)。

所谓的 TWAP 就是在链上选定一段区块作为时间区间,将某个代币在这段区块内的累积价格(该代币在每个区块的价格)除以时间戳区间(结束区块的时间戳减去起始区块的时间戳),得出该代币在这段区块的平均价格。图解如下:

一文带你读懂Uniswap V2的一切

- TWAP 是基于一段区块内的累积代币价格计算得出的 -

TWAP 是可靠的,反映了一段时间内的代币价格(别忘了,这是基于特定代币对的)。采取这种方式可以避免闪电崩盘和剧烈的价格波动,这些在加密货币市场上很常见。当市场出现价格波动时,TWAP 可以更准确地反映代币的情况。

如果需要,开发者可以通过 Uniswap 的 JavaScript SDK 免费获取价格信息。详情见下文。

闪电交易

闪电交易(Flash Swap)指的是通过一个交易来完成从 Uniswap 的流动性池中借出代币、使用这些代币进行某项操作并偿还这些代币这一多阶段流程。如果这个流程中的任意一阶段失败,所有状态更改都会撤销,相关代币重新回到对应的 Uniswap 流动池中。

下图显示了交易者如何能够不持有代币而执行闪电交易。这是因为从流动性池中借出的价值一定会归还到池内,要么交易失败,要么交易者归还借出的代币:

一文带你读懂Uniswap V2的一切

闪电交易的一大用例就是套利交易,而且交易者一定能在获利的同时将之前借得的代币价值归还至 Uniswap 流动性池内。交易者每次都能通过套利交易轻松获得收益。

另一个用例是使用 Uniswap 流动性池结算 Maker 金库,你可以偿还债务,并取出 Maker 金库中作为担保品的 ETH (或其它代币)来偿还 Uniswap 流动性池。相比直接使用自己持有的代币来还款,这种方式消耗的 gas 较少。

闪电交易是 Uniswap 上一项比较新的功能,不过我们很快就能看到更多 dApp 整合这一功能。

在交易机器人这一用例中,闪电交易还可以用来自动执行套利交易。交易机器人不需要资金来执行交易,只需要识别套利机会并执行闪电交易即可。

新的 0.05% 的协议收费和治理

Uniswap V2 还为协议引入了一种新的费用,叫做 “协议费(protocol fee)”,启用这一机制后,Uniswap 上发生的交易额的 0.05% 就会转移到一个由 Uniswap 持有的地址上。这个 0.05% 是从 Uniswap 标准的 0.3% 手续费中抽出来的,所以启动这一机制会导致流动性提供者的利益受损。

当前这一机制还是关闭状态,而且 Uniswap 项目方也没有任何公开声明表示有启用这一机制的计划。

添加这个机制似乎有点可疑,但 Uniswap 开发者认为,这是为了支持 Uniswap 的增长和可持续性的必要功能。而且,还有一个事实可以为他们辩护:启用这一机制需要一个治理机制,由社区来投票决定要不要启动这一机制。

虽然启动这一功能需要先达成社区共识,这样做会给予 Uniswap 项目方巨大的利益和竞争优势。

从好的一面来说,这笔费用可用于升级协议和整个生态系统、提高接受度,最终能够让流动性提供者获得更大的利益;理论上来说,可以弥补他们在这一机制中的利益受损。整个过程如下图所示:

一文带你读懂Uniswap V2的一切

- 收取 0.05% 的协议费用的积极结果 -

现在还未有该治理机制的公开信息,但不妨假设会有利用 ERC20 代币来收集投票,类似于 Maker 的治理和投票机制。

为管理协议收费机制,Uniswap Factory 合约包含了 feeTofeeToSetter 方法来设置接收资金的地址,以及有权更改 feeTo 地址的账户。

JavaScript SDK

本文有意避免过度技术化,但还是有必要提及 Uniswap 的 JavaScript SDK。这个开源库给 NodeJS、JavaScript 框架及所有基于浏览器的应用提供了 JavaScript API 来集成 Uniswap。

这已经足以让第三方应用直接将 Uniswap 集成到自己的产品和服务中。

Agent Wallet、Switcheo Exchange 和 Streamr Marketplace 是其中 3 个已经直接集成了 Uniswap 的产品。

该 JavaScript SDK 的文档讲解了用于提取代币对数据和代币对地址的 API,还有启动交易和获取定价的 API,应用可以借此使用上文所述的价格信息传输功能。

注意,API 不能自动执行交易,只能帮你 准备 一笔交易,把你愿意接受的市场价格中位数和交换所得的最低数量(也就是所谓的 “滑点” 考虑进去。

交易准备好之后,用户必须手动使用钱包软件(比如 MetaMask)发起和签名交易。

关于 Uniswap 的代币列表

如果你好奇 Uniswap.exchange 上的代币列表是如何决定的,很简单,这是人工操作的,Uniswap 团队会用视频会议讨论要加入哪些代币。因此,即使某种 ERC20 代币的交易池已经出现了,也并不代表这种代币会出现在 Uniswap 官方网站的代币列表上。

如果你是某种代币的发行者,你想要让你的代币出现在 [Uniswap.exchange] 默认的代币列表上,你需要在 Default Token List repository 上提交一个 Github issue。

Uniswap.exchange 上还有一个功能:你可以在一个搜索框内输入某个 ERC20 代币的地址来找出这种代币,然后添加到你自定义的列表中。这样一来你就能在 dApp 中交易这种代币了,但这不代表别人也能看到这种代币,因此也不会提高这种代币的曝光度。

开发者也可以在自己的 Uniswap 集成中创建定制化的代币列表,只需遵循一个简单的 JSON 结构即可。更多操作细节可见 Uniswap 的 Token Lists repository。

总结

本文完整地考察了 Uniswap V2,揭开了它的改进项目及其工作原理。更高效的代币互换、按时间来加权的价格信息标识机制、闪电兑换功能,都是重大改进,在这些改进的背后,是迁移到基于 Solidity 来编写合约的技术工作,这些技术工作让 Uniswap V2 得以利用最新的操作码来实现更高效率的执行。

Uniswap V2 保持了免信任、去中心化的本色,它存在于以太坊区块链上,除非爆破底层协议,不然就无从破坏它。到目前为止,没有这样的事情发生,而且,看现在的矿工群体规模(以及验证者的规模),以后也不太可能发生。

以太坊 2.0 的测试网 Medalla 启动时有 2 万名验证者 —— 我估计这个数字在主网启动时还会更高,因为到时候的验证者可以得到经济回报。

另一方面,Uniswap V2 作为一个代币交易所,也还不能说是完美的。在撰文之时,以太坊网络的 Gas 费正处于历史上最高的时期,这使得使用 Uniswap 的 Gas 费异常昂贵。Uniswap 没有实时订单簿功能,因此交易员要使用交易策略还是只能找上中心化交易所。如前所述,Uniswap 需要用户套利来保持交易所内代币价格与市场价格的一致,中心化交易所仍旧在平衡 Uniswap 的汇率上发挥着不可替代的作用。

Uniswap V2 是朝着正确的方向迈出的积极一步,但若想让去中心化交易所能够完全取代中心化交易所,还是长路漫漫。虽说如此,密码学货币社区(尤其是以太坊生态)的意见还是非常乐观的 —— 我们可以有把握地说,DeFi 的进展,不论从技术能力还是接受度来看,在短期内都不会放缓。

有用的链接

Uniswap.exchange:交易所的默认 app,也可以当成是一个前端的参考时间。

Uniswap.org:官方的 Uniswap 网站主页。

Uniswap.Info:Uniswap 使用情况统计数据。

Smart Contract Documentation:深入了解 Uniswap 智能合约中的方法以及如何将 Uniswap 集成到你的 app 中。

JavaScript SDK Documentation:了解协助连接到 Uniswap 的 JavaScript 库。

Uniswap on GitHub:了解 Uniswap 代码的现状、问题和测试版本的进展,还可以发起技术讨论。

原文链接:

https://medium.com/@rossbulat/uniswap-v2-everything-new-with-the-decentralised-exchange-52b4bb2093ab

作者: Ross Bulat