原文標題:《Code Review 回顧:去中心化交易所 Uniswap》
撰文:要飛的 Harry
這次 Code Review 的項目是去中心化交易所 Uniswap,領讀員是 Tiny 熊。
視訊回顧在 這里。
Uniswap 介紹
Uniswap 的核心原理利用了一個簡單的常量乘積模型:K = x * y,其中 x,y 為代幣數量,在交易的過程中,需要保持 K 值不變,所以 x 和 y 的變化方向是相反的。可以參考下面的三幅圖來理解如何在 Uniswap 中交易和增加流動性,
代碼解讀
Uniswap 有兩個核心的項目:
- 用來托管 Uniswap 的資產
- 用來與 Uniswap 進行交互
uniswap-v2-core 項目
這個項目中的代碼通常不會被用戶直接調用,而是被 uniswap-v2-periphery 項目中的路由合約調用,因為路由合約的接口更友好,
合約:UniswapV2Factory.sol
核心方法:
createPair:用來創建一個交易對,接收兩個 token 的地址作為參數,然后調用匯編方法 create2 創建 pair,之后 調用 IUniswapV2Pair 的 initialize 方法初始化 pair,創建成功后發出 PairCreated 事件,
合約:UniswapV2Pair.sol
這個合約相當于
核心方法:
- mint:給指定的地址 mint LP token。
- burn:burn 掉 LP token,發送給用戶對應的 token0 和 token1,
- swap:交易。
uniswap-v2-periphery 項目
這個項目會被前端直接調用,之后會調用進 uniswap-v2-core 項目中的對應方法,
合約:UniswapV2Router02.sol
核心方法:
- addLiquidity:提供兩種 ERC-20 token,給 ERC-20⇄ERC-20 池子添加流動性
- removeLiquidity:移除 ERC-20⇄ERC-20 池子的流動性,接收兩種 ERC-20 token
- removeLiquidityWithPermit:讓用戶提前簽好名授權(approve)合約,這樣就省去了 approve 交易,只需要一筆交易就可以完成 approve + transferFrom 的操作。
- swapExactTokensForTokens:交易,指定發送 (in) 的 token0 數量,讓合約計算得到 (out) 的 token1 數量
- swapTokensForExactTokens:交易。指定想要得到 (out) 的 token1 數量,讓合約計算需要發送 (in) 的 token0 數量
更多的關于合約方法的描述,可以參考 Uniswap 的 文檔。