您的位置: > 比特币行情> 正文

打印本文             

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

最近在写一个去中心化交易所开发的教程 https://github.com/WTFAcademy/WTF-Dapp,参考了 Uniswap V3 的代码实现,学习到了很多知识点。笔者之前开发过简单的 NFT 合约,这次是第一次尝试开发 Defi 的合约,相信这些小技巧会对想要学习合约开发的小白会很有帮助。

合约开发的大佬可以直接前往 https://github.com/WTFAcademy/WTF-Dapp一起来贡献代码,为 Web3 添砖加瓦~

接下来就让我们看看这些小技巧吧,有的甚至称得上是奇技淫巧。

合约部署的合约地址有办法做到是可预测的

我们一般部署合约得到的都是一个看上去随机的地址,因为和「 nonce 」有关,所以合约地址不好预测。但是在 Uniswap 中,我们会有这样的需求:需要通过交易对和相关信息就能推理出合约的地址。这在很多情况下很管用,比如判断交易的权限,或者获取池子的地址等。

在 Uniswap 中,创建合约是通过「 pool = address(new Uniswap V3 Pool{salt: keccak 256(abi.encode(token 0, token 1, fee))}()); 」这样的代码来创建的。通过添加了「 salt 」来使用 CREATE 2  (https://github.com/AmazingAng/WTF-Solidity/blob/main/25_Create2/readme.md)的方式来创建合约,这样的好处是创建出来的合约地址是可预测的,地址生成的逻辑是「 新地址 = hash("0x FF",创建者地址, salt, initcode)」 。

这部分内容你可以查看 WTF-DApp 课程的 https://github.com/WTFAcademy/WTF-Dapp/blob/main/P103_Factory/readme.md这一章来了解更多。

善用回调函数

在 Solidity 中,合约之间可以互相调用。有一种场景是 A 在某个方法调用 B,B 在被调用的方法中回调 A,这在某些场景中也很管用。

在 Uniswap 中,当你调用「 Uniswap V3 Pool 」合约的「 swap 」方法交易时,它会回调「 swapCallback 」,回调会传入计算出来的本次交易实际需要的「 Token 」,调用方需要在回调中将交易需要的 Token 转入「 Uniswap V3 Pool 」,而不是把「 swap 」方法拆开为两部分让调用方调用,这样确保了「 swap 」方法的安全性,确保整个逻辑都是被完整执行的,而不需要繁琐的变量记录来确保安全性。

代码片段如下:

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

你可以学习课程中关于交易的部分内容了解更多 https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md。

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

可以看到,首先在 Uniswap 中价格都是用平方根乘以「 2 ^ 96 」(对应上面代码中的「 sqrtRatioAX 96 」和「 sqrtRatioBX 96 」),然后流动性「 liquidity 」会左移计算出「 numerator 1 」。在下面的计算中,「 2 ^ 96 」会在计算过程中被约掉,得到最后的结果。

当然,不管如何,理论上还是会有精度的丢失的,不过这种情况都是最小单位的丢失了,是可以接受的。

更多内容你可以学习 https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md这一篇课程了解更多。

https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol 合约就继承了很多合约,代码如下:

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

而且你在看「 ERC 721 Permit 」合约的实现时,你会发现它直接使用了「 @openzeppelin/contracts/token/ERC 721/ERC 721.sol 」合约,这样一方面方便通过 NFT 的方式来管理头寸,另外一方面也可以用已有的标准的合约来提高合约的开发效率。

在我们的课程中,你可以学习 https://github.com/WTFAcademy/WTF-Dapp/blob/main/ P 108 _PositionManager /readme.md尝试开发一个简单的 ERC 721 的合约来管理头寸。


提高PVP胜率,收好这份Memecoin工具进阶指南

推特类

推特作为信息发酵的一大渠道,具有很强的传播效应。Web 2 与 Web 3 的相关信息都在其上传播,及时的推特监控可以帮你快人一步发现金狗。例如:它可以让你在 Musk 换头像换资料换置顶的第一时间发现并找到 10 倍币;同时也可以通过推特共同关注数初步判断项目的优劣。

  • 推特监控(https://alpha.apidance.pro/welcome):一款野生程序员自行开发的付费推特监控工具。可及时监控推特用户关注的项目,寻找 Alpha 项目和赚钱机会。

  • 篡改猴(tampermonkey.net):一个推特改名插件。可以帮助你给众多推特加备注,一眼识破发过多个盘子 Rug 的 Dev,也可以标记聪明钱包,各类 Kol 等。

提高PVP胜率,收好这份Memecoin工具进阶指南

  • Tweetscout:针对 alpha、活跃程度、粉丝数量等判定综合得分的加密货币分析工具。通过追踪并分析大量加密推特数据,用户可以输入任何与加密货币相关的 Twitter 帐户进行快速分析。

关联地址

通过关联地址分析不仅可以追踪聪明钱,也可以在关键支撑位发现大单买入和庄家地址。便于我们判断成本价及时逃顶或抄底,是链上 PvP 的必修课。

  • Debank:多链 DeFi 投资组合跟踪器,支持跨多个链的 DeFi 协议。EVM 生态钱包持仓和数据分析必备基础工具,也可以搜索查询钱包地址关联的推特 KOL。

  • Metasleuth:资金流向可视化工具,是链上追踪钱包信息可视化非常好用的工具之一。目前 EVM 生态免费,Solana 需要额外付费使用。由 BlockSec 开发,BlockSec 是一家区块链安全公司,除 MetaSleuth 外,还提供数字资产代码安全审计、攻击防范、反洗钱服务。

提高PVP胜率,收好这份Memecoin工具进阶指南

  • Bubblemaps:代币筹码分布可视化工具。利用泡泡的形式直观展现地址关联度及筹码集中程度,可以让用户更轻松分析出复杂地址关联下,代币的内幕程度。

提高PVP胜率,收好这份Memecoin工具进阶指南

  • Holderscan:一个链上数据平台。可用于探索加密货币代币持有者的实时和历史数据。

提高PVP胜率,收好这份Memecoin工具进阶指南

  • Kaito:AI 驱动的 Web 3 信息平台。可以将 TB 级非结构化信息转化为可视化数据,为决策提供依据。

提高PVP胜率,收好这份Memecoin工具进阶指南

提高PVP胜率,收好这份Memecoin工具进阶指南

提高PVP胜率,收好这份Memecoin工具进阶指南 原文作...

关于我们

币安下载官方app|币安iOS版|币安安卓版|币安电脑网页版

  • 用户支持
  • 帮助中心
  • 服务条款
微信二维码
币安官网渠道 数字区块链交易平台 Powered by binance
QR code