构建Uniswap V2克隆的清单

文章提供了使用现代Solidity或Huff从头重建Uniswap v2的详细指南,涵盖了多个优化建议和注意事项。

使用现代 Solidity(或者如果你真的想挑战自我,使用 Huff)从零开始重建 Uniswap v2 非常具有教育意义。以下是一些提示和建议。

  • 使用更新版本的 Solidity。注意,这将导致语法变化。
  • 将定点数替换为自定义数据类型。
  • 使用 Solady 的 ERC20 来节省 gas。
  • 不要使用 Uniswap V2 当前的防重入保护,它已经不再 gas 高效,使用 OpenZeppelin 的或其他替代方案。
  • 在价格预言机中小心添加 unchecked,它预期会溢出。
  • 在 Solidity 0.8.0 或更高版本中不要使用 safeMath
  • 如果你不单独实现路由器,滑点安全检查需要内置到合约中。EOAs 不能在交易中发送代币。
  • 务必将重入锁放在正确的位置。Uniswap V2 是否容易受到只读重入攻击?为什么或为什么不?
  • 由于 Solidity 的更新,工厂合约可以在不使用汇编的情况下简化。
  • 注意费转移代币或重新定价代币。
  • 使用 Solady 库可以更高效地实现平方根函数,但确保你在正确的方向上进行舍入。
  • Uniswap 使用魔术数字硬编码费用,这不是编写代码的理想方式。
  • 不要忘记遵循专业的 Solidity 风格指南(Uniswap V2 没有遵循)。
  • 工厂跟踪交易对的方式并不 gas 高效,尝试改进它。
  • 原始实现中的一些存储变量可以设为不可变的(Uniswap V2 发布时不可变变量不可用)。
  • 自定义错误通常比 require 语句部署成本更低。
  • 当销毁初始供应时,确保 totalSupply 不会降为零。否则,防御首次存款攻击的机制将不起作用。一些销毁的实现会减少总供应量,而不是像 Uniswap 意图的那样锁定资金。
  • 在计算份额时,确保按正确顺序执行 burnmintupdate 储备。
  • Uniswap V2 的 _safeTransfer 容易受到内存扩展攻击(虽然可能性很低,但仍应防范)。由于只会读取一个 bool,最好只 returndatacopy 一个词。尽量避免养成从其他合约中读取整个返回数据的习惯。
  • 一个好的不变量测试是,如果没有调用 burn,流动性不应该下降。
  • 不要使用余额变量或池余额作为预言机,这些容易受到闪电贷攻击。
  • 记住在进行交易或创建或销毁份额时,始终有利于池进行舍入。
  • 不要忘记编写单元测试。
  • 阅读我们的 Solidity gas 优化 书籍,以获得性能改进的灵感(在你完成 Uniswap 克隆的第二或第三稿并编写测试之后)。如果你想挑战高难度,有几个机会可以在不显著牺牲可读性的情况下使用汇编来改进 gas。
  • 试试 DamnVulnerableDefi Puppet V2。此时你应该很容易解决它。

了解更多

该材料是我们高级 Solidity 训练课的一部分。请参阅程序以了解更多。

原文发布于 2023 年 11 月 1 日

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/