首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何缩减合约以规避合约大小限制

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

作者头像
Tiny熊
发布于 2021-08-06 03:02:45
发布于 2021-08-06 03:02:45
2.2K0
举报

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
借助 Solidity 来识别智能合约的调配模式
由于所有已部署合约都有 24KB 的硬限制,所以除了少数极其简单的应用程序外,其他所有的 Ethereum 应用都是由多个智能合约组成的。
区块链大本营
2020/09/10
9440
借助 Solidity 来识别智能合约的调配模式
max code size exceeded
大概意思是智能合约字节码的大小超过了24576字节, 尝试将合约部署到以太坊主网时可能会出现问题。这个限制是在Spurious Dragon硬分叉时引入的,因为以太坊节点处理和存储合约的方式需要有此限制。
终有链响
2024/07/29
1710
max code size exceeded
Solidity、Geth、EVM 三者之间的关系
在以太坊开发生态系统中,Solidity 版本、Geth 版本 和 EVM(Ethereum Virtual Machine)版本 之间有密切的关系。理解它们的关系对于智能合约开发、部署和执行至关重要。以下是对这些版本关系的详细介绍:
孟斯特
2024/10/12
3340
Solidity、Geth、EVM 三者之间的关系
【解读】以太坊上海升级即将激活的四个EIP
以太坊巴黎升级(合并,共识转POS)之后又一重大更新即将到来——上海升级!目前有着上千专业开发者的以太坊核心社区,从15年走来已经历经15次主网升级,而这一次上海升级将为链上锁定着的230亿美金的POS质押ETH提供解锁能力,还伴随有对GAS优化的诸多EIP融入。
十四君
2023/02/20
1.1K0
【解读】以太坊上海升级即将激活的四个EIP
常见的 EVM 版本以及它们的区别
EVM(以太坊虚拟机)版本的演进是为了引入新的特性和改进以太坊平台的安全性、效率和功能性。每个版本通常伴随着以太坊网络的硬分叉,这是以太坊协议的重大升级。以下是一些常见的EVM版本及其主要区别:
终有链响
2024/07/29
2360
常见的 EVM 版本以及它们的区别
在公共测试网上部署智能合约
欢迎阅读又一篇关于以太坊编程基础的文章。在之前的文章中,我们已经知道了开发去中心化应用程序的流程和基本工具,在这篇文章中,我们将讨论怎样在公共测试网上部署 dapp,我也会为大家介绍一些有帮助的以太坊开发者资源。
Tiny熊
2022/02/22
9010
solidity智能合约字节数最大值及缩减字节数
在Solidity中,EIP 170将contract的最大大小限制为24 KB 。因此,如果智能合约内容过多,会导致无法进行发布操作。
程序新视界
2019/08/14
1.6K0
以太坊主网部署终极指南
我们都喜欢以太坊,所以你已经创建了一些出色的智能合约。它们通过单元测试和测试网进行了密集的测试。现在终于到了上主网的时候了。但这是一个棘手的事情...
Tiny熊
2021/05/11
2.1K0
以太坊主网部署终极指南
区块链智能合约的开发架构
区块链智能合约的开发架构通常指的是构建、测试、部署和维护智能合约所涉及的流程、工具和最佳实践。以下是一个典型的智能合约开发架构概览。
数字孪生开发者
2025/04/10
2590
区块链智能合约的开发架构
【精解】开发一个智能合约
智能合约 这两天被老大搞去搬砖,学习计划有变但无大碍,这篇文章将仔细分析智能合约相关内容。 关键字:智能合约,remix,Solidity,truffle,geth,leveldb,datadir,ganache,web3j 合约 合约也称合同、协议,是甲乙双方参与的,制定一系列条目规范双方权利与义务的文件。智能合约是电子化的,自动执行的,去中心化的,具有不可抵赖性,本质上它是一段代码,依托于区块链技术,它可以做很多事情,基于以太坊的智能合约可以让你的区块链扩展出任何你想要的功能。 我相信,智
文彬
2018/05/03
3.1K0
【精解】开发一个智能合约
一睹更快更强的Ganache 7
Ganache 是以太坊开发领域的先驱,自 2016 年以来帮助 DApp 开发者和爱好者构建、测试和探索区块链。我们很高兴地宣布最新版本的 Ganache 发布了,分叉(fork)性能提高了 30 倍,并与 Infura 整合,允许你免费访问存档数据,重放历史交易。
Tiny熊
2022/02/22
1.3K0
一睹更快更强的Ganache 7
智能合约Gas 优化的几个技术
每次交易被发送到区块链上,必须支付 Gas 费用。消耗的 Gas 与交易所需的计算量有关,即:EVM 执行交易所需的计算量(如果交易不涉及 EVM,例如简单的以太币转账,Gas 的数量是固定的)。
Tiny熊
2022/11/07
1.4K0
智能合约Gas 优化的几个技术
深入了解Foundry配置文件
Foundry 作为 Solidity 开发的瑞士军刀,其配置文件 foundry.toml 是开发者实现高效工作流的核心枢纽。本文将从基础配置到高级优化,介绍 50+ 关键参数的配置逻辑,帮助我们更好地构建智能合约开发体系。
孟斯特
2025/02/05
2460
深入了解Foundry配置文件
Solidity 智能合约开发 - 基础
去年读研的时候上的 HKU 的 <COMP7408 Distributed Ledger and Blockchain Technology>,课程中学习了以太坊智能合约的开发,做了一个简单的图书管理 ÐApp,然后毕业设计也选择了基于 Ethereum 做了一个音乐版权应用,详见 Uright - 区块链音乐版权管理ÐApp,对 Solidity 开发有一些基础了解。
pseudoyu
2023/04/11
8400
Solidity 智能合约开发 - 基础
以太坊智能合约安全开发建议
请求不可信的合约时可能会引入一些意外风险或错误。在调用外部合约时,外部合约或其依赖的其它合约中可能存在恶意代码。因此,每个外部合约的请求都应该被认为是有风险的。如必须请求外部合约,请参考本节中的建议以最大程度的减小风险。
Tiny熊
2020/12/29
1.2K0
用Vyper实现智能合约 - 一种 Python 方法
很多学习智能合约的程序员都会学 Solidity 语言,网上有大量关于 Solidity 的在线教程和书籍。而 Solidity 与 Truffle 框架的结合,简直就是开发智能合约的杀手级组合。几乎以太坊区块链上所有的的智能合约都是用 Solidity 编写的。
Tiny熊
2022/05/25
1K0
用Vyper实现智能合约 - 一种 Python 方法
XCTF高校战“疫”区块链Writeup + 合约逆向题技巧分享
由于疫情学校还没开学,于是这几天一直在家里学(mo)习(yu)。前几天正好XCTF在办高校战“疫”,校内拉人打,所以就去打了一波。比赛两天,一天摸了一道题,总算也是有了点输出。第一天上来摸得Misc比较常规就不说了,主要来说一下第二天摸得区块链题吧。这是我第一次见到区块链合约的题目,此前完全不知道还有这种题目(是我不刷题,我自裁)。然后就花了一天时间从头学,把这题拿了下来。做题中遇到了很多坑,也积累了一些一般WP里没有提到的经验,所以我就自己写一篇文章来记录下这些细节。
KAAAsS
2022/01/14
9080
XCTF高校战“疫”区块链Writeup + 合约逆向题技巧分享
手把手实践一个DAPP,通往Web3.0之路!
导语 | 目前Web3.0的发展正在越来越火热,关于Web3.0的文章也层出不穷。本人在调研的时候阅读了很多文章,但很多概念还是有点模糊,因此自己实践并总结了一番,才有了比较深的理解。文章主要对web3.0进行一个整体的介绍,包括Web3.0相关基础概念以及动手实践了一个DAPP,实践出真理,鼓励大家都可以尝试一番~ 一、简介 (一)web的发展史 Web 1.0静态时代:网站只是带有文本和图像的静态页面,只能阅读文本,其他的事情都不能做。 Web 2.0大数据时代:用户可以和网络进行交互,包括发帖子、留言
腾讯云开发者
2022/07/19
1.2K0
手把手实践一个DAPP,通往Web3.0之路!
从零编出一个区块链:在以太坊发布一个智能合约
区块链技术一大特点就是去中心化,由此衍生出一种基于区块链技术的云平台,在这些平台上你可以发布并执行自己的代码。与传统云计算平台例如亚马逊,阿里云不同的是,你在以太坊发布的代码不会存储在某一台主机上,不能像运行在阿里云,腾讯云那样的平台上的程序那样,你能把代码托管到一个具体对象,然后还能针对性的调试和修改,在以太坊发布代码后,二进制代码会存储在无数个独立的主机上,因此代码一旦发布就很难修改,如果你要对代码中的某些数据进行改动,那么以太坊需要广播给网络里面所有主机,由于数据修改非常麻烦,因此你发布的代码想要做变更时,你需要支付一定的代价。
望月从良
2022/03/28
4370
从零编出一个区块链:在以太坊发布一个智能合约
创建并部署ERC20代币
第一个标准由 Fabian Vogelsteller 于 2015 年 11 月以 ethereum request for Comments(ERC)引入,它被自动分配到 GitHub 第 20 个议题,所以叫“ERC20 代币”。目前绝大多数代币都基于 ERC20 标准。ERC20 后来变成了以太坊改进提案 20(EIP-20),但是大部分仍然使用它最初的名字,ERC20。
Tiny熊
2022/04/08
1.5K0
创建并部署ERC20代币
相关推荐
借助 Solidity 来识别智能合约的调配模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档