Uniswap作为一种去中心化金融(DeFi)应用,允许用户以无需信任的方式交换代币。它采用自动做市商(AMM)模式,通过流动性池实现代币交换,并解释了AMM的工作原理、优势和劣势,以及与Uniswap V2架构相关的技术细节。
Uniswap 是一个去中心化金融(DeFi)应用程序,使交易者能够以无信任的方式交换一种代币为另一种代币。它是交易的早期自动化做市商之一(虽然不是第一个)。
自动化做市商是 订单簿 的一种替代方案,读者假定已经熟悉订单簿。
一个自动化做市商在池中持有两种代币(代币 X 和代币 Y)(即智能合约)。它允许任何人从池中提取代币 X,但他们必须存入一定量的代币 Y,以使池中的资产“总量”保持不变,其中我们考虑“总量”为两个资产数量的乘积。
$$ xy \le x’y’ $$
这里,x′ 和 y′ 是交易后池中的代币余额,x 和 y 是交易前池中的代币余额。
这保证了池的资产持有量只能保持不变或增加。大多数池会强制施加某种费用。不仅余额的乘积应该增加,而且应该至少增加一定的量以考虑费用。
资产由 流动性提供者 提供,他们获得所谓的 LP 代币来代表他们在池中的份额。流动性提供者的余额以类似于 ERC 4626 的方式进行追踪。AMM 和 ERC 4626 的区别在于ERC 4626 只支持一种资产,而 AMM 有两种代币。就像一个金库,流动性提供者在池中的份额保持不变,但乘积 xy 变大,因此他们的份额也更大。
在 AMM 中,价格发现是自动的。它由池中资产的比例来决定。具体来说,如果我们有代币 x 和代币 y,价格的计算如下:
$$ \text{price}(x) = \frac {\text{poolHoldings }y}{\text{poolHoldings }x} $$
对于 y 的计算也是如此。具体来说,投入更多代币 x 到池中,代币 x 就会变得“更加丰富”,其价格会下降。
不需要等待合适的“买入”或“卖出”订单出现。它始终存在。如果 AMM 中的价格与其他交易所价格不匹配,交易者将会套利这个差价,使价格重新平衡。
我们必须强调这是“现货”或“边际”价格。如果你购买任何数量的 x,实际支付的价格将会比这个计算结果更差。
由于资产的价格是自动确定的,其他智能合约可以将 AMM 用作价格预言机。然而,AMM 的价格可能被闪电贷操控,因此,在以这种方式使用 AMM 时需要采取保护措施。尽管如此,提供价格数据是免费的,这仍然是有价值的。
订单簿需要大量的账簿管理(并无双关之意)。AMM 只需持有两种代币,并根据简单规则进行转移。这使得它们的实现更加高效。
自动化市场制造商有两个主要缺点:1)价格总是移动,2)流动性提供者面临的无常损失。
如果你下单购买 100 股苹果公司的股票,你的订单不会导致价格移动,因为在你指定的价格上有数千股可供出售。然而,自动化市场制造商并非如此。每一笔交易,无论多小,都能推动价格变化。
这有两个含义。一般来说,在 AMM 中,买入或卖出订单将遇到比订单簿模型更多的滑点,而交换机制则容易受到三明治攻击。
由于每个订单都会推动价格,MEV(可最大提取价值)交易者会等待一个足够大的买入订单出现,然后在受害者的订单之前下一个买单,并在之后下一个卖单。前面的买单会抬高原始交易者的价格,从而使他们的成交质量更差。这被称为击夹攻击,因为受害者的交易“夹在”攻击者之间。
1) 攻击者的第一次买入(抢跑):抬升受害者的价格 2) 受害者的买入:进一步抬升价格 3) 攻击者的卖出:以获利价格出售第一次买入
出于我们稍后将讨论的原因,流动性提供者只能根据池中代币的当前比例提供资产。例如,如果有 100 个代币 x 和 200 个代币 y,新流动性提供者必须提供两倍于 x 的代币 y。
在传统的订单簿中,做市商可以在他们认为反映理想买入或卖出价格的水平上放置限价单(例如,以低于当前市场价格的买入订单或以上于当前市场价格的卖出订单),但在自动化做市商中无法做到这一点。请记住,自动化做市商使用公式根据池中的资产比例设定价格,因此做市商无法设置他们希望出售其资产的特定价格。
假设在一个假设场景中,以太坊的价格从 $10 开始,后来涨至 $1,000。
如果某人有一个包含 1 以太坊和 10 美元的投资组合,那么他们的投资组合从 20 开始,以后增加到 $1010(1ETH+10)。他们的总利润为 $990。
如果他们选择将资金存入 AMM,那么他们将错过大部分收益。在价格变动后,AMM 中将有 0.1 ETH 和 100 美元。这正确地将 ETH 定价为 $1,000,但池的净值不到 $990。以下是价格变动前后池持有量的情况:
$$ \begin{split} (\text{ETH\_before})(\text{USD\_before}) & \le (\text{ETH\_after})(\text{USD\_after})\\ (1 \text{ ETH})(10 \text{ USD}) & \le (0.1 \text{ ETH})(100 \text{ USD})\\ 10 & \le 10 \end{split} $$
尽管稳定币的数量上涨了 10 倍,但以太坊的数量却下降。最终结果是,当我们的资产处于池中时,其价值的增加少于单独持有时的增长。
以下是一个表,展示了在池中持有 ETH 和 USD 与单独持有的相对表现。
以太坊池余额 | 稳定币池余额 | ETH × 稳定币 | 1 ETH 的美元价值 | 提供流动性时的资产价值 | 仅持有时的价值 | ||
---|---|---|---|---|---|---|---|
前 | 1 | 10 | 10 | 10 | $20($10 ETH+10 USD) | $20($10×1 ETH+10 USD) | |
后 | 0.1 | 100 | 10 | 1000 | $200($100 ETH+100 USD) | $1010($1000×1 ETH+10 USD) | |
增益 | $180 | $990 | |||||
错过的收益被称为“无常损失”。在上表中,无常损失为 $810=(990 – 180)。
Uniswap V2 的架构出乎意料的简单。其核心是 UniswapV2Pair 合约,持有两个 ERC 20 代币,交易者可以交换,或者流动性提供者可以提供流动性。每个不同的 UniswapV2Pair 的合约管理它。如果所需的 UniswapV2Pair 合约不存在,可以从 UniswapV2Factory 合约无权限地创建一个新的 UniswapV2Pair 合约。 UniswapV2Pair 合约也是 ERC 20 代币(它们继承自 ERC 20),该代币用于像 ERC 4626 一样跟踪存款。
尽管高级交易者或智能合约可以直接与 pair 合约交互,但大多数用户将通过 router 合约与 pair 交互,该合约具有多个便利功能,例如在一个交易中在 pairs 之间进行交易,以便在不存在时创建“合成”对。
就这些!在 Uniswap V2 系统中实际上只有三个智能合约。
Factory: github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Factory.sol
Pair:(继承自 ERC20): github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2Pair.sol
Router: github.com/Uniswap/v2-periphery/tree/master/contracts
注意,上述路由器合约位于一个名为“v2 periphery”的仓库中,而配对合约位于“v2 core”仓库中。Uniswap V2 遵循“核心/外围”设计模式,其中最重要的逻辑保留在核心, “可选”逻辑保留在外围。
这样做的意图是使核心保留尽可能少的代码,从而减少核心业务逻辑中出现漏洞的可能性。
智能合约通过预测 create2 地址作为代币地址和工厂地址的函数来计算池的地址,而不是访问代币对到池地址的映射。由于没有存储访问,这非常节省Gas。以下是 UniswapV2Library 提供的帮助函数,用于计算 Pair 合约的地址。
// 计算配对的 CREATE2 地址,而不进行任何外部调用
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
hex'96e8ac4277198f8fbbf785487aa39f430f63b76db002cb326e37da348845f' // 初始化代码哈希
))));
}
EIP 1167 克隆 模式用于创建一组相似的合约,那么这里为什么不这样做?虽然部署会更便宜,但由于 delegatecall,这会在每个交易中引入额外的 2,600 Gas费用。因池应该频繁使用,因此,几百次交易后的节省成本将被抵消,因此将池作为新合约单独部署是更值得的。
计算交换所需代币的数量很容易出错,这可能导致池流失。通过以下安全挑战进行练习:Ethernaut 22 Dex
本文是系列文章的一部分。请参见 Uniswap V2 Book 了解其余内容。还可以查看我们的 区块链训练营 来了解我们的其他课程。
最初发表于 2023 年 11 月 15 日
- 原文链接: rareskills.io/post/unisw...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!