📢 #Gate广场征文活动第三期# 正式啓動!
🎮 本期聚焦:Yooldo Games (ESPORTS)
✍️ 分享獨特見解 + 參與互動推廣,若同步參與 Gate 第 286 期 Launchpool、CandyDrop 或 Alpha 活動,即可獲得任意獎勵資格!
💡 內容創作 + 空投參與 = 雙重加分,大獎候選人就是你!
💰總獎池:4,464 枚 $ESPORTS
🏆 一等獎(1名):964 枚
🥈 二等獎(5名):每人 400 枚
🥉 三等獎(10名):每人 150 枚
🚀 參與方式:
在 Gate廣場發布不少於 300 字的原創文章
添加標籤: #Gate广场征文活动第三期#
每篇文章需 ≥3 個互動(點讚 / 評論 / 轉發)
發布參與 Launchpool / CandyDrop / Alpha 任一活動的截圖,作爲獲獎資格憑證
同步轉發至 X(推特)可增加獲獎概率,標籤:#GateSquare 👉 https://www.gate.com/questionnaire/6907
🎯 雙倍獎勵機會:參與第 286 期 Launchpool!
質押 BTC 或 ESPORTS,瓜分 803,571 枚 $ESPORTS,每小時發放
時間:7 月 21 日 20:00 – 7 月 25 日 20:00(UTC+8)
🧠 寫作方向建議:
Yooldo
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 項目開發的朋友有所幫助。