第一部分:注意Solidity开发者,你可能正好达到合约大小限制

本文介绍了智能合约bytecode大小限制的重要性,以及超过限制可能导致的DOS攻击。EIP-170将以太坊智能合约bytecode大小限制设置为24.576 KB。文章列举了多种优化bytecode大小的方法,如避免代码冗余、使用库、采用ERC-2535等,并推荐了hardhat-contract-sizer等工具来监控合约大小。

作为智能合约开发者,始终在预定义的智能合约字节码大小限制内至关重要。

等等,什么是字节码?🤔

用非常简单的术语来说,

人类理解 Solidity,

但是

EVM 理解字节码。

字节码 是我们的 solidity 智能合约(高级编程语言)被翻译成的底层语言

从技术上讲,它代表了一长串机器代码或 操作码,它们是指令片段,定义了特定智能合约应该如何运行。

最重要的是,这些指令很容易被 EVM 理解,因此允许它们准确地解释和执行智能合约。

好的,什么是字节码大小限制?🤔

每个区块链都对可以部署的智能合约字节码的最大大小有限制。

在以太坊的世界中,在 EIP170 实现之后,最大字节码大小为 24.576 KB。

为什么我们甚至要设置限制?😫

此限制是在以太坊中通过 EIP-170 引入的,目的是防止因在区块链上部署和执行过大的智能合约而导致的过度资源使用和潜在的网络拥塞。

该限制设置为 24.576 KB,以维持网络性能并防止可能使区块链膨胀的垃圾邮件攻击。

通过对合约字节码的大小设置合理的限制,以太坊节点可以更有效地处理交易和执行智能合约,因为它们必须在其本地机器上存储和维护整个区块链的副本。 此外,该限制阻止了过度复杂和低效的合约的部署,这可能会对整个网络产生负面影响。

简而言之,这主要是为了防止对网络的任何 DOS 攻击

以下是 ethereum.org 上一篇文章对此的描述:

引入此限制是为了防止拒绝服务 (DOS) 攻击。 任何对合约的调用在 gas 方面都相对便宜。

但是,合约调用对以太坊节点的影响会随着被调用合约代码的大小(从磁盘读取代码、预处理代码、将数据添加到 Merkle 证明)而呈不成比例地增加。 每当你遇到攻击者需要少量资源来为他人造成大量工作的情况时,你就会面临 DOS 攻击的可能性。

来源:ethereum.org

这对作为 Solidity 开发者的你意味着什么?

两件事:

  • 你不仅需要管理 gas 优化,还需要管理你的 合约的字节码大小优化
  • 如果你不断向智能合约添加函数,那么在某个时候你将达到大小阈值,并且你将无法在链上部署该合约。 相信我,这是不可能的。

如果你尝试部署一个合约大小超过 24.576 KB 的极其庞大的合约,你可能会得到以下结果 👇

因此,学习优化技术至关重要,这样智能合约才能在不破坏预期功能的情况下保持在 24.576 KB 的大小限制内。

嗯,这说起来容易做起来难,因为我们可能需要大型合约来实现我们的预期用例

但是,通过充分了解优化合约字节码大小的知识,我们可以编写智能合约来满足我们的需求,而不会超过字节码阈值。

在这个简短的文章系列中,我们将主要学习两件事:

  • Solidity 开发技巧,可以帮助我们优化合约字节码大小。
  • 然后,破译并深入了解为什么其中一些技巧可以帮助我们优化合约字节码大小

一如既往,这将会非常有趣 😀

让我们探讨一些在编写 solidity 代码时要记住的字节码大小优化技巧:

  • 最小化代码冗余: 避免编写重复代码并尽可能重用现有代码。 这可以显着减少智能合约字节码的大小。
  • 开始使用库: 在智能合约中使用可以帮助减少字节码的大小,因为它允许你重用已部署到区块链的代码。
  • 遵循 ERC-2535, Diamonds, Multi-Facet Proxy 此智能合约系统由 @mudgen 引入,是一个彻底的改变。 它可以有效地让你创建可以在部署后扩展的模块化智能合约系统,从而大大有助于优化合约大小。
  • 使用较小的数据类型: 尽可能使用较小的数据类型,例如 uint8、uint16 和 uint32,而不是 uint256。
  • 应首选较短的错误消息: require 语句中的长错误消息会使字节码大小膨胀。 考虑使用更短、更简洁的错误消息。
  • 使用自定义错误: 如果你使用的是 0.8.4 或更高版本的 solidity,则最好使用自定义错误替换错误消息。 这些可以显着帮助减小合约大小,因为它们被 ABI 编码为选择器。 在此处阅读更多相关信息
  • 删除不必要的函数和变量: 删除智能合约正常运行不需要的任何函数或变量。
  • 优化代码逻辑: 优化代码逻辑以减少执行智能合约所需的指令数量。
  • 用私有函数替换修饰符: 过度使用 solidity 智能合约中的修饰符实际上会增加合约大小。 但是,用私有函数替换修饰符实际上可以帮助减小合约大小。

好奇为什么会这样吗? 在此处阅读更多相关信息 👇


用于检查智能合约大小的工具

现在你已经知道字节码大小限制是一回事了,你肯定需要一些工具来帮助在智能合约开发期间跟踪此限制。

幸运的是,我们确实有各种工具来在开发期间监控他们的智能合约字节码大小,例如:

  • hardhat-contract-sizer - 提供有关 hardhat 项目中合约大小的详细信息和警告
  • truffle-contract-size - 以千字节为单位显示所有或部分智能合约的合约大小。
  • solc:提供内置的字节码大小检查器

你们有了,各位开发者。

尝试使用这些技巧,永远不要担心达到智能合约字节码大小的阈值。

如果你有更多技巧,请提出你的建议 😉。

本系列的后续部分 👇

Solidity ABI 编码的深度思维模型:第 1 部分\ Solidity ABI 编码的深度思维模型:第 1 部分为什么要学习 Solidity 的难点 [ABI 编码系列:第 0 部分]\ 为什么要学习 Solidity 的难点 [ABI 编码系列:第 0 部分] \ \ Solidity 很容易。\ \ 它是一种简单而美丽的语言。\ \ 随着优秀的教育资源、课程、开发工具和 LLM 的兴起,学习和编写 Solidity 从未如此简单。\ \ 但事实是——如果每个人都很容易上手,那就是我在 SUI-Move 中的第一个迷你项目 - 第 2 部分\ 我在 SUI-Move 中的第一个迷你项目 - 第 2 部分我对 Move 智能合约的初体验 - 第 1 部分\ 我对 Move 智能合约的初体验 - 第 1 部分 \ \ 我最近尝试了一种新的智能合约语言 MOVE。\ \ 该语言的灵感来自 Rust,因此对于 Solidity 开发者来说并不直观。\ \ 但是,用它构建东西超级有趣。\ \ 在本系列文章中,我旨在介绍 Move 语言及其功能。

  • 原文链接: decipherclub.com/beware-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
decipherclub
decipherclub
江湖只有他的大名,没有他的介绍。