Uniswap代碼解析:7個智能合約開發技巧

robot
摘要生成中

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

近期在編寫去中心化交易所開發教程時,參考了Uniswap V3的實現,學到了不少有趣的知識點。作爲首次嘗試開發Defi合約的新手,這些技巧對其他想學習合約開發的初學者應該會很有幫助。

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

可預測的合約部署地址

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

Uniswap採用了CREATE2的方式來創建合約,添加salt參數使地址可預測。新地址生成邏輯爲:hash("0xFF",創建者地址, salt, initcode)。這種方法讓合約地址變得可預測,非常實用。

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

巧用回調函數

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

Uniswap的swap交易就採用了回調機制。UniswapV3Pool的swap方法會回調swapCallback,傳入實際需要的Token數量。調用方需在回調中轉入Token,確保了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。

解決方案是在Position結構體中記錄feeGrowthInside0LastX128和feeGrowthInside1LastX128,表示每個頭寸上次提取手續費時每單位流動性應得的手續費。

只需記錄總手續費和每單位流動性分配的手續費,LP提取時根據持有的流動性即可計算可提取手續費。類似持有股票,提取收益時只需知道歷史每股收益和上次提取時的收益即可。

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

並非所有信息都需從鏈上獲取

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

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

許多區塊鏈RPC供應商也提供了高級接口,可更快速便宜地獲取某些數據。這些接口通常利用緩存來提高性能和效率。

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

學會合約拆分和利用已有標準合約

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

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

總結

親自動手開發一個簡易版去中心化交易所,能讓你更深入理解Uniswap的實現,學習到更多實際項目中的知識點。理論學習固然重要,但實踐經驗更爲寶貴。希望這些小技巧能對你的合約開發之路有所幫助。

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

UNI4.23%
查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 7
  • 分享
留言
0/400
Gas_Wastervip
· 07-16 11:49
学合约的都得看
回復0
难道我又错过空投vip
· 07-16 07:39
学合约来不及了。。。
回復0
YieldWhisperervip
· 07-14 20:20
在2020年在dyydx看到过这个确切的模式……老实说没什么新鲜的
查看原文回復0
MEVictimvip
· 07-14 20:18
查单这些破知识真的有用吗
回復0
VitaliksTwinvip
· 07-14 20:14
有点东西 还挺实在
回復0
分叉自由主义者vip
· 07-14 20:13
Uniswap又玩新活?
回復0
QuorumVotervip
· 07-14 20:00
写的不错 安排学习了
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)