通過代碼理解 Uniswap 的智能合約構成與核心邏輯。

原文標題:《Code Review 回顧:去中心化交易所 Uniswap》
撰文:要飛的 Harry

這次 Code Review 的項目是去中心化交易所 Uniswap,領讀員是 Tiny 熊。

視頻回顧在 這裏

Uniswap 介紹

Uniswap 的核心原理利用了一個簡單的常量乘積模型:K = x * y,其中 x,y 爲代幣數量。在交易的過程中,需要保持 K 值不變,所以 x 和 y 的變化方向是相反的。可以參考下面的三幅圖來理解如何在 Uniswap 中交易和增加流動性。

代碼解讀

Uniswap 有兩個核心的項目:

uniswap-v2-core 項目

這個項目中的代碼通常不會被用戶直接調用,而是被 uniswap-v2-periphery 項目中的路由合約調用,因爲路由合約的接口更友好。

合約:UniswapV2Factory.sol

核心方法:

createPair:用來創建一個交易對。接收兩個 token 的地址作爲參數,然後調用匯編方法 create2 創建 pair,之後 調用 IUniswapV2Pair 的 initialize 方法初始化 pair。創建成功後發出 PairCreated 事件。

合約:UniswapV2Pair.sol

這個合約相當於

核心方法:

  1. mint:給指定的地址 mint LP token。
  2. burn:burn 掉 LP token,發送給用戶對應的 token0 和 token1。
  3. swap:交易。

uniswap-v2-periphery 項目

這個項目會被前端直接調用,之後會調用進 uniswap-v2-core 項目中的對應方法。

合約:UniswapV2Router02.sol

核心方法:

  1. addLiquidity:提供兩種 ERC-20 token,給 ERC-20⇄ERC-20 池子添加流動性
  2. removeLiquidity:移除 ERC-20⇄ERC-20 池子的流動性,接收兩種 ERC-20 token
  3. removeLiquidityWithPermit:讓用戶提前簽好名授權(approve)合約,這樣就省去了 approve 交易,只需要一筆交易就可以完成 approve + transferFrom 的操作。
  4. swapExactTokensForTokens:交易。指定發送 (in) 的 token0 數量,讓合約計算得到 (out) 的 token1 數量
  5. swapTokensForExactTokens:交易。指定想要得到 (out) 的 token1 數量,讓合約計算需要發送 (in) 的 token0 數量

更多的關於合約方法的描述,可以參考 Uniswap 的 文檔