截止到2024年6月,Uniswap已经推出三个上线的生产版本。第四个版本目前还在开发阶段
截止到2024年6月,Uniswap已经推出三个上线的生产版本。第四个版本目前还在开发阶段
第一个版本于2018年11月推出,Uniswap V1仅支持ERC-20代币与ETH之间的交易,这意味着任何ERC-20代币都可以通过ETH进行兑换,但是不能与其他的ERC-20代币进行交易;
如果用户需要交易两个ERC-20代币,则需要先将其中一个代币兑换为ETH, 然后再用ETH兑换另一个代币,这样会导致额外的交易费用和Gas费用。
Uniswap V1引入了恒定乘积做市商模型(AMM),这意味着流动性池中的代币价格是由其储备量决定的,支持无需许可的代币交换,但是,V1版本存在流动性分散和Gas费用高等问题。
于2020年5月推出,在V1版本的基础上进行了改进,增加了对ERC-20/ERC-20代币对的交易支持,并且支持了任何货币对之间的链式交换,提高了资金利用率。
于2021年5月推出,引入了“集中流动性”的概念,允许流动性提供者在特定价格范围内提供资金,从而显著提高了DEX的资本效率。此外,V3版本还允许做市商自行选择费用层级。
于2023年6月14日发布了代码草稿,目前尚未正式发布。V4版本的主要改进是引入了单例模式,将所有不同池子集中到一个单一的合约中,从而提高了Gas效率。
这篇文章特别关注 Uniswap V1,以尊重时间顺序并更好地了解以前的解决方案是如何改进的。
Uniswap 可以简单理解为一个去中心化交易所 (DEX),旨在替代中心化交易所。它运行在以太坊区块链上,完全自动化:没有管理员、经理或拥有特权访问权限的用户。
底层来看,它是一种算法,允许创建池(或代币对),并为其注入流动性,以便用户利用这些流动性来交换代币。这种算法被称为自动做市商 (AMM) 或 自动流动性提供者 (ALP)。
让我们更多地了解什么是做市商。
做市商是为市场提供流动性(交易资产)的实体。流动性是交易得以进行的关键因素:如果您想卖东西,但没有人买,那么交易就无法进行。一些交易对具有高流动性(例如 BTC-USDT),而另一些则流动性较低甚至根本没有流动性(例如一些骗人的或可疑的山寨币)。
一个去中心化交易所 (DEX) 必须拥有足够(或大量)的流动性才能发挥作用并成为中心化交易所的替代品。获得流动性的一种方式是 DEX 的开发者投入他们自己的资金(或投资者的资金)并成为做市商。然而,这不是一个现实的解决方案,因为考虑到 DEX 允许任何代币之间的互换,他们将需要大量资金来为所有交易对提供足够的流动性。此外,这会使 DEX 中心化:作为唯一的做市商,开发者将掌握大量权力。
一个更好的解决方案是允许任何人成为做市商,这就是 Uniswap 成为自动做市商 (AMM) 的原因:任何用户都可以将他们的资金存入交易对(并从中获利)。
Uniswap 除了自动做市商的角色之外,还扮演着另一个重要角色 - 价格预言机 。价格预言机是从中心化交易所获取代币价格并提供给智能合约的服务 - 这些价格通常很难被操纵,因为中心化交易所的交易量通常非常大。然而,Uniswap 虽然没有那么大的交易量,仍然可以作为价格预言机发挥作用。
Uniswap 作为二级市场,会吸引套利者利用 Uniswap 和中心化交易所之间价格差异获利。这促使 Uniswap 池里的价格尽可能接近大型交易所的价格。如果没有适当的定价和储备平衡功能,这是无法实现的。
自动做市商 (AMM) 是一个术语,用来涵盖各种去中心化交易所 (DEX) 的定价算法。最流行的 (也是最早被称为 AMM 的) 算法跟预测市场有关 - 预测市场允许人们通过预测价格走势来获利。Uniswap 和其他链上交易所使用的算法都是对这类算法的进一步发展。
常数乘积做市商(CPMM)是一种用于去中心化金融(DeFi)平台的自动化做市商(AMM)。它允许在无需传统订单簿的情况下进行加密货币对的自动化交易。
Uniswap 的核心是恒定乘积函数:
$$ x * y = k $$
其中 x 代表以太坊储备,y 代表代币储备(反之亦然),k 是常数。Uniswap 要求无论 x 或 y 的储备量是多少,k 必须保持不变。当您用以太坊交易代币时,您将以太坊存入合约并获得一定数量的代币作为回报。Uniswap 会确保每次交易后 k 保持不变(这并不完全正确,稍后我们会解释为什么)
为了真正理解 Uniswap 的运作原理,我们将亲自构建一个模拟的版本。这里将使用 Solidity 编写智能合约,并使用 HardHat 作为我们的开发环境。HardHat 是一个非常棒的工具,可以大大简化智能合约的开发、测试和部署。
首先,创建一个空目录(我给它起名为 myUniswap ),将 cd 放入其中并安装 HardHat
mkdir myUniswap && cd $_
yarn add -D hardhat
我们还需要一个代币合约,我们可以使用 OpenZeppelin 提供的 ERC20 合约来简化我们的操作。
yarn add -D @openzeppelin/contracts
初始化 HardHat 项目并删除 contract、script 和 test 文件夹中的所有内容。
$ yarn hardhat
...follow the instructions...
$ rm ...
$ tree -a
.
├── .gitignore
├── contracts
├── hardhat.config.js
├── scripts
└── test
最后一步:我们将使用最新版本的 Solidity,在撰写本文时为 0.8.24。打开您的 hardhat.config.js 并更新其底部的 Solidity 版本。
Uniswap V1 仅支持以太币交换。为了使它们成为可能,我们需要 ERC20 代币合约。
// contracts/Token.sol
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract Token is ERC20 {
constructor(
string memory name,
string memory symbol,
uint256 initialSupply
) ERC20(name, symbol) {
_mint(msg.sender, initialSupply);
}
}
让我简单解释一下:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!