📢 #Gate广场征文活动第二期# 正式啓動!
分享你對 $ERA 項目的獨特觀點,推廣ERA上線活動, 700 $ERA 等你來贏!
💰 獎勵:
一等獎(1名): 100枚 $ERA
二等獎(5名): 每人 60 枚 $ERA
三等獎(10名): 每人 30 枚 $ERA
👉 參與方式:
1.在 Gate廣場發布你對 ERA 項目的獨到見解貼文
2.在貼文中添加標籤: #Gate广场征文活动第二期# ,貼文字數不低於300字
3.將你的文章或觀點同步到X,加上標籤:Gate Square 和 ERA
4.徵文內容涵蓋但不限於以下創作方向:
ERA 項目亮點:作爲區塊鏈基礎設施公司,ERA 擁有哪些核心優勢?
ERA 代幣經濟模型:如何保障代幣的長期價值及生態可持續發展?
參與並推廣 Gate x Caldera (ERA) 生態周活動。點擊查看活動詳情:https://www.gate.com/announcements/article/46169。
歡迎圍繞上述主題,或從其他獨特視角提出您的見解與建議。
⚠️ 活動要求:
原創內容,至少 300 字, 重復或抄襲內容將被淘汰。
不得使用 #Gate广场征文活动第二期# 和 #ERA# 以外的任何標籤。
每篇文章必須獲得 至少3個互動,否則無法獲得獎勵
鼓勵圖文並茂、深度分析,觀點獨到。
⏰ 活動時間:2025年7月20日 17
Uniswap合約開發7大技巧:從可預測地址到鏈上鏈下平衡
合約開發的小技巧:從 Uniswap 代碼中學到的經驗
最近在編寫一個去中心化交易所的教程時,參考了 Uniswap V3 的實現,學到了不少有趣的知識點。作爲一個剛接觸 Defi 合約開發的新手,這些技巧對我很有啓發,相信對其他想學習智能合約開發的朋友也會有幫助。
可預測的合約地址
通常部署的合約地址看起來是隨機的,因爲與 nonce 相關。但在某些場景下,我們需要通過交易對信息推斷出合約地址,比如判斷交易權限或獲取池子地址。
Uniswap 通過使用 CREATE2 的方式創建合約,添加了 salt 參數。這樣生成的合約地址是可預測的,遵循"新地址 = hash('0xFF',創建者地址, salt, initcode)"的邏輯。
巧用回調函數
在 Solidity 中,合約間可以相互調用。有時 A 合約調用 B 合約的方法,B 再回調 A 的方法,這在某些場景很有用。
例如,Uniswap 的交易流程中,當調用 UniswapV3Pool 合約的 swap 方法時,它會回調 swapCallback,傳入實際需要的 Token 數量。調用方需要在回調中轉入所需 Token,這確保了整個交易邏輯的完整性和安全性。
用異常傳遞信息,用 try catch 實現交易預估
Uniswap 的 Quoter 合約中,用 try catch 包裹執行 UniswapV3Pool 的 swap 方法。這是爲了模擬交易預估所需 Token,但預估時不會實際交換 Token,所以會報錯。
Uniswap 通過在交易回調函數中拋出特殊錯誤,然後捕獲該錯誤並解析信息。這種方法雖看似取巧,但很實用,無需爲預估需求專門改造 swap 方法。
大數處理精度問題
Uniswap 代碼中涉及大量計算,如根據當前價格和流動性計算交換的 Token 數量。爲避免除法操作丟失精度,計算過程經常使用"<< FixedPoint96.RESOLUTION"操作,相當於乘以 2^96。
這種方法在保證正常交易不溢出的同時(通常用 uint256 計算),也能保證精度。雖然理論上仍可能有最小單位的精度損失,但已可以接受。
用 Share 方式計算收益
Uniswap 中需要記錄流動性提供者(LP)的手續費收益。爲避免每次交易都給每個 LP 記錄手續費(耗費大量 Gas),Uniswap 採用了一種巧妙的方法。
在 Position 結構體中定義了 feeGrowthInside0LastX128 和 feeGrowthInside1LastX128,記錄每個頭寸上次提取手續費時每單位流動性應得的手續費。這樣只需記錄總手續費和每單位流動性的分配額,LP 提取時按持有的流動性計算可提取的手續費即可。
鏈上鏈下信息獲取的平衡
鏈上存儲相對昂貴,並非所有信息都需要上鏈或從鏈上獲取。如 Uniswap 前端調用的許多接口是傳統 Web2 接口。
交易池列表、交易池信息等可存儲在普通數據庫中,定期從鏈上同步。無需實時調用鏈或節點服務的 RPC 接口獲取相關數據。
某些區塊鏈 RPC 供應商提供了高級接口,可更快速、便宜地獲取數據。這些接口通常通過緩存提高性能和效率。
合約拆分和利用標準合約
一個項目可能包含多個實際部署的合約。即使只部署一個合約,代碼也可以通過繼承拆分爲多個合約來維護。
例如,Uniswap 的 NonfungiblePositionManager 合約繼承了多個合約。其中 ERC721Permit 合約直接使用了 OpenZeppelin 的標準 ERC721 合約實現,既方便用 NFT 方式管理頭寸,又提高了開發效率。
結語
實踐是最好的學習方法。通過嘗試實現一個簡易版的去中心化交易所,可以更深入地理解 Uniswap 的代碼實現,也能學到更多實際項目中的知識點。希望這些經驗能對有志於 Web3 和 Defi 項目開發的朋友有所幫助。