本文详细介绍了自动化市场做市商(AMM)的基本概念及其在以太坊区块链中的应用,特别是Uniswap的发展历史和实现其定量数学原理。文章结构清晰,分为多个部分,涵盖了从AMM的早期思想到最新的Uniswap v3设计的变革,适合对区块链技术及其市场机制感兴趣的读者。
自动化做市商(AMM)是一种在特定市场中进行价格发现的算法方法。这与传统做市商所使用的订单簿模型形成对比。
AMM 在公共区块链上的故事以 Uniswap 为核心,它是按 TVL/交易量计算的最成功的 AMM,并激发了许多其他 AMM 协议的诞生。
本文其余部分总结了 Uniswap 的历史和使其成为可能的数学原理。
2016年10月:Vitalik Buterin 发布了一篇 Reddit 帖子 介绍了“链上自动化做市商(AMM)”的概念。
2017年5月:Bancor 发布了一份 白皮书,描述了第一个 AMM。Bancor 的方法受到了一 些批评,这可能抑制了项目的增长。
2017年6月:Vitalik 发布了一篇 博客文章,介绍了恒定乘积 AMM。这将成为 Uniswap v1 的基础。(Vitalik 将此特定 AMM 公式的发起者归功于 Gnosis 的 Martin Köppelmann,但 Hayden 表示实际上是 Gnosis 的 Alan Lu 提出了这个想法。)
2017年10月:Hayden Adams 构建了 Uniswap 的概念验证(“POC”)。该 POC 从未在以太坊主网上推出,仅由一个流动性池组成,即它允许将 ETH 交换为“UNI”(一个通用的测试网络 ERC20 代币)。此外,流动性池仅支持一个流动性提供者,即两个或多个钱包不能共同为流动性池提供流动性。
2017年11月:Karl Floersch 在 Devcon 3 上讨论 AMM,并 简要展示了 Hayden 的概念验证网站。参加 Karl 的演讲的 Pascal Van Hecke 成为 Hayden 的顾问。
2018年3月:Hayden Adams 和几个朋友(“Uniswap”)构建了 Uniswap v1 的第一个 全面功能演示。v1 具有一个工厂合约,使第三方能够创建任意数量的流动性池。此外,每个流动性池可以由任意数量的钱包进行资助。
2018年4月:Karl Floersch 在 Deconomy 2018 会议上将 Hayden Adams 介绍给 Vitalik。Vitalik 鼓励 Hayden 申请 以太坊基金会的资助。
2018年7月:Uniswap 获得了以太坊基金会的 100,000 美元资助。
2018年10月:Hayden Adams 完成了 Uniswap v1 白皮书 并从 Runtime Verification 收到 审计结果。 (Runtime Verification 还制作了该协议的 正式规范。)与此同时,Kyokan 的 Jacky Chan 构建了 Uniswap v1 UI 的完全新版本。
2018年11月:Hayden Adams 在 Devcon 4 上发布 Uniswap v1。
2019年4月:Uniswap 进行了一轮 种子融资,由 Paradigm 主导。
2020年3月:Uniswap v2 正式推出。Uniswap v2 对 v1 进行了一些微小的改进。例如,它支持直接的 ERC20 到 ERC20 转账;v1 需要 ETH 作为所有此类交易的中介。
2021年5月:Uniswap v3 正式推出,这是一种集中流动性的新设计。
注意:以下内容假定读者具备微分计算的基本知识。
Uniswap v1 和 v2 实现了普通的恒定乘积 AMM。这是一种用于交易两种可替代代币 α 和 β 的算法。设 x 为 α 的流动性池储备,y 为 β 的储备。市场有储备 x > 0 和 y > 0,恒定乘积 xy = L²。
考虑这种情况:一个人希望以 Δx 单位的 α 交换 Δy 单位的 β。当手续费为 0 时,
“恒定乘积市场”这一名称来源于这样的事实:任何交易 Δx 转换为 Δy 必须以这样的方式改变储备,使得 x 和 y 的乘积保持等于常数 L²。
在每次交易后,储备以以下方式更新:y ↦ y − Δy, x ↦ x + Δx, 以及 L² ↦ L²。
从实现的角度来看,有两种情况需要考虑:
对于第一种情况,我们有
对于第二种情况,我们有
这些公式在 Uniswap v1 的 这里 和 这里 中实现,在 Uniswap v2 的 这里 和 这里 中实现。(注意,本文中未考虑手续费。)
用户实现的价格很简单
此外,我们可以定义一个边际价格,或当前价格 (P),作为在小变动中实现的交换价格,即
该公式暗示了另一种进行交换计算的方法。注意到
和
或者
这意味着
这些公式代表了在给定 Δy 的情况下计算 Δx 的替代方法(反之亦然)。实际上,这正是 Uniswap v3 所采取的方法,以“避免在计算交换时进行任何平方根计算”。(白皮书没有更多详细分析这种方法背后的动机,但 v3 中的所有数学计算都基于价格的平方根;前端应用程式在显示给用户之前将 √P 转换为 P,反之亦然。)
Uniswap v3 的主要创新是集中流动性。正如白皮书所说明的,Uniswap v1 和 v2“设计为在整个价格范围 (0, ∞) 内提供流动性。这……意味着池中持有的大部分资产从未被触及。考虑到这一点,允许流动性提供者在比 (0, ∞) 更小的价格范围内集中他们的流动性似乎是合理的。”
换句话说,Uniswap v3 允许用户的所有流动性在指定价格范围内得到利用,即在该价格范围的边界上所有储备都被耗尽。
这涉及将恒定乘积 AMM 公式变换为 3 个范围,具体如下:
要理解该公式为何有意义,我们可以考虑边界,即我们要求在 y = 0 时 P = pₐ,以及在 x = 0 时 P = pᵦ。
所以当 x = 0 时,
当 y = 0 时,
通过替代,还可以看出
换句话说,x 是 1/√P 的线性函数,而 y 是 √P 的线性函数。
因此,与 Uniswap v1 和 v2 一样,
正如 Uniswap v3 白皮书所述,“在将一种代币交换为另一种代币时,池合约首先可以计算新的 √P……然后可以计算要发送出的(x)或(y)的数量……”。(如前所述,在 Uniswap v3 中,所有计算都使用 √P 作为中间变量;前端有责任在显示给用户之前对 √P 进行平方操作。)
就这样!使 v3 的代码复杂化(与 v1 和 v2 相比)的,是微妙的位置账户管理。现在每对的流动性池不再只是单个,而是可能有无数个位置,每个位置都有自己独特的 pₐ 和 pᵦ 值。
- 原文链接: pandichef.medium.com/a-b...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!