🎉 #Gate Alpha 第三届积分狂欢节 & ES Launchpool# 联合推广任务上线!
本次活动总奖池:1,250 枚 ES
任务目标:推广 Eclipse($ES)Launchpool 和 Alpha 第11期 $ES 专场
📄 详情参考:
Launchpool 公告:https://www.gate.com/zh/announcements/article/46134
Alpha 第11期公告:https://www.gate.com/zh/announcements/article/46137
🧩【任务内容】
请围绕 Launchpool 和 Alpha 第11期 活动进行内容创作,并晒出参与截图。
📸【参与方式】
1️⃣ 带上Tag #Gate Alpha 第三届积分狂欢节 & ES Launchpool# 发帖
2️⃣ 晒出以下任一截图:
Launchpool 质押截图(BTC / ETH / ES)
Alpha 交易页面截图(交易 ES)
3️⃣ 发布图文内容,可参考以下方向(≥60字):
简介 ES/Eclipse 项目亮点、代币机制等基本信息
分享你对 ES 项目的观点、前景判断、挖矿体验等
分析 Launchpool 挖矿 或 Alpha 积分玩法的策略和收益对比
🎁【奖励说明】
评选内容质量最优的 10 位 Launchpool/Gate
Uniswap源码解析:7个合约开发小技巧助力DEX入门
合约开发小技巧:从Uniswap代码中学到的宝贵经验
近期在开发一个去中心化交易所教程时,参考了某知名DEX的代码实现,学到了不少有趣的知识点。作为一名之前只开发过简单NFT合约的新手,第一次尝试Defi合约开发,这些技巧对想入门的开发者应该很有帮助。
接下来就让我们一起来看看这些实用的小技巧吧,有些甚至可以称得上是奇技淫巧。
可预测的合约部署地址
通常部署的合约地址看起来是随机的,因为和nonce有关。但在某些场景下,我们需要通过交易对等信息推断出合约地址,这在判断交易权限或获取池子地址时很有用。
可以通过添加salt参数使用CREATE2方式创建合约,这样生成的地址是可预测的。地址生成逻辑为:新地址 = hash("0xFF",创建者地址, salt, initcode)。
巧用回调函数
在Solidity中,合约之间可以互相调用。有时A方法调用B,B在被调用方法中回调A,这在某些场景很实用。
比如交易时,pool合约的swap方法会回调swapCallback,传入实际需要的Token数量。调用方需在回调中转入Token,而不是将swap拆分为两步调用。这确保了swap方法的完整执行和安全性。
用异常传递信息,用try-catch实现交易预估
在预估交易时,我们需要模拟swap但不实际交换Token。可以在回调中抛出特殊错误,然后捕获并从错误信息中解析所需数据。这样就无需为预估需求改造swap方法,逻辑更简单。
使用大数解决精度问题
在复杂计算中,为避免除法丢失精度,可以先左移96位(相当于乘2^96),计算后再右移。这样在不溢出的前提下能保证精度。最小单位的精度损失通常可以接受。
用Share方式计算收益
对于LP收益计算,不能每次交易都记录。可以记录总手续费和每个流动性应得的份额,LP提取时按持有流动性计算。类似股票分红,只需知道每股收益历史和上次提取时间即可。
链下存储部分信息
链上存储相对昂贵,不是所有信息都要上链。如交易池列表、信息等可存在普通数据库,定期从链上同步。某些高级RPC接口也提供了更快速便宜的数据获取方式。
合理拆分合约,利用现有标准
一个项目可能包含多个实际部署的合约。即使只部署一个,也可通过继承拆分为多个合约维护。同时可利用ERC721等现有标准合约提高开发效率。
总结
亲自动手实现一个简易版DEX,能更深入理解代码实现,学到更多实际项目中的知识点。建议感兴趣的朋友可以尝试跟着相关教程一步步完成,相信会有很大收获。