译文出自:登链翻译计划 [1]
译者:翻译小组 [2]
校对:Tiny 熊 [3]
本文永久链接:learnblockchain.cn/article…[4]
为什么合约有一个大小限制?
为什么
在 2016 年 11 月 22 日 [5],Spurious Dragon 硬分叉引入了 EIP-170[6],增加了智能合约的大小限制为 24.576kb。对于作为 Solidity 开发者的你来说,这意味着当你向你的合约添加越来越多的功能时,在某些时候你会达到限制,当部署时你会看到错误:
Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on mainnet. Consider enabling the optimizer (with a low "runs" value!), turning off revert strings, or using libraries.
警告:合约代码大小超过 24576 字节(Spurious Dragon 分叉中引入的限制),这个合约可能无法在主网上部署。考虑启用优化器,关闭 revert 字符串,或使用库。
引入这一限制是为了防止拒绝服务(DOS)攻击。任何对合约的调用从 Gas 上来说都是相对便宜的。然而,由于调用的合约代码的大小(从磁盘读取代码,预处理代码,添加数据到 Merkle 证明)的原因,合约调用对以太坊节点的影响并不是成比例地增加。每当你出现这样的情况,攻击者只需要很少的资源就能给别人造成大量的工作,这会增加 DOS 攻击的可能性。
最初,这不是一个问题,因为一个合约大小限制是区块块 Gas 限制。很明显,一个合约需要被部署在一个交易中,这个交易持有合约的所有字节码。如果你把大合约的部署交易纳入一个区块,你可以用完所有的 Gas。但这种情况下的问题是,区块 Gas 限制随时间变化,理论上是无限制的。在 EIP-170 的时候,区块 Gas 的限制只有 470 万。现在,区块 Gas 限制是 1500 万。
那就战斗吧
不幸的是,没有简单的方法来获得你的合约的字节码大小,如果你使用 Truffle,一个很好的工具可以帮助你,那就是 truffle-contract-size[7] 插件。
-
npm install truffle-contract-size
。 -
在_truffle-config.js_中添加该插件:
插件。[
truffle-contract-size]
。 -
运行
truffle run contract-size
。
这将帮助你弄清楚怎么的变化及如何影响总的合约打下规模。
在下文中,我们将根据其潜在的影响来研究一些方法。从缩减角度来考虑。对于一个人来说,要达到他们的目标体重(在我们的例子中是 24kb),最好的策略是首先关注影响大的方法。在大多数情况下,仅仅固定你的饮食就能达到目标,但有时你需要更多一点。如可能会增加一些运动(中等影响)或甚至补充剂(小影响)。
体重减轻