Uniswap合约开发7大技巧:提升DeFi项目效率与安全性

robot
摘要生成中

合约开发技巧:从Uniswap代码中学到的宝贵经验

近期在编写去中心化交易所开发教程时,通过研究Uniswap V3的代码实现,学习到了不少合约开发的技巧。作为一名刚接触Defi合约开发的新手,这些小技巧对我很有启发,相信对其他想学习合约开发的新手也会有所帮助。

Web3 新手系列:我从 Uniswap 代码中学到的合约开发小技巧

可预测的合约部署地址

通常部署合约得到的地址看似随机,难以预测。但在某些场景下,我们需要通过交易对和相关信息推断出合约地址,如判断交易权限或获取池子地址等。

Uniswap采用CREATE2方式创建合约,通过添加"salt"参数使得创建的合约地址可预测。新地址生成逻辑为:hash("0xFF",创建者地址, salt, initcode)。这种方法在很多情况下非常实用。

Web3 新手系列:我从 Uniswap 代码中学到的合约开发小技巧

善用回调函数

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方法,逻辑更简单。

Web3 新手系列:我从 Uniswap 代码中学到的合约开发小技巧

大数解决精度问题

Uniswap代码中涉及许多计算逻辑,如根据当前价格和流动性计算交换的Token。为避免除法操作丢失精度,计算过程经常使用"<< FixedPoint96.RESOLUTION"操作,即左移96位,相当于乘以2^96。左移后再做除法,在正常交易不溢出的情况下保证精度。

虽然理论上仍会有微小的精度丢失,但已可接受。

Share方式计算收益

Uniswap需记录LP(流动性提供者)的手续费收益。显然不能每次交易都给每个LP记录手续费,这会消耗大量Gas。

Uniswap的Position结构体中包含feeGrowthInside0LastX128和feeGrowthInside1LastX128,记录每个头寸上次提取手续费时每个流动性应得的手续费。

只需记录总手续费和每个流动性应分配的手续费,LP提取时按持有流动性计算可提取手续费。类似持有公司股票,提取收益时只需知道历史每股收益和上次提取时的收益。

Web3 新手系列:我从 Uniswap 代码中学到的合约开发小技巧

非关键信息无需上链

链上存储相对昂贵,并非所有信息都需上链或从链上获取。如Uniswap前端调用的许多接口是传统Web2接口。

交易池列表、信息等可存储在普通数据库中,部分需定期从链上同步。无需实时调用链或节点服务的RPC接口获取相关数据。

当然,关键交易必须在链上进行。

合约拆分与利用标准合约

一个项目可能包含多个实际部署的合约。即使实际部署只有一个,也可通过继承拆分为多个合约维护。

如Uniswap的NonfungiblePositionManager合约继承了多个合约。其中ERC721Permit直接使用了OpenZeppelin的ERC721合约,既便于通过NFT管理头寸,又提高了开发效率。

结语

亲身实践开发一个简易版去中心化交易所,能让你更深入理解Uniswap的代码实现,学习到更多实际项目中的知识点。看再多文章也不如实际动手,希望这些经验对想学习合约开发的新手有所帮助。

Web3 新手系列:我从 Uniswap 代码中学到的合约开发小技巧

UNI-3.19%
DEFI-1.7%
此页面可能包含第三方内容,仅供参考(非陈述/保证),不应被视为 Gate 认可其观点表述,也不得被视为财务或专业建议。详见声明
  • 赞赏
  • 10
  • 转发
  • 分享
评论
0/400
Gas_Guzzlervip
· 07-18 21:18
靠 别跟新手玩这么深
回复0
LowCapGemHuntervip
· 07-17 14:17
开发老鸟必备tips了啊
回复0
智能钱包vip
· 07-15 22:24
链上交易都逃不过我的眼睛
回复0
WalletDetectivevip
· 07-15 22:24
v3这么简单?看完发现我啥都不懂
回复0
gas_guzzlervip
· 07-15 22:21
又在凭本事薅羊毛
回复0
梭哈爸爸vip
· 07-15 21:55
V3的代码是真滴硬啊
回复0
SleepyValidatorvip
· 07-15 21:55
讲这么细 还不如自己卷源码
回复0
交易,随时随地
qrCode
扫码下载 Gate App
社群列表
简体中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)