本文介绍了智能合约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 开发者的你意味着什么?
两件事:
如果你尝试部署一个合约大小超过 24.576 KB 的极其庞大的合约,你可能会得到以下结果 👇
因此,学习优化技术至关重要,这样智能合约才能在不破坏预期功能的情况下保持在 24.576 KB 的大小限制内。
嗯,这说起来容易做起来难,因为我们可能需要大型合约来实现我们的预期用例
但是,通过充分了解优化合约字节码大小的知识,我们可以编写智能合约来满足我们的需求,而不会超过字节码阈值。
在这个简短的文章系列中,我们将主要学习两件事:
一如既往,这将会非常有趣。 😀
让我们探讨一些在编写 solidity 代码时要记住的字节码大小优化技巧:
好奇为什么会这样吗? 在此处阅读更多相关信息 👇
现在你已经知道字节码大小限制是一回事了,你肯定需要一些工具来帮助在智能合约开发期间跟踪此限制。
幸运的是,我们确实有各种工具来在开发期间监控他们的智能合约字节码大小,例如:
hardhat-contract-sizer
- 提供有关 hardhat 项目中合约大小的详细信息和警告truffle-contract-size
- 以千字节为单位显示所有或部分智能合约的合约大小。solc
:提供内置的字节码大小检查器你们有了,各位开发者。
尝试使用这些技巧,永远不要担心达到智能合约字节码大小的阈值。
如果你有更多技巧,请提出你的建议 😉。
\
Solidity ABI 编码的深度思维模型:第 1 部分
\
为什么要学习 Solidity 的难点 [ABI 编码系列:第 0 部分] \
\
Solidity 很容易。\
\
它是一种简单而美丽的语言。\
\
随着优秀的教育资源、课程、开发工具和 LLM 的兴起,学习和编写 Solidity 从未如此简单。\
\
但事实是——如果每个人都很容易上手,那就是
\
我在 SUI-Move 中的第一个迷你项目 - 第 2 部分
\
我对 Move 智能合约的初体验 - 第 1 部分 \
\
我最近尝试了一种新的智能合约语言 MOVE。\
\
该语言的灵感来自 Rust,因此对于 Solidity 开发者来说并不直观。\
\
但是,用它构建东西超级有趣。\
\
在本系列文章中,我旨在介绍 Move 语言及其功能。
- 原文链接: decipherclub.com/beware-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!