📢 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的代码实现,学习到更多实际项目中的知识点。看再多文章也不如实际动手,希望这些经验对想学习合约开发的新手有所帮助。