前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何缩减合约以规避合约大小限制

如何缩减合约以规避合约大小限制

作者头像
Tiny熊
发布2021-08-06 11:02:45
2K0
发布2021-08-06 11:02:45
举报

  • 译文出自:登链翻译计划[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]插件。

  1. npm install truffle-contract-size
  2. truffle-config.js中添加该插件:插件。[truffle-contract-size]
  3. 运行truffle run contract-size

这将帮助你弄清楚怎么的变化及如何影响总的合约打下规模。

在下文中,我们将根据其潜在的影响来研究一些方法。从缩减角度来考虑。对于一个人来说,要达到他们的目标体重(在我们的例子中是 24kb),最好的策略是首先关注影响大的方法。在大多数情况下,仅仅固定你的饮食就能达到目标,但有时你需要更多一点。如可能会增加一些运动(中等影响)或甚至补充剂(小影响)。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么合约有一个大小限制?
  • 那就战斗吧
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档