Uniswap合約開發7大技巧:提升DeFi項目效率與安全性

robot
摘要生成中

合約開發技巧:從Uniswap代碼中學到的寶貴經驗

近期在編寫去中心化交易所開發教程時,通過研究Uniswap V3的代碼實現,學習到了不少合約開發的技巧。作爲一名剛接觸Defi合約開發的新手,這些小技巧對我很有啓發,相信對其他想學習合約開發的新手也會有所幫助。

Web3 新手系列:我從 Uniswap 代碼中學到的合約開發小技巧

可預測的合約部署地址

通常部署合約得到的地址看似隨機,難以預測。但在某些場景下,我們需要通過交易對和相關信息推斷出合約地址,如判斷交易權限或獲取池子地址等。

Uniswap採用CREATE2方式創建合約,通過添加"salt"參數使得創建的合約地址可預測。新地址生成邏輯爲:hash("0xFF",創建者地址, salt, initcode)。這種方法在很多情況下非常實用。

Web3 新手系列:我從 Uniswap 代碼中學到的合約開發小技巧

善用回調函數

Solidity中合約可以互相調用。有時A調用B的方法,B在被調用方法中回調A,這在某些場景中很有用。

例如Uniswap的swap方法中,UniswapV3Pool合約會回調swapCallback,傳入本次交易實際需要的Token。調用方需在回調中將所需Token轉入UniswapV3Pool,而不是將swap方法拆分。這確保了swap方法的安全性和完整執行,無需繁瑣的變量記錄。

用異常傳遞信息,用try catch實現交易預估

Uniswap的Quoter合約中,用try catch包裹執行UniswapV3Pool的swap方法。這是爲了模擬swap來預估交易所需Token。預估時不會實際交換Token,所以會報錯。Uniswap通過在回調函數中拋出特殊錯誤,然後捕獲該錯誤並解析出所需信息。

這種方法看似取巧,但很實用。無需爲預估交易需求改造swap方法,邏輯更簡單。

Web3 新手系列:我從 Uniswap 代碼中學到的合約開發小技巧

大數解決精度問題

Uniswap代碼中涉及許多計算邏輯,如根據當前價格和流動性計算交換的Token。爲避免除法操作丟失精度,計算過程經常使用"<< FixedPoint96.RESOLUTION"操作,即左移96位,相當於乘以2^96。左移後再做除法,在正常交易不溢出的情況下保證精度。

雖然理論上仍會有微小的精度丟失,但已可接受。

Share方式計算收益

Uniswap需記錄LP(流動性提供者)的手續費收益。顯然不能每次交易都給每個LP記錄手續費,這會消耗大量Gas。

Uniswap的Position結構體中包含feeGrowthInside0LastX128和feeGrowthInside1LastX128,記錄每個頭寸上次提取手續費時每個流動性應得的手續費。

只需記錄總手續費和每個流動性應分配的手續費,LP提取時按持有流動性計算可提取手續費。類似持有公司股票,提取收益時只需知道歷史每股收益和上次提取時的收益。

Web3 新手系列:我從 Uniswap 代碼中學到的合約開發小技巧

非關鍵信息無需上鏈

鏈上存儲相對昂貴,並非所有信息都需上鏈或從鏈上獲取。如Uniswap前端調用的許多接口是傳統Web2接口。

交易池列表、信息等可存儲在普通數據庫中,部分需定期從鏈上同步。無需實時調用鏈或節點服務的RPC接口獲取相關數據。

當然,關鍵交易必須在鏈上進行。

合約拆分與利用標準合約

一個項目可能包含多個實際部署的合約。即使實際部署只有一個,也可通過繼承拆分爲多個合約維護。

如Uniswap的NonfungiblePositionManager合約繼承了多個合約。其中ERC721Permit直接使用了OpenZeppelin的ERC721合約,既便於通過NFT管理頭寸,又提高了開發效率。

結語

親身實踐開發一個簡易版去中心化交易所,能讓你更深入理解Uniswap的代碼實現,學習到更多實際項目中的知識點。看再多文章也不如實際動手,希望這些經驗對想學習合約開發的新手有所幫助。

Web3 新手系列:我從 Uniswap 代碼中學到的合約開發小技巧

UNI-2.38%
DEFI-2.84%
查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 10
  • 轉發
  • 分享
留言
0/400
Gas_Guzzlervip
· 07-18 21:18
靠 别跟新手玩这么深
回復0
LowCapGemHuntervip
· 07-17 14:17
开发老鸟必备tips了啊
回復0
智能钱包vip
· 07-15 22:24
链上交易都逃不过我的眼睛
回復0
WalletDetectivevip
· 07-15 22:24
v3这么简单?看完发现我啥都不懂
回復0
gas_guzzlervip
· 07-15 22:21
又在凭本事薅羊毛
回復0
梭哈爸爸vip
· 07-15 21:55
V3的代码是真滴硬啊
回復0
SleepyValidatorvip
· 07-15 21:55
讲这么细 还不如自己卷源码
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate App
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)