深入去中心化交易所(Uniswap V1)
我们大多数人习惯于通过中心化交易所购买加密货币——Binance、Coinbase 等。通常,我们在不同加密货币之间进行交易时会选择相同的平台。
然而,中心化交易所充满了问题。他们可能会被黑客入侵并失去所有用户的钱,或者更糟糕的是,交易所背后的公司可能会关门大吉,带着所有的钱逃跑。
这可能看起来很极端,但这不是虚构的。
Mt.Gox
Mt.Gox 是 2010-2014 年领先的比特币交易所。在巅峰时期,它负责所有比特币交易的 70%。 2014 年初,该公司报告称他们“丢失”了数十万比特币,并宣布破产。今天,那些丢失的比特币价值数十亿美元。
在接下来的几年里,Mt.Gox 面临着数起诉讼,其中一些诉讼在 8 年后仍在继续。您可以在此处阅读有关 Mt.Gox 发生的事情的更多信息
QuadrigaCX
QuadrigaCX 是一家总部位于加拿大的中心化交易所,于 2018 年倒闭。Quadriga 的创始人神秘地“去世”,平台上的所有加密货币也随之消失。用户报告损失了近 2 亿美元的资金。
安大略省证券委员会对该公司的活动进行了深入研究,并宣布 Quadriga 的创始人简直就是一个骗子。
您可以在此处阅读有关 Quadriga 发生的事情的更多信息
有趣的事实:现在甚至在 Netflix 上有一部关于此事件的纪录片。
无论如何,这不是一个详尽的清单,但它给了你一个想法。 Web3 有句俗语
不是你的钥匙,也不是你的硬币
这意味着,如果您不拥有自己的私钥,而是信任一个中心化的交易所来为您管理它们,那么您并不真正拥有您的加密货币硬币。这是真实的。
去中心化交易所的诞生 🐣
去中心化交易所的想法很简单——允许用户通过智能合约直接在链上交易他们的加密货币,而无需放弃对其私钥的控制。
虽然听起来很简单,但实际情况要复杂得多。简而言之,去中心化交易所是一个美丽的数学和软件结合在一起的部分。我们希望在本文结束时,您将分享同样的感受。
现代去中心化交易所的诞生主要是由 Uniswap 引领的。 Uniswap 不仅是以太坊上领先的去中心化交易所,它还是以太坊上领先的 dApp。
在 Vitalik Buterin 在 2017 年发表了一篇关于路径独立的博客文章后,Hayden Adams 受到启发,试图在最终成为 Uniswap 的项目中实施 Vitalik 的想法。
在花了一年多的时间编写代码后,Hayden 终于在 2018 年 11 月宣布并推出了 Uniswap。您可以在创始人的这篇博文中了解更多有关 Uniswap 历史的信息。
在本文中,我们将尝试回顾 Uniswap 存在和发挥作用的数学原理,并希望让您深入了解它为何如此神奇。
为什么复杂?
你可能想知道——“为什么我们不能在链上重建一个中心化交易所?”
好吧,你可以,但这还不够好。
集中式交易所通常在订单簿系统上工作。 Alice 提出一个清单,说她愿意以 50 个“TokenB”出售 100 个“TokenA”,并且该清单被添加到订单簿中。在某个时候,如果 Bob 出现并说他想用 50 个 'TokenB' 购买 100 个 'TokenA' - 他们的订单匹配在一起,并且交易被执行。
在以太坊上尝试了基于订单簿的交易,最重要的例子是 0xProject,但由于所有存储和匹配算法所需的高 gas,吸引用户具有挑战性。
需要一种新方法,一种允许用户在任何两个代币之间任意交换而无需订单簿的方法。此外,如果用户实际上可以通过使用 Uniswap 赚钱,cookie 会指出。
Uniswap V1、V2、V3
截至 2022 年 1 月,Uniswap 已推出三个版本。
第一个版本于 2018 年 11 月推出,只允许在以太币和代币之间进行交换。 链式交换也可能允许代币交换。链式交换将允许 TokenA <> TokenB
交换,首先将其中一个交换为 ETH,然后将 ETH 交换为第二个令牌。
V2 于 2020 年 3 月推出,它是 V1 的巨大改进,允许任何 ERC20 代币之间的直接交换,以及任何对之间的链式交换。
V3 于 2021 年 5 月推出,它显着提高了资本效率,这使得流动性提供者能够从池中移除更大一部分的流动性,并且仍然继续获得相同的回报(或者在更小的价格范围内挤压资本并获得高达 4000 倍的利润)。
出于本教程的目的,我们将专注于 Uniswap V1 的设计,在接下来的级别中,我们将实际实现它的一个稍微简化的版本,允许在以太币和代币之间进行交换。
做市商
Uniswap 是一个自动做市商。让我们试着理解这意味着什么。
做市商是为交易市场提供流动性(资产)的实体。在非订单系统中,流动性使交易成为可能。这意味着如果你想出售 BTC 来购买 ETH,交易所必须有一个 ETH 余额,你可以从中购买以换取 BTC。一些交易对的流动性非常高(例如 BTC/ETH 交易对),但有些交易对的流动性极低或根本没有(例如诈骗代币或新创建的代币)。
去中心化交易所(DEX)必须具有足够的流动性才能发挥作用并作为中心化交易所的替代品。
获得这种流动性的一种方法是开发商(或投资者)投入自己的资金并成为做市商。然而,这是不现实的,因为他们需要大量资金来为所有可能的交易对提供足够的流动性。此外,这会损害权力下放,因为开发商/投资者将掌握市场的所有权力。
Uniswap 实施的另一种方式是让任何人成为做市商——这就是使 Uniswap 成为自动化做市商的原因。任何用户都可以将资金存入特定的交易对并增加流动性,作为交换,通过从用户那里收取的交易费来赚钱。
功能要求
考虑到我们所学到的,我们至少需要允许以下功能来构建一个自动化的做市商:
- 任何人都可以增加流动性成为流动性提供者
- 流动性提供者可以随时移除他们的流动性并取回他们的加密货币
- 假设有足够的流动性,用户可以在交易池中的资产之间进行交换
- 向用户收取少量交易费用,这些费用在流动性提供者之间分配,因此他们可以通过提供流动性来赚钱
XY = K
Uniswap 的核心是一个数学函数:
x * y = k
假设我们有一个 ETH / LW3 Token
的交易对
x = 交易池中 ETH
的储备余额
y = 交易池中 LW3 Token
的储备余额
k = 一个常数
该公式负责计算价格,决定将收到多少 LW3 代币以换取一定数量的 ETH,反之亦然。
注意:我们用 x 表示 ETH 或 LW3 Token 的储备没有关系,只要 y 表示相反即可。
该公式表明,无论储备(x 和 y)是多少,k 都是一个常数。每次交换都会增加 ETH 或 LW3 代币的储备金并减少另一个的储备金。
让我们试着把它写成一个公式:
(x + Δx) * (y - Δy) = k
其中 Δx
是用户提供的用于出售的金额,Δy
是用户从 DEX 收到的金额以换取 Δx
。
由于 k
是一个常数,我们可以比较上面两个公式得到:
x _ y = (x + Δx) _ (y - Δy)
现在,在交换发生之前,我们知道 x
、y
和 Δx
的值(由用户给出)。我们有兴趣计算 Δy
- 这是用户将收到的 ETH
或 LW3
代币的数量。
我们可以简化上面的方程来求解 Δy
,我们得到下面的公式:
Δy = (y * Δx) / (x + Δx)
让我们尝试在 Solidity 中编写代码。
function calculateOutputAmount(uint inputAmount, uint inputReserve, uint outputReserve) private pure returns (uint) {
uint outputAmount = (outputReserve * inputAmount) / (inputReserve + inputAmount);
return outputAmount;
}
假设我们在合约中有 100 ETH 和 200 LW3 Token。