Uniswap合約開發7大技巧:從可預測地址到鏈上鏈下平衡

robot
摘要生成中

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

最近在編寫一個去中心化交易所的教程時,參考了 Uniswap V3 的實現,學到了不少有趣的知識點。作爲一個剛接觸 Defi 合約開發的新手,這些技巧對我很有啓發,相信對其他想學習智能合約開發的朋友也會有幫助。

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

可預測的合約地址

通常部署的合約地址看起來是隨機的,因爲與 nonce 相關。但在某些場景下,我們需要通過交易對信息推斷出合約地址,比如判斷交易權限或獲取池子地址。

Uniswap 通過使用 CREATE2 的方式創建合約,添加了 salt 參數。這樣生成的合約地址是可預測的,遵循"新地址 = hash('0xFF',創建者地址, salt, initcode)"的邏輯。

巧用回調函數

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

例如,Uniswap 的交易流程中,當調用 UniswapV3Pool 合約的 swap 方法時,它會回調 swapCallback,傳入實際需要的 Token 數量。調用方需要在回調中轉入所需 Token,這確保了整個交易邏輯的完整性和安全性。

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

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

Uniswap 的 Quoter 合約中,用 try catch 包裹執行 UniswapV3Pool 的 swap 方法。這是爲了模擬交易預估所需 Token,但預估時不會實際交換 Token,所以會報錯。

Uniswap 通過在交易回調函數中拋出特殊錯誤,然後捕獲該錯誤並解析信息。這種方法雖看似取巧,但很實用,無需爲預估需求專門改造 swap 方法。

大數處理精度問題

Uniswap 代碼中涉及大量計算,如根據當前價格和流動性計算交換的 Token 數量。爲避免除法操作丟失精度,計算過程經常使用"<< FixedPoint96.RESOLUTION"操作,相當於乘以 2^96。

這種方法在保證正常交易不溢出的同時(通常用 uint256 計算),也能保證精度。雖然理論上仍可能有最小單位的精度損失,但已可以接受。

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

用 Share 方式計算收益

Uniswap 中需要記錄流動性提供者(LP)的手續費收益。爲避免每次交易都給每個 LP 記錄手續費(耗費大量 Gas),Uniswap 採用了一種巧妙的方法。

在 Position 結構體中定義了 feeGrowthInside0LastX128 和 feeGrowthInside1LastX128,記錄每個頭寸上次提取手續費時每單位流動性應得的手續費。這樣只需記錄總手續費和每單位流動性的分配額,LP 提取時按持有的流動性計算可提取的手續費即可。

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

鏈上鏈下信息獲取的平衡

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

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

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

合約拆分和利用標準合約

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

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

結語

實踐是最好的學習方法。通過嘗試實現一個簡易版的去中心化交易所,可以更深入地理解 Uniswap 的代碼實現,也能學到更多實際項目中的知識點。希望這些經驗能對有志於 Web3 和 Defi 項目開發的朋友有所幫助。

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

查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 6
  • 分享
留言
0/400
StableNomadvip
· 3小時前
从统计上讲,uniswap 仍然拥有最干净的代码库……只是说说而已
查看原文回復0
稳定币焦虑症vip
· 3小時前
地址可预测这个太关键了!
回復0
Pump策略师vip
· 3小時前
啧啧,DEX也玩预言机花活儿,大资金可玩性又增加了
回復0
ZkProofPuddingvip
· 3小時前
大佬的合约玩得透啊
回復0
无常亏损收藏家vip
· 3小時前
别学Uni 跑路第一名
回復0
FUD Vaccinatorvip
· 3小時前
靠谱干货了属于是
回復0
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)