📢 Gate廣場獨家活動: #PUBLIC创作大赛# 正式開啓!
參與 Gate Launchpool 第 297 期 — PublicAI (PUBLIC),並在 Gate廣場發布你的原創內容,即有機會瓜分 4,000 枚 $PUBLIC 獎勵池!
🎨 活動時間
2025年8月18日 10:00 – 2025年8月22日 16:00 (UTC)
📌 參與方式
在 Gate廣場發布與 PublicAI (PUBLIC) 或當前 Launchpool 活動相關的原創內容
內容需不少於 100 字(可爲分析、教程、創意圖文、測評等)
添加話題: #PUBLIC创作大赛#
帖子需附帶 Launchpool 參與截圖(如質押記錄、領取頁面等)
🏆 獎勵設置(總計 4,000 枚 $PUBLIC)
🥇 一等獎(1名):1,500 $PUBLIC
🥈 二等獎(3名):每人 500 $PUBLIC
🥉 三等獎(5名):每人 200 $PUBLIC
📋 評選標準
內容質量(相關性、清晰度、創意性)
互動熱度(點讚、評論)
含有 Launchpool 參與截圖的帖子將優先考慮
📄 注意事項
所有內容須爲原創,嚴禁抄襲或虛假互動
獲獎用戶需完成 Gate廣場實名認證
Gate 保留本次活動的最終解釋權
Uniswap合約開發7大技巧:提升DeFi項目效率與安全性
合約開發技巧:從Uniswap代碼中學到的寶貴經驗
近期在編寫去中心化交易所開發教程時,通過研究Uniswap V3的代碼實現,學習到了不少合約開發的技巧。作爲一名剛接觸Defi合約開發的新手,這些小技巧對我很有啓發,相信對其他想學習合約開發的新手也會有所幫助。
可預測的合約部署地址
通常部署合約得到的地址看似隨機,難以預測。但在某些場景下,我們需要通過交易對和相關信息推斷出合約地址,如判斷交易權限或獲取池子地址等。
Uniswap採用CREATE2方式創建合約,通過添加"salt"參數使得創建的合約地址可預測。新地址生成邏輯爲:hash("0xFF",創建者地址, salt, initcode)。這種方法在很多情況下非常實用。
善用回調函數
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方法,邏輯更簡單。
大數解決精度問題
Uniswap代碼中涉及許多計算邏輯,如根據當前價格和流動性計算交換的Token。爲避免除法操作丟失精度,計算過程經常使用"<< FixedPoint96.RESOLUTION"操作,即左移96位,相當於乘以2^96。左移後再做除法,在正常交易不溢出的情況下保證精度。
雖然理論上仍會有微小的精度丟失,但已可接受。
Share方式計算收益
Uniswap需記錄LP(流動性提供者)的手續費收益。顯然不能每次交易都給每個LP記錄手續費,這會消耗大量Gas。
Uniswap的Position結構體中包含feeGrowthInside0LastX128和feeGrowthInside1LastX128,記錄每個頭寸上次提取手續費時每個流動性應得的手續費。
只需記錄總手續費和每個流動性應分配的手續費,LP提取時按持有流動性計算可提取手續費。類似持有公司股票,提取收益時只需知道歷史每股收益和上次提取時的收益。
非關鍵信息無需上鏈
鏈上存儲相對昂貴,並非所有信息都需上鏈或從鏈上獲取。如Uniswap前端調用的許多接口是傳統Web2接口。
交易池列表、信息等可存儲在普通數據庫中,部分需定期從鏈上同步。無需實時調用鏈或節點服務的RPC接口獲取相關數據。
當然,關鍵交易必須在鏈上進行。
合約拆分與利用標準合約
一個項目可能包含多個實際部署的合約。即使實際部署只有一個,也可通過繼承拆分爲多個合約維護。
如Uniswap的NonfungiblePositionManager合約繼承了多個合約。其中ERC721Permit直接使用了OpenZeppelin的ERC721合約,既便於通過NFT管理頭寸,又提高了開發效率。
結語
親身實踐開發一個簡易版去中心化交易所,能讓你更深入理解Uniswap的代碼實現,學習到更多實際項目中的知識點。看再多文章也不如實際動手,希望這些經驗對想學習合約開發的新手有所幫助。